【问题标题】:Cookie is changed on every request, using sinatra and Rack::Session::EncryptedCookie每次请求都会更改 Cookie,使用 sinatra 和 Rack::Session::Encrypted Cookie
【发布时间】:2013-06-27 19:58:58
【问题描述】:

我是网络应用程序开发的新手,刚刚开始学习 Sinatra 框架。我目前正在开发一个登录系统。 这是必要的代码:

require 'sinatra'
require 'openssl'
require 'encrypted_cookie'

configure do
  use Rack::Session::EncryptedCookie, :secret => "foo-bar-baz", :httponly => true

然后,如果他/她被授权,我会将用户名存储在会话中:

post '/' do
  if authorize(params[:name], params[:password], params[:csrfkey])
    session[:name] = params[:name]
  end
end

cookie 是加密的。它还可以记住会话值。

但是在使用 Firebug 时,我注意到在每次请求(页面加载、刷新等)时,cookie 的内容都会发生变化,我的意思是完全改变了。似乎 Sinatra 在每次请求时都会发送新的 cookie。

以前,我使用的是enable :sessions,而 cookie 从未改变过。

所以我的问题是,在会话期间每次请求都更改 cookie 的内容是否正常?

发生这种情况是因为它是加密的吗?

我在网上搜索了高低,但我猜没有人遇到这个问题..

【问题讨论】:

  • 是的,这很正常,实际上可以防止某些类型的会话劫持攻击,但我不知道Rack::Session::EncryptedCookie具体在做什么,所以无法提供详细的答案。
  • 哦,好的。我只是想知道为什么 cookie 的内容会发生变化,即使会话内容根本没有变化。感谢你的回复。 :-)

标签: ruby cookies sinatra session-cookies rack


【解决方案1】:

source for encrypted_cookie 表明它是generates different encrypted output every time it is called regardless of the input。这有两个原因:

  • 必须知道上次请求期间的会话值。它没有,它所做的只是接受一个输入,即给定的会话。如果您想规避这一点并只重写 cookie(我想),您可以,因为您可以在 Sinatra 应用程序中获得更多可用信息。
  • 更安全。它不会泄露信息(如果 cookie 没有改变,那么 cookie 的观察者就知道在请求期间没有任何变化),并且它给攻击者更少的时间来尝试获取到一个有意义的值。

【讨论】:

  • 谢谢你这么清楚的解释!我会支持答案,但现在没有足够的 repv。
  • @Rahul 没问题,很高兴我能帮上忙。
猜你喜欢
  • 2013-08-05
  • 2013-06-25
  • 2023-03-24
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 2013-09-06
  • 2016-03-06
相关资源
最近更新 更多