页面几乎都是Ajax操作,如何更新CSRF Token

2013-09-17 10:09:03 +08:00
 liubin
用的是CodeIgniter,不过这个问题应该跟CI无关 :-P

页面几乎不刷新,更新的内容很多,几乎没有Form元素。。。

如果启用CSRF Token的话,需要在Ajax处理中同时传递Token信息。

页面render时写个Token到页面倒还好说,如果一个Ajax请求提交后,

后续的Ajax请求怎么办?

现在的想法是:

每个Ajax请求返回结果都同时给一个新的Token回来,保存到页面上。

我的问题是感觉这样可能的工作量比较大,还有更好的方法么?
29165 次点击
所在节点    PHP
8 条回复
hanhui
2013-09-17 10:21:59 +08:00
可以去看看微博、QQ、其他开源软件怎么做。
据我了解,Discuz、腾讯微博都是没有每次请求更换token的,而是每个登录session初始化一个token。腾讯微博的算法稍微复杂点,从cookie传过来,然会js解密换算后,通过url传递回去的;discuz通过forum filed提交。其实微博貌似都没用csrf token,简单看了下。

个人感觉通过session就够了。没有绝对的安全。
luikore
2013-09-17 10:24:55 +08:00
不用更新, 用页面上那个就可以了. csrf token 只有一种目的: 防止跨站提交.
如果别人能截取到你提交的 token, 那他也能截取每次的返回结果, 已经是超出 csrf 的范围的问题了, 更新了也没用.
luikore
2013-09-17 10:28:15 +08:00
@hanhui 那个 auth token 和 csrf token 是两回事
hanhui
2013-09-17 10:54:49 +08:00
@luikore 我没让作者去看oauth部分。不过oauth获取code过程中也有防止csrf的字符串。我是让楼主去参考腾讯微博的csrf token设计。
roricon
2013-09-17 12:06:04 +08:00
以jQuery为例,你ajax请求时多返回一条token的值,之后在callback函数里面用js更改token相关的HTML DOM.
6711411
2013-09-17 18:06:01 +08:00
token 怎么会更新? session 没变, token 也不会变.
fanzc
2013-09-17 18:34:32 +08:00
可以参考Angularjs的实现方式,头部信息里添加X-XSRF-TOKEN,

具体参考[链接](http://docs.angularjs.org/api/ng.$http)
breeswish
2013-09-17 21:36:45 +08:00
csrf-token的目的是,让攻击者不能伪造请求(如通过img发起的请求会带上cookie)。因此,csrf-token不需要每个请求都改变,只需要确保对于每个session不一致即可,同一个session内不变没有问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/82751

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX