一,什么是跨站请求伪造浏览器
经过技术手段欺骗用户访问一个已经登陆/认证过的网站,并利用网站对用户的信任作操做(包含非网站认证者意愿操做)。服务器
他不是经过CSRF攻击直接去的帐户及密码,而是欺骗用户浏览器,让其以用户的名义运行操做cookie
例子:dom
假如一家银行用以运行转帐操做的URL地址以下: http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName网站
那么,一个恶意攻击者能够在另外一个网站上放置以下代码: <img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">spa
若是有帐户名为Alice的用户访问了恶意站点,而她以前刚访问过银行不久,登陆信息还没有过时,那么她就会损失1000资金。code
二,防护措施orm
1,少用GETblog
如上例子的GET方式极其容易被捕获网站信息及规律。token
2,添加校验token
用户浏览器提供不保存在cookie中,而且攻击者没法伪造的数据做为校验,那么攻击者就没法再运行CSRF攻击。
这种数据一般是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。
如:
import os CSRF_ENABLED = True SECRET_KET = os.urandom(24)
当客户端经过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器可以正确获得并传回这个伪随机数,而经过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会由于校验token的值为空或者错误,拒绝这个可疑请求。
这个Token的值必须是随机的,不可预测的。因为Token的存在,攻击者没法再构造一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽可能把敏感操做由GET改成POST,以form或AJAX形式提交,避免Token泄露。
3,加验证码
强制用户必须与应用进行交互,才能完成最终请求。在一般状况下,验证码能很好遏制CSRF攻击。