gpt4 book ai didi

ruby - 使用 Sinatra session 和 Rack::Session::EncryptedCookie 的 cookie 内容差异

转载 作者:数据小太阳 更新时间:2023-10-29 07:19:18 24 4
gpt4 key购买 nike

我正在学习 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 正在创建一个包含所有信息的如此大的 cookie 以及为什么需要它(尤其是那些 HTTP_... 部分?)因为 Rack::Session::EncryptedCookie 没有生成任何内容。

您是否认为应该首选使用 enable :sessions 因为它具有 csrf token 和 session ID?还是您认为 Rack::Session::EncryptedCookie 已经加密就足够了?

我安装了以下版本的 gems :

encrypted_cookie (0.0.4)
rack (1.5.2)
rack_csrf (2.4.0)
sinatra (1.4.3)
thin (1.5.1)

如果您需要更多信息,请告诉我...

最佳答案

因为 Sinatra 将使用 rack-protection启用 :sessions 时的中间件。它使 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? 如果启用 :sessions 则返回 true
  • session_store 默认为 Rack::Session::Cookie

Rack::Session::EncryptedCookie的区别

也就是说,如果您想将 Rack::Session::EncryptedCookierack-production 一起使用,可以通过以下方式轻松完成:

enable :sessions
set :session_store, Rack::Session::EncryptedCookie

仅供引用,自 encrypted_cookie缺少一些功能( secret 轮换、自定义序列化程序等)并且不再维护,我做了 another one替换它。

希望对您有所帮助。

关于ruby - 使用 Sinatra session 和 Rack::Session::EncryptedCookie 的 cookie 内容差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17357887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com