CSRF总结

Cross site request forgery 跨站请求伪造

主要原理:
利用浏览器保存了其他网站的cookie信息,在用户不知情的情况下,构造了请求。其利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服务器发送请求,从而完成非法操作(如转账、改密等)。CSRF与XSS最大的区别就在于,CSRF并没有盗取cookie而是直接利用

用户通过浏览器正常访问A网站,浏览器会保存cookie内容,而当用户去访问hack网站时,hack网站会在不可见的地方访问A网站的某个url,由于url可以被预测,而浏览器又保存有cookie内容,使得csrf攻击成功。

CSRF利用

配合点击劫持、拖拽劫持

恶意网站会伪造或在其表面添加一层透明层,通过图像,伪造验证码等信息,诱导用户完成支付、购买等功能。

配合xss

通过xss获取token值然后用csrf伪造身份。

常见防御方法

方法 特性
验证码 但很麻烦
GET改为 POST 攻击者可以伪造POST表单
通过REF字段判断 有些页面服务器获取不到REF,比如使用了代理
一次性CSRF token 通过加入不可预测的参数token,每次表单提交时都带上,由于不在cookie中,所以无法伪造

CSRF Token

  1. 服务器发送给客户端一个token。
  2. 客户端提交的表单中带着这个token。
  3. 如果这个token不合法,那么服务器拒绝这个请求。

核心思想是构造随机串放在非cookie字段,记为token,然后所有请求带上这个token值,这样可以防止CSRF攻击,原因是点击的URL只会附带上cookie字段而不会带上token字段,从而分辨是否为非法请求,但要注意的是,如果可以通过其他方法获取csrf token值并添加到恶意链接中,token的防御方式会失效。

一般流程如下:
在用户登录后,服务端会生成一个一次性的Token,一般这个Token会保存在服务端返回给用户的页面中的一个隐藏域里。每次用户向服务端发送操作请求时会附带上这个Token,服务端也会验证这个Token是否和分发给用户的Token一致,如果请求中不存在Token或Token不正确,即判定这个请求为非法请求。这个解决方案的原理就是利用了浏览器的同源策略,即第三方无法通过AJAX等方式获取到Token值。当然了,显而易见这个Token不具备时效性。我们可以使用一个临时的作用在父子页面之间的Cookie来代替Token。

所以,一般认为安全加密的CSRF tokens是防护CSRF的关键
确保CSRF token不能通过AJAX访问到! 不要创建一个/CSRF路由来获取一个token, 尤其不要在这个路由上支持CORS!