1

我是 Web 应用程序开发的新手,刚刚开始学习 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 的内容是否正常?

它发生是因为它是加密的吗?

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

4

1 回答 1

4

encrypted_cookie的源代码显示,无论输入如何,每次调用它都会生成不同的加密输出。这有两个原因:

  • 必须知道上次请求期间的会话值是什么。它没有,它所做的只是接受一个输入,即给定的会话。如果你想绕过这个并且只重写 cookie(我想)你可以,因为你可以在 Sinatra 应用程序中获得更多可用的额外信息。
  • 它更安全。它不会泄露信息(如果 cookie 没有改变,那么 cookie 的观察者就知道在请求期间没有发生任何变化),并且它给攻击者更少的时间来尝试获取有意义的值。
于 2013-06-28T00:35:45.450 回答