背景知识:
SOP-同源安全策略(限制一些跨源访问)
SOP未限制的方法:使用HTML tag嵌入资源,img script link等,或者使用form提交请求到外部站点
HTTP的一些了解:
1.有些http请求会携带cookie,但受SOP限制,cookie不能跨站访问。
2.HTTP跨站请求时,只是浏览器限制了请求的响应,但请求会成功。
CSFR:跨站请求伪造
依靠SOP未限制的方法和HTTP请求的特殊现象,伪造的请求动作。
伪造目的:借用用户的身份去执行用户的操作。
GET请求举例:
www.bank.com是个用户群很广的银行网站
黑客在某论坛帖子下发表评论中使用图片,图片地址为:http://www.bank.com/zhuanzhang.php?money=1000&to=骗子
论坛的用户浏览这个帖子,页面会就发起请求,请求地址:http://www.bank.com?money=1000&to=骗子
携带的参数有:
1.URL上的money和to(假设表示转账金额和收款账户)
2.用户在www.bank.com中的cookie(若用户刚刚访问过https://www.bank.com,则浏览器还保留着未过期的cookie,其中可能包含用于执行交易的认证信息)
若www.bank.com不做任何防护,只通过URL参数或cookie中的信息认证用户身份。
那服务器就会执行这次请求。!!即使因SOP限制,未将执行结果响应给该论坛。
POST请求举例:
黑客在自己的站点页面(www.forgBank.com)中编写了一段form表单并用js提交表单。
通过广告等方式引诱用户访问。
<form id="myForm" action="http://www.bank.com" method="POST">
<input name="money" value='1000' />
<input name="to" value='骗子' />
</form>
<script>
document.getElementById('myForm').submit();
</script>
相比get,需要在自己的页面编写代码,并引诱用户访问,增加了暴露风险。
所以限制接口请求类型为POST能填补一些CSRF漏洞。
CSRF防御:
1.敏感操作限制POST请求,降低风险。
2.Anti CSRF Token(业界常用方法):使用token验证
服务器生成认证用户的token,保存并返回给客户端。
客户端发送请求时携带token(传参或header)。
服务器校验token有效性,有效则继续执行。
3.校验referer
referer是http请求头属性,表示请求的来源
后端可以获取并判断拦截
可用于防止图片盗链
客户端不能用js篡改,但用一些插件如fiddler可以伪造
4.CORS预检请求
服务器配置CORS访问权限 当请求为预检请求时(复杂的header或application/json请求),会先发送权限请求(options),该请求只会返回结果,并不会执行任何操作,客户端获取权限后再次请求。这样会在options请求后拦截一些跨站伪造请求。
5.敏感操作使用验证码,如支付 登录等,缺点:对用户不友好
参考文档:
浏览器的同源策略
同源策略和CSRF
CSRF攻击与防御(写得非常好)
安全|常见的Web攻击手段之CSRF攻击