全称是(Cross Site Request Forgery)跨站请求伪造。也就是恶意网站假装成用户向目标网站服务器发送请求,骗取服务器执行请求中的命令,直接在服务器改变数据值的一种攻击手段。javascript
用户须要获取操做的权限,目标网站服务器会要求一次验证,一般都是一次帐号密码登陆。服务器验证经过以后,会在浏览器写一个会话ID,来标识用户的身份。这是一种隐式验证的方法,用户只要验证一次获取到会话ID以后,在会话ID未过时的一段时间内的请求操做是不须要再次验证的。但服务器只能判断请求是来源于这个受权过的浏览器,而不能判断请求是不是用户发起或者是用户受权的。因此当用户浏览了恶意网站以后,恶意网站就能够给服务器发起带有命令的请求,尝试改变服务器中的数据值。java
CSRF的攻击对象也就是咱们要保护的对象。CSRF利用的是受权浏览器向目标网站服务器发送任何请求时,都会自动带上会话ID或者cookie进行身份验证。可是因为浏览器同源策略的限制,恶意网站没法看到目标网站的cookie或者回话ID,也没有办法解析返回的内容,因此恶意所能作的就是给服务器发送请求,以执行请求中所描述的命令,在服务器端直接改变数据的值,而非窃取服务器中的数据web
<script>
,<a>
,<img>
等,发起get请求<img src="http://www.target.com/order/pay?money=10000&to=34j34">
<iframe name="steal" style="display: none;"></iframe> <form method="post" action="http:www.xxxx.com/trading/product/addCartProduct" name="transfer" target="steal"> <input type="hidden" name="id" value="b21a59eaa7e604b44fe8a3bf"> <input type="hidden" name="money" value="1000"> <input type="submit" value="提交"> </form> window.onload=function(){ function steal() { var iframe = window.frames['steal'].document; var form = document.getElementsByTagName('form')[0]; form.submit(); } steal(); }
1. 涉及到数据更改的操做服务器严格使用post请求而不是get请求
2. 验证HTTP Referer 字段
根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。恶意网站只能在他本身的网站伪造请求,因此验证referer应该是能够过滤掉一部分CSRF攻击的。可是使用Rerferer值,就至关于把安全性交给了第三方,浏览器实现referer的方式不能保证没有漏洞。听说IE6是能够修改referer的值的。另外referer会记录下用户的访问来源,有些用户会以为是侵犯了其隐私,并且用户是能够设置使用浏览器时再也不提供referer的。(因此说这种方法虽然简单可是不可靠)
3. 在请求地址中添加token
CSRF 攻击之因此可以成功,是由于黑客能够彻底伪造用户的请求。服务器验证地址中加密的token,能够比较有效地避免攻击
4. HTTP头自定义属性验证
这个是token验证的变种,能够利用 XMLHttpRequest 这个类,一次性给ajax请求加上 特定的 HTTP 头属性,并把 token 值放入其中。
5 显式验证,添加验证码验证,密码验证等。
CSRF 攻击之因此可以成功,也是因为隐式验证,服务器没法判断请求真实地由用户发起和用户受权的。ajax
总的来讲,CSRF防护没有十全十美的方法,只有适合的方法。segmentfault
参考跨域
【相关】
web安全,是一个很重要的技能,也是一个领域的知识。我把这个领域的东西写成了一个系列,之后还会继续完善下去:
web安全一:同源策略与跨域
web安全二:CSRF 攻击
web安全三:XSS 攻击浏览器