(一)增加攻击的难度。GET请求是很容易创建的,用户点击一个链接就可以发起GET类型的请求,而POST请求相对比较难,攻击者往往需要借助JavaScript才能实现;因此,确保form表单或者服务端接口只接受POST类型的提交请求,可以增加系统的安全性。
(二)对请求进行认证,确保该请求确实是用户本人填写表单或者发起请求并提交的,而不是第三者伪造的。
正常情况下一个用户提交表单的步骤如下:
1)用户点击链接→网站显示表单→用户填写信息并提交→网站接受用户的数据并保存
而一个CSRF攻击则不会走这条路线,而是直接伪造第二步网站显示表单从而提交用户信息
2)攻击者通常直接跳到第二步(网站显示表单)→伪造要修改的信息并提交→网站接受攻击者修改参数数据并保存
只要能够区分这两种情况,就能够预防CSRF攻击。那么如何区分呢? 就是对第二步中所提交的信息进行验证,确保数据源自第一步的表单。具体的验证过程如下:
3)、用户点击链接→网站显示表单,表单中包含特殊的token同时把token保存在session中→用户填写信息并提交,同时发回token信息到服务端→网站比对用户发回的token和session中的token应该一致,则接受数据并保存
这样,假如攻击者伪造了修改的信息并提交,是没办法直接访问到session的,所以也没办法拿到实际的token值;请求发送到服务端,服务端进行token校验的时候发现不一致则直接拒绝此次请求。