本地开发环境
电脑 A 注册账号并登录,session 记录 user_id =1
清空数据库
电脑 B 注册账号并登录,session 记录 user_id = 1
此时,电脑 A 打开网站还是显示登录状态,但是显示是的电脑 B 注册的信息
这种虽然是在极端环境下才发生的,但是,但是。。。这样真的没问题吗?
你清了数据库 顺便把 secret_token 重置一下嘛
一般的设计 id 用自增量,B 注册的时候 id=2,而且不会清除数据库 你都能在清空数据库,这个时间显示不需要考虑安全的问题
#1 楼 @huobazi #2 楼 @ZombieCoder 既然是这样的话,那只要获取到用户登录后的 cookie,那随便在哪只有设置这个 cookie,就可以登录到用户账号了?
#3 楼 @kingwkb 这叫做 seesion 劫持
http://guides.rubyonrails.org/security.html#session-hijacking
#4 楼 @Rei 恩,因为 rails 把 session 保存在了 cookie 中,这样就没有 session 过期这么一说了?只要拿到一次 cookie,那不管用户改密码也好还是做什么都没用了?
cookie 的有效期是存在客户端可以修改的
#5 楼 @kingwkb 是的,4 楼链接给出了很多方案怎么提供安全性。
#4 楼 @Rei #6 楼 @kingwkb
好像 ruby-china 的 session 里面除了 user_id 还有一个 salt 之类的是么?这样也可以预防这个问题。
生产环境中不会清除数据库。 测试环境中不介意安全问题(数据库的生杀大权都在你手中,还有什么安全可担心的呢,嘿嘿)
#7 楼 @Rei 我的意思是用 cookie 存储 session,过期时间的问题,上面的解决方案好像是用数据库存 session 才能设置过期
#10 楼 @kingwkb cookie_store, 可以在 session 里面存一个过期时间,然后在 application_conroller.rb 给所有 action 加一个前置过滤器检查过期时间,过期就清空。
#11 楼 @Rei 过期时间存在 session 里面,session 又是在 cookie 里面,这样不是用户可以修改 cookie 然后又是永远都不能过期了?
#12 楼 @kingwkb session 带有签名,用户改不了。
恭喜 LZ,已经看到了 Web 的本质了,加油