用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2147|回复: 1
收起左侧

[讨论/交流] 关于CSRF的一些疑问。

[复制链接]
发表于 2012-3-4 19:11:17 | 显示全部楼层 |阅读模式
CSRF简单说就是会话劫持的一种,或者说叫做会话窃取(个人取的名字).

就是第三方站点劫持当前用户的会话,提交一些破坏性的操作。

他的产生是因为会话的检测是基于浏览器的,而不是基于页面的。

而CI为了解决这个问题,在页面中增加了一个隐藏域。用来和会话中的值进行比对。

而且CI在这个隐藏域填的值在一定时间内,无论访问哪个页面都是一样的. 超过了一定的时间,有新的页面打开的话,这个值会重新生成。

表面上看,CI在用户体验和安全方面有了很好的平衡。

实际上会造成用户不友好的体验。
具体如下:
1)
如果配置的csrf的过期时间是300秒, 那么如果用户打开第二个页面是在第298秒打开的,然后在第305秒提交的,那么第二个页面的提交将认为是非法的。

为什么会这样?因为csrf的过期是个时间点而不是时间段。

比较好的做法是,如果第二个页面打开时发现csrf过期的时间已经不足30秒。那么重新生成心的csrf.
但是这样增加了系统的负担。

2)由于CI是用会话值和 页面的post值进行比较,是1对多的关系。当同时打开的页面比较多的时候,很容易产生csrf校验错误。

改进建议,用两个隐藏域,一个是明码,一个是暗码,暗码=encode(明码,key),  把key存在会话当中(key是个随机值,不同的会话采用不同的key)。

由于key对于这个会话是一直不变的,而明码和暗码都是page级别的,这样既安全也有比较好的用户体验。


这是我的个人观点。
若有缪误,敬请指出。谢谢。




发表于 2012-3-5 06:04:52 | 显示全部楼层
{:soso_e142:}

本版积分规则