CSRF 英文全称是 Cross-site request forgery,所以又称为“跨站请求伪造”,是指恶意诱导用户打开被精心构造的网站,在该网站中,利用用户的登录状态发起的跨站请求。简单来讲,CSRF 就是利用了用户的登录状态,并通过被精心构造的网站利用用户正常网站的会话状态来做用户不知情的事情。
典型场景
•爱豆打援$100 www.bank.com/transfer/to=aidou&money=100
•应援群:请各位粉丝登记一下,www.danger.com,
放一张爱豆照片/为了我们爱豆请帮我们点一下下方广告
<img src=http://www. bank.com/transfer?to=应援群主&money=100>
•发现钱少了,一查记录给了群主
•群里声讨,被认定为黑粉,被踢出了群聊
如何防御
•get改post
•cookie设置为http-only,secure:lax、strict
•增加后端生成的token校验(csrf的token)在ng中相应配置
#前提需要在http、server中开启header下划线支持 underscores_in_headers on;否则获取到的header会默认忽略下划线。
#参考:http://nginx.org/en/docs/http/ngx_http_core_module.html#underscores_in_headers
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|woff|woff2|fbx|json|ttf)$ {
#参数解析:$http_x_xsrf_token对应的请求中的header名为X-XSRF-TOKEN,在nginx中自定义header使用$http_开头,此处一律使用小写
if ($http_x_xsrf_token != ''){
return 404;
}
root /web/html;
}
•增加refer、hosthttp请求头校验