<form action="http://localhost:8000/somt/path" method="POST">
<input name="name" type="text">
<input type="text" name="csrf_token">
<input type="submit">
</form>
这样的话,是不是只有有一个从网站上获取的 cstf_token 就能随时用? 不管获取 token 时用户的登陆状态?
通过这次提问获得的答案:
CSRF Token 为什么可以反复使用?
@seki 旧的用来提交也是正常的,比如你打开了两个同地址页面,然后就旧的页面就失效了,这不是很囧
@otakustay CSRF Token 可以单次有效,但没有什么特别收益,同时也可能造成一些混乱,因此 Session 期间有效是比较合适的一种做法
这也解释了为什么我一个 token 可以多次使用
CSRF Token 和用户状态有关吗?
无关,我登陆时获取的 Token 在注销后也能用,Token 和权限验证没关系。 但是换个浏览器就不能用了, Token 和 Session 有关。
CSRF Token 可以放在公开页面吗?
@otakustay 只要跨域读不到 CSRF 则 CSRF Token 就能起到作用,因此放在页面里没关系
我谷歌浏览器访问网站获取的 Token 在火狐中不能用,同理攻击者访问我的网站获取Token,用来替代用户的 Token 进行 Post 肯定也是没有的。
问题很傻,让各位见笑了。也很感激得到这么多朋友的解答。
1
feixchow 2016-06-30 16:09:50 +08:00 1
csrf_token 不应该是单次有效吗?
|
2
manhere 2016-06-30 16:10:34 +08:00 1
如果站外提交有效,说明你的 csrf_token 逻辑有问题。
|
3
xujif 2016-06-30 16:11:47 +08:00 1
csrf_token 是用来防止 xss 的,不是用来防止分析提交的。
|
4
justfindu 2016-06-30 16:11:55 +08:00 1
你这个情况不就是只能 post 一次么? 而且每次模拟 post 还需要再打开再来一次, 数据的话你后台肯定也会过滤检查的
完全不是问题吧 |
5
est 2016-06-30 16:47:39 +08:00 1
csrf token 是用来防止 csrf 的。谢谢。
|
6
chairuosen 2016-06-30 16:52:27 +08:00 1
随时用 ,用一次
|
7
nigelvon 2016-06-30 17:05:41 +08:00 1
所谓公开页面就是指不登录也能看到的页面吧,这样的话提交的时候并不需要理会用户的登录状态吧?这种 csrf 并没什么意义,别人后台可以很容易 get 到你的 token 。
|
8
virusdefender 2016-06-30 17:07:12 +08:00 1
csrf token 只要不能被跨域读取就好了
|
9
gulu OP @feixchow 在我这个测试中可以用很多次
@manhere 我用的 flask-wtf ,好像只要 post 的数据中带有从网站上获取的 csrf_toke, post 就能被接受。 @xujif 嗯这是我表述的问题。不过在我这个情况中,攻击者好像可以先自己访问我的首页,获取 csrf_token , 然后再诱导我的用户点击他伪装的链接,同时发送他刚才获取的 token , 我的网站不能识别出来。 @chairuosen 似乎每次刷新页面都会得到新的 token , 但是不知道为什么旧的还是可以用来提交。 |
10
gulu OP @nigelvon
@virusdefender 谢谢大家,我感觉可能是我测试的方法有问题。 我登陆后获取的 token , 在注销后也能用(临时取消了权限要求),而且能用很多次,但是只能在同一个浏览器中用,换个浏览器就会 400 错误。 |
11
seki 2016-06-30 17:36:15 +08:00 1
旧的用来提交也是正常的,比如你打开了两个同地址页面,然后就旧的页面就失效了,这不是很囧
你清一下 cookies 再试 |
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 就能起到作用,因此放在页面里没关系 |