什么是跨站请求伪造CSRF

CSRF 英文全称是 Cross-site request forgery,所以又称为“跨站请求伪造”,是指恶意诱导用户打开被精心构造的网站,在该网站中,利用用户的登录状态发起的跨站请求。简单来讲,CSRF 就是利用了用户的登录状态,并通过被精心构造的网站利用用户正常网站的会话状态来做用户不知情的事情。

典型场景

爱豆打援群号召给偶像打钱捐款

第一步:应援群:

代码语言:javascript
复制
 群主:  请各位粉丝支持爱豆一下,​为他投票吧 ​www.danger.com​​,
 放一张爱豆照片/为了我们爱豆请帮我们点一下下方广告

代码语言:javascript
复制
图片上加上了伪造的超链接,如 <img src=http://www.​ ​ bank​​.com/transfer?to=应援群主&money=100>

一旦点了超链接 ,发现钱少了,一查记录给了群主,群里声讨,被认定为黑粉,被踢出了群聊,芭比kill了。

如何防御

  1. get改post
  2. cookie设置为http-only,secure:lax、strict
  3. 增加refer、hosthttp请求头校验
  4. 增加后端生成的token校验(csrf的token)在ng中相应配置

-----------------------------------

代码语言:javascript
复制
#前提需要在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;
}