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

CSRF Token 是不是最好不要写入公开页面?

  •  
  •   gulu · 2016-06-30 15:56:48 +08:00 · 4871 次点击
    这是一个创建于 2862 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 建站的时候我在首页写入了 csrf_token ;
    2. 在没登陆的时候进入首页查看网页源码获得 token ;
    3. 登陆网站;
    4. 本地新建一个 html :
    <form action="http://localhost:8000/somt/path" method="POST">
        <input name="name" type="text">
        <input type="text" name="csrf_token">
        <input type="submit">
        
    </form>
    
    
    1. 浏览器打开这个 html 文档, csrf_token 那一栏填入刚才获得的 token
    2. 提交 post ,通过了。

    这样的话,是不是只有有一个从网站上获取的 cstf_token 就能随时用? 不管获取 token 时用户的登陆状态?

    第 1 条附言  ·  2016-06-30 18:23:15 +08:00

    通过这次提问获得的答案:

    1. CSRF Token 为什么可以反复使用?
      @seki 旧的用来提交也是正常的,比如你打开了两个同地址页面,然后就旧的页面就失效了,这不是很囧
      @otakustay CSRF Token 可以单次有效,但没有什么特别收益,同时也可能造成一些混乱,因此 Session 期间有效是比较合适的一种做法
      这也解释了为什么我一个 token 可以多次使用

    2. CSRF Token 和用户状态有关吗?
      无关,我登陆时获取的 Token 在注销后也能用,Token 和权限验证没关系。 但是换个浏览器就不能用了, Token 和 Session 有关。

    3. CSRF Token 可以放在公开页面吗?
      @otakustay 只要跨域读不到 CSRF 则 CSRF Token 就能起到作用,因此放在页面里没关系
      我谷歌浏览器访问网站获取的 Token 在火狐中不能用,同理攻击者访问我的网站获取Token,用来替代用户的 Token 进行 Post 肯定也是没有的。

    问题很傻,让各位见笑了。也很感激得到这么多朋友的解答。

    13 条回复    2016-06-30 18:12:09 +08:00
    feixchow
        1
    feixchow  
       2016-06-30 16:09:50 +08:00   ❤️ 1
    csrf_token 不应该是单次有效吗?
    manhere
        2
    manhere  
       2016-06-30 16:10:34 +08:00   ❤️ 1
    如果站外提交有效,说明你的 csrf_token 逻辑有问题。
    xujif
        3
    xujif  
       2016-06-30 16:11:47 +08:00   ❤️ 1
    csrf_token 是用来防止 xss 的,不是用来防止分析提交的。
    justfindu
        4
    justfindu  
       2016-06-30 16:11:55 +08:00   ❤️ 1
    你这个情况不就是只能 post 一次么? 而且每次模拟 post 还需要再打开再来一次, 数据的话你后台肯定也会过滤检查的
    完全不是问题吧
    est
        5
    est  
       2016-06-30 16:47:39 +08:00   ❤️ 1
    csrf token 是用来防止 csrf 的。谢谢。
    chairuosen
        6
    chairuosen  
       2016-06-30 16:52:27 +08:00   ❤️ 1
    随时用 ,用一次
    nigelvon
        7
    nigelvon  
       2016-06-30 17:05:41 +08:00   ❤️ 1
    所谓公开页面就是指不登录也能看到的页面吧,这样的话提交的时候并不需要理会用户的登录状态吧?这种 csrf 并没什么意义,别人后台可以很容易 get 到你的 token 。
    virusdefender
        8
    virusdefender  
       2016-06-30 17:07:12 +08:00   ❤️ 1
    csrf token 只要不能被跨域读取就好了
    gulu
        9
    gulu  
    OP
       2016-06-30 17:13:42 +08:00
    @feixchow 在我这个测试中可以用很多次
    @manhere 我用的 flask-wtf ,好像只要 post 的数据中带有从网站上获取的 csrf_toke, post 就能被接受。
    @xujif 嗯这是我表述的问题。不过在我这个情况中,攻击者好像可以先自己访问我的首页,获取 csrf_token , 然后再诱导我的用户点击他伪装的链接,同时发送他刚才获取的 token , 我的网站不能识别出来。

    @chairuosen 似乎每次刷新页面都会得到新的 token , 但是不知道为什么旧的还是可以用来提交。
    gulu
        10
    gulu  
    OP
       2016-06-30 17:33:58 +08:00
    @nigelvon
    @virusdefender
    谢谢大家,我感觉可能是我测试的方法有问题。
    我登陆后获取的 token , 在注销后也能用(临时取消了权限要求),而且能用很多次,但是只能在同一个浏览器中用,换个浏览器就会 400 错误。
    seki
        11
    seki  
       2016-06-30 17:36:15 +08:00   ❤️ 1
    旧的用来提交也是正常的,比如你打开了两个同地址页面,然后就旧的页面就失效了,这不是很囧
    你清一下 cookies 再试
    otakustay
        12
    otakustay  
       2016-06-30 17:53:21 +08:00   ❤️ 1
    我看到楼上有一堆乱来的- -

    1. CSRF Token 用来防 CSRF ,和 XSS 没关系,你首先得知道 CSRF 是什么
    2. CSRF Token 可以单次有效,但没有什么特别收益,同时也可能造成一些混乱,因此 Session 期间有效是比较合适的一种做法
    3. 只要跨域读不到 CSRF 则 CSRF Token 就能起到作用,因此放在页面里没关系
    gulu
        13
    gulu  
    OP
       2016-06-30 18:12:09 +08:00
    @seki 谢谢!我理解旧的为什么可以提交了!

    @otakustay 我想送你十个感谢! 我已经没有任何疑问了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1748 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 00:34 · PVG 08:34 · LAX 17:34 · JFK 20:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.