CSRF(跨站请求伪造)

参考资料:

  1. 🔺保护ASP.NET 应用免受 CSRF 攻击 - 张善友 - 博客园 (cnblogs.com)
  2. 前端安全系列(二):如何防止CSRF攻击? - 美团技术团队 (meituan.com)
  3. CSRF 攻击和防御 - Web 安全常识_哔哩哔哩_bilibili,
  4. SpringSecurity CSRF引发的思考Cookie、Session、Token和JWT_知难行难1985的博客-CSDN博客

是什么

CSRF是一种网络的攻击方式,攻击者可以使用该方式盗用你的身份,冒用你的cookie,对被攻击网站发起http请求,以你的名义进行转账等涉及个人财产和隐私安全的行为。

攻击原理及流程

csrf

流程如下

  • 受害者登录a.com,并保留了登录凭证(Cookie)。
  • 攻击者引诱受害者访问了b.com。
  • b.com 向 a.com 发送了一个请求:a.com/act=xx。浏览器会默认携带a.com的Cookie。
  • a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求。
  • a.com以受害者的名义执行了act=xx。
  • 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作。

疑问

疑问:浏览器对于 cookie 也是存在同源限制的,也就是与 cookie(domain)处于不同源的网站,浏览器是不会让该网站获取到这个 cookie。那为什么csrf攻击是可行的?

解答:原因是浏览器使用 cookie 的情况

除了跨域 XHR 请求情况下,浏览器在发起请求的时候会把符合要求的 cookie 自动带上。(域名,有效期,路径,secure 属性),跨域 XHR 的请求的情况下,也可以携带 Cookie。同时浏览器允许跨域提交表单。也就是说,向同一个服务器发请求时会自动带上浏览器保存的对于那个服务器的cookie,而不管你从哪个网站发请求。因为每次请求都会携带在http头上,也是造成带宽浪费的一个原因。但是读取cookie是读取不了的,攻击者没办法知道cookie的内容

防御方式

  1. 验证 HTTP Referer 字段
    • 它记录了该 HTTP 请求的来源地址
    • Referer 的值是由浏览器提供的,可以伪造
  2. 在请求地址(表单)中添加 token 并验证(Anti CSRF Token)
    • 使用 javascript 遍历整个 dom 树,对于 dom 中所有的 a 和 form 标签后加入 token
  3. 在 HTTP 头中自定义属性并验证
    • 将token放到 HTTP 头中自定义的属性里
    • 通过XMLHttpRequest 类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作
  4. 验证码验证