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
- 服务器发送给客户端一个token。
- 客户端提交的表单中带着这个token。
- 如果这个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
!