CSRF(Cross Site Request Forgery, 跨站域请求伪造) 是一种网络的攻击行为,它可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击站点,从而在并未授权的情况下执行在权限保护之下的操作。具体流程如下实例(from: http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html)
举个例子:比如有个银行网址A,对应的转账请求是transfer?to=***&money=***
1. A登录a.com网址
2. B给A发送了一个地址fake.com(里面包含了a.com/transfer?to=fakeAccount&money=1000)
3. A在未登出的情况下,访问了B发来的fake.com
4. 结果,A的账户里面少了1000,转给了fakeAccount账户
攻击的方式包括get和post请求。get请求可以通过引用静态资源发送,如<img src="a.com/888>"。post请求可以在伪造网站中放入action地址 为a.com的form表单,并在body 的onload事件中发起提交
防御方案
1. 添加Referer校验。从流程上看,正常发起的请求和假冒网址上发起的请求,对应的Refer是不一样的,可以使用这个进行校验。缺点:比如 IE6 或 FF2,目前已经有一些方法可以篡改 Referer 值。如果要支持低版本浏览器,该方法并不安全。
2. 所有请求添加token参数。用户登录的时候,后台session可以生成一个token,前端页面发起请求的时候,都要带token。缺点:所有涉及的请求都要被修改。另外,如果页面上的链接都被改成了a.com?token=***这种,那在在一些论坛之类的地方,如果黑客在网站上发布了一个地址,该地址可以获取Referer中的token值,进而发起攻击
3. 请求头部添加token。在使用xhr请求的时候,可以添加一个自定义头部,里面包含token的数据。缺点:如果原系统并不是xhr请求的话,修改工作量非常巨大。
参考:
1.https://www.ibm.com/developerworks/cn/web/1102_niugang_csrf/index.html
2.http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html