CSRF(Cross-Site Request Forgery) 跨站请求伪造
从一个网站 A 中发起一个到网站 B 的请求,而这个请求是经过了伪装的,伪装操作达到的目的就是让请求看起来像是从网站 B 中发起的,也就是说,让 B 网站所在的服务器端误以为该请求是从自己网站发起的,而不是从 A 网站发起的。当然,请求一般都是恶意的。
假设 B 网站是一个银行网站,提供一个负责转账的 HTTP 接口,例如:
http://www.b.com/transfer?amount=100&to=andy
将 100 块钱转给 andy。
正常情况下,用户在 B 网站上登录,然后进行转账操作,向这个 HTTP 接口发送请求。请求方和接收方都在同一个域,此时浏览器会将 Cookie 信息一起放在请求中,B 网站的服务端会根据 Cookie 信息进行用户的验证,认证通过后才会做出正确的响应,例如转账操作。
恶意情况下,某黑客网站 A 里放置了一些诱惑图片,代码为 [图片上传失败...(image-87f82e-1516932812538)]
,用户打开网站 A 时,会自动向 B 网站的转账接口发送请求(将 100 块钱转给 tom)。但此时请求方 A 和接收方 B 不在同一个域,Cookie 是不能跨域发送的,没有 Cookie 信息,服务器是拒绝访问的。安全状况!!!
不安全状况!!!:如果此时用户也恰好登录了 B 网站并且还没有退出,Cookie 已经产生了,浏览器一看请求的域名是 www.b.com
,便将存放在客户端的 B 网站的 Cookie 给顺带一起发了过去,这样,服务器就会误认为是同一个域访问,验证通过,进行了转换操作。
总结:
要完成一次CSRF攻击,受害者必须依次完成两个步骤:
- 登录受信任网站 B,并在本地生成 Cookie。
- 在不登出 B 的情况下,访问危险网站 A。
防御措施
检查 Referer 字段
HTTP 头中有一个 Referer 字段,表明实际来源于哪个地址。
添加检验 token
不是用 Cookie,而是在表单中增加一个 token,例如一个随机数,在后端校验这个 token。