我的页面中所有请求都是通过jquery的一个插件jquery.templateforms.js来实现的,全部使用$.post提交数据。目前有一个需求是需要能够防止CSRF攻击,在网上看来很多资料,一般有三种方式
1、http reference头判断请求是否来自本地域
2、使用一次性令牌token,每一个post请求都携带一个一次性token,后台进行校验
3、使用图片验证码第一种比较容易伪造,第二种是通用做法,第三种最安全。
但是由于页面是客户提供的,不能更改,所以我采用第2种方式来实现,在每一个$.post之前,我都先发出一个post请求去获取token,获取成功后,把token附带到要提交的数据中一起提交。获取token的post请求不需要用户登录就可以发起,因为登录的时候也要获取token,而这时候是未登录状态的。但是我这种做法不能防止CSRF攻击,因为当一个用户登录系统后,在浏览器种打开另外一个选项卡,也是登录状态,因为cookie种携带这session id,所以可以构造js脚本来发起获取token的请求,接着再post非法数据。但是这个时候后台检测不出来。
网上搜索了很多资料,我没有看明白token这个机制是如何防止CSRF攻击的?我如何做才能使web后台识别出获取token不是有本域发出的?因为WebServer是自己实现的,所以一切可行的方法都可以

解决方案 »

  1.   

    使用token防止CSRF,要保证token不会泄露,一般的做法是在内存中保存一个唯一的token,有提交操作的表单页面是使用CGI,PHP,JSP等生成的,保证只有你的页面才能通过内存取到这个token,这样跨站的网页是无法伪造的。
    按你说的,页面无法改到,就提供了一个接口给js来获取token,还不带登录态,就相当于这个token泄露了。不知道我说的清楚不,有疑问大家再讨论。