简介

​ CSRF(Cross-Site Request Forgery),跨站请求伪造。看起来与 XSS 很像,但 XSS 是获取网站受信任用户的信息进行攻击,而 CSRF 并没有获取用户的身份信息,只是通过伪装成用户进行攻击。CSRF 攻击流程示例:

  • 受害者登录 a.com,并保留了登录凭证 Cookie

  • 攻击者引诱受害者访问了 b.com

  • b.com 向 a.com 发送了一个请求:a.com/act=xxx,浏览器会默认携带 a.com 的 Cookie

  • a.com 接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求

  • a.com 以受害者的名义执行了 act=xx

  • 攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让 a.com 执行了攻击者想要的操作

​ 注意,edge 浏览器限制了不同源网站不能传递 Cookie ,但 IE 没有这个问题。

分类

GET型

​ 类似 XSS:

1
2
3
4
5
6
7
8
9
<img src="http://example.com/act=xxx" style="display:none;"/>
//一般像这种在<body>里的,且利用src属性的元素,加上style="display:none;"会更好
<link href="…">
<iframe src="…">
<script src="…">
<video src="…">
<audio src="…">
<a href="…">
...

​ 有些情况下(如鼠标悬浮在链接上,或者用户查看了网页源代码),攻击者构造的 URL 会把攻击意图暴露给用户,这种情况可以用短网址进行伪装。

POST型

1
2
3
4
<form action="http://example.com/act=xxx" method="POST">
<input type="hidden" name="xxx" value="xxx"/>
</form>
<script>document.forms[0].submit();</script> //这行代码加不加都行,加了就是一个自动提交

修复

  1. 二次确认,使用验证码或需要重新输入密码。比如转账时要求用户重新输入密码,进行删除操作时要求用户输入验证码。这个方法可以完全解决 CSRF ,但是出于用户体验考虑,网站不能给所有的操作都加上二次确认。因此该方法只能作为一种辅助手段,不能作为主要解决方案。
  2. 验证 HTTP Referer 字段,该字段记录了此次 HTTP 请求的来源地址。