V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liubin
V2EX  ›  PHP

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

  •  
  •   liubin · 2013-09-17 10:09:03 +08:00 · 29206 次点击
    这是一个创建于 4118 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用的是CodeIgniter,不过这个问题应该跟CI无关 :-P

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

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

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

    后续的Ajax请求怎么办?

    现在的想法是:

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

    我的问题是感觉这样可能的工作量比较大,还有更好的方法么?
    第 1 条附言  ·  2013-09-17 12:29:19 +08:00
    谢谢各位回复,看了下大家的意见,我想补充一下:

    CSRF Token 是基于session的,我通过Ajax提交一个POST后,这个Token就更新了,页面拿着的就是老的了,下一个Ajax POST请求应该会失败才对。

    我的需求是怎么才能“最方便”的更新页面内的Token

    如果每个Ajax的Web服务器处理在输出结果(Json)时同时附加一个新Token的值,页面收到后再更新老的Token,也不是不能接受,只是修改的量可能比较多,需要每个人都这么去改。

    不知道有没有更好的想法。
    8 条回复    1970-01-01 08:00:00 +08:00
    hanhui
        1
    hanhui  
       2013-09-17 10:21:59 +08:00
    可以去看看微博、QQ、其他开源软件怎么做。
    据我了解,Discuz、腾讯微博都是没有每次请求更换token的,而是每个登录session初始化一个token。腾讯微博的算法稍微复杂点,从cookie传过来,然会js解密换算后,通过url传递回去的;discuz通过forum filed提交。其实微博貌似都没用csrf token,简单看了下。

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

    具体参考[链接](http://docs.angularjs.org/api/ng.$http)
    breeswish
        8
    breeswish  
       2013-09-17 21:36:45 +08:00   ❤️ 1
    csrf-token的目的是,让攻击者不能伪造请求(如通过img发起的请求会带上cookie)。因此,csrf-token不需要每个请求都改变,只需要确保对于每个session不一致即可,同一个session内不变没有问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1120 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:04 · PVG 07:04 · LAX 15:04 · JFK 18:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.