Rails Rails session 是否会带来验证码没有意义

huacnlee · 2012年04月23日 · 最后由 zhangyuan 回复于 2012年04月23日 · 6282 次阅读

今天才想到的,Rails 的 session 是写在 cookie 里面的,比如 Ruby China 的叫 _homeland_session 我们通常为了防止暴力提交内容或采集,或许可以在登陆和注册的时候加入验证码。 但是,实际上是可以模拟 cookie 来提交的,这样就可以跳过登陆了,验证码也不再有意义...

对付 cookies 劫持可以在 session 里面加上 ip

不对吧。session 是随机生成的。基本无法模拟的。如果你的 session 不存在,跳不过去的。如果你已经登录,当然可以继续用你的 session_id 了

session 是加密的

不管是在 cookie 里存储完成的 session 信息还是只存 session_id 都有这个问题。解决方法,要么就是每次操作都加验证码(这个就有点恶了),要么就是限制单位时间内的操作次数

#3 楼 @Los 基于 cookie 的 session 不是加密的,只是被签名过的,放伪造,另外加上了 HttpOnly,所以只能通过 http 协议访问,js 得不到。

可以把验证码加密后保存在 cookie 嘛,只要密钥没有泄漏。ActiveSupport 有个加密类的

或者加密验证码后放进 cookie。手机太难用了,点不上编辑按钮。。。。

#3 楼 @Los 不是加密,是签名,搜索下 HMAC 就知道了

另外 LZ 提的问题有道理,如果你把验证码的内容直接明文写在 session 中,那么攻击者只需要反 base64 一下就能看到验证码的内容了 我的做法是在数据库或者缓存中保存验证码,在 session 中不写验证码内容,而是数据库记录的 id,验证码用过一次,即删除记录

5 楼说的对,验证码可以采用银行模式生成一下....salt+ 验证码=图片文件名

我说的不是把验证码放那里,而是登录完了以后 user_id (表示已登录) 拿破解者在浏览器上面登录以后,直接把整个 _homeland_session 拿起作为 cookie 内容提交

哦,写道这里我想到了,没有这个隐患,session_id 是不同的,拿去也没用。

你们使用 Ruby-China 时,没有遇到过莫名其妙的被退出重新登录吗?我自己仿照的也偶尔会出现自动退出重新登录。

#10 楼 @ruby_sky 没有啊,我在这里登陆,半个月也不会掉的

#11 楼 @huacnlee 是在正常使用的时候,比如,我点击某一个链接操作时(已经登录),有时候会出现直接跳到登录页面让我重新 login。我昨天弄了一个小项目,做了一个删除功能时,这个 controller 加了 before_filter :require_user (devise),也是会这样,如果没有 before_filter,就一切正常。

#9 楼 @huacnlee 提醒下,现在 ruby-china 的 config/secret_token 文件还没从 git 中 checkout 出来,按理说应该部署时由管理员放置在 shared/config/secret_token 文件里。 这是很危险的

#13 楼 @clc3123 Ok,这个事情一直拖到现在还没处理

#5 楼 @zhangyuan #7 楼 @edokeh 刚刚验证了一下,果然如此,感谢!

已经将 Ruby China 的 secret_token 保护起来了。 大家得重新登陆一下了。

可以参考 redmine,把生成 secret_token.rb 从版本控制中去掉,然后写个 rake 任务来生成这个文件。在部署前执行这个命令。见 https://github.com/edavis10/redmine/blob/master/lib/tasks/initializers.rake

Redmine 是 2.3 的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号