CSRF(Cross Site Request Forgeries)跨网站请求伪造,也叫XSRF,通过伪装来自受信任用户的请求来攻击利用受信任网站。
原理:
例:
- 用户打开浏览器,访问受信任银行网站,输入用户名和密码请求登录网站;
- 在用户信息通过验证后,银行网站产生Cookie信息并返回给浏览器,此时用户登录网站成功,可以正常发送请求到网站;
- 用户未退出银行网站之前,在同一浏览器中,打开一个TAB页访问其他网站B;
- 这时候网站B 已被黑客注入诱导信息,加入是一张图片,图片地址指向src=”http://bank.example/withdraw?account=bob&amount=1000000&for=黑客”,点击之后转账给黑客这个账户;
- 浏览器在接收到这些攻击性代码请求后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,根据用户的Cookie信息以C的权限处理该请求,导致来自黑客请求恶意代码被执行。
CSRF防范:
方法一、Token 验证:(用的最多)
- 服务器发送给客户端一个token
- 客户端提交的表单中带着这个token
- 如果这个 token 不合法,那么服务器拒绝这个请求
由于Token的存在,攻击者无法再构造一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽量把敏感操作由GET改为POST,以form或AJAX形式提交,避免Token泄露。
方法二:隐藏令牌:
把 token 隐藏在 http 的 head头中。该和方法一有点像,本质上没有太大区别,只是使用方式上有区别。
方法三、Referer 验证:
Referer 指的是页面请求来源。意思是,只接受本站的请求,服务器才做响应;如果不是,就拦截(有些低版本浏览器存在Referer被更改的风险,如IE6或FF2)。