我正在学习Sinatra框架&开发登录系统。我遇到过两种使用cookie的方式。
简单的Sinatra内置方式:
enable :sessions
set :session_secret, 'random-key'
此方法在登录时生成以下cookie内容(使用session.inspect
获取输出):
{"session_id"=>"6be0b9a31831604ba51114d265ba952482e0b2da6ced6c54e15ebe7f212858ca",
"tracking"=>{"HTTP_USER_AGENT"=>"b8c1e8f89eeaea0b825bed0d811f0c7678e98c74",
"HTTP_ACCEPT_ENCODING"=>"a0bfc876d68fe7aea700da5ea8925abac6f2f794",
"HTTP_ACCEPT_LANGUAGE"=>"dd065ed263c67d799f943ab6c39b55c5e008cbb5"},
"csrf"=>"b480324f510e4f391d15cee8236a8fb74a5aaa5ce2f9ad38e4dbb025a823b16e",
"name"=>"john"}
另一种方法是使用加密的cookie:
require 'sinatra'
require 'encrypted_cookie'
use Rack::Session::EncryptedCookie, :secret => "random-key"
但是这种方法在登录时会产生以下cookie内容(在这里使用session.inspect
):
{:name=>"john"}
为什么enable :sessions
正在制作包含所有相关信息的大饼干。为什么需要它(特别是那些HTTP _...部分?)因为Rack::Session::EncryptedCookie
没有生成任何部分。
您是否认为使用enable :sessions
应该是首选,因为它有csrf令牌&会话ID?或者您认为Rack::Session::EncryptedCookie
已经足够加密了吗?
我安装了以下版本的gem:
encrypted_cookie (0.0.4)
rack (1.5.2)
rack_csrf (2.4.0)
sinatra (1.4.3)
thin (1.5.1)
如果您需要更多信息,请告诉我......
答案 0 :(得分:1)
因为当您启用:sessions
时,Sinatra将使用rack-protection
中间件。它使cookie更大但更安全。
相关摘要:
def setup_default_middleware(builder)
builder.use ExtendedRack
builder.use ShowExceptions if show_exceptions?
builder.use Rack::MethodOverride if method_override?
builder.use Rack::Head
setup_logging builder
setup_sessions builder
setup_protection builder
end
def setup_sessions(builder)
return unless sessions?
options = {}
options[:secret] = session_secret if session_secret?
options.merge! sessions.to_hash if sessions.respond_to? :to_hash
builder.use session_store, options
end
def setup_protection(builder)
return unless protection?
options = Hash === protection ? protection.dup : {}
options = {
img_src: "'self' data:",
font_src: "'self'"
}.merge options
protect_session = options.fetch(:session) { sessions? }
options[:without_session] = !protect_session
options[:reaction] ||= :drop_session
builder.use Rack::Protection, options
end
sessions?
将返回true
session_store
默认为Rack::Session::Cookie
Rack::Session::EncryptedCookie
也就是说,如果您想将Rack::Session::EncryptedCookie
与rack-production
一起使用,可以通过以下方式轻松完成:
enable :sessions
set :session_store, Rack::Session::EncryptedCookie
仅供参考,因为encrypted_cookie缺少某些功能(秘密轮换,自定义序列化程序等)并且不再需要维护,我让another one替换它。
希望它有所帮助。
答案 1 :(得分:0)
因为Rack::Session::EncryptedCookie
要求您的秘密长度至少为16位。在自述文件中,他们建议使用OpenSSL生成密钥,如下所示:
ruby -ropenssl -e "puts OpenSSL::Random.random_bytes(16).inspect"
如果您打开检查员,您将看到一个名为“rack.session”的cookie,其内容会被混淆。
答案 2 :(得分:0)
据我所知,在Sinatra中使用Rack :: Session :: Cookie,并将session_secret写为环境变量时,创建的会话在项目部署后不会销毁。我认为这是单页应用程序中存在的风险。