|
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级别的,这样既安全也有比较好的用户体验。
这是我的个人观点。
若有缪误,敬请指出。谢谢。
|
|