5

Sinatra フレームワークの学習とログイン システムの開発を行っています。Cookie を使用する 2 つの方法に出会いました。

シンプルな 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"}

そのようなすべての情報を含む大きな Cookie を作成する理由enable :sessionsと、それが必要な理由 (特に HTTP_... の部分)Rack::Session::EncryptedCookieは、それを生成しないためです。

enable :sessionscsrfトークンとセッション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)

さらに情報が必要な場合は教えてください...

4

3 に答える 3

1

を有効にすると、シナトラは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_storeRack::Session::Cookieデフォルトでは

の違いRack::Session::EncryptedCookie

つまり、 を使用する場合は、次Rack::Session::EncryptedCookierack-production方法で簡単に実行できます。

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

参考までに、encrypted_cookieには一部の機能 (シークレット ローテーション、カスタム シリアライザーなど) がなく、メンテナンスも行われていないため、代わりに別のものを作成しました。

それが役に立てば幸い。

于 2016-12-05T20:23:41.270 に答える
0

Rack::Session::EncryptedCookieシークレットは少なくとも 16 ビット長である必要があるためです。README では、次のように OpenSSL を使用してシークレットを生成することを推奨しています。

ruby -ropenssl -e "puts OpenSSL::Random.random_bytes(16).inspect"

インスペクターを開くと、「rack.session」という名前の Cookie が表示され、その内容は難読化されています。

于 2013-06-28T17:47:07.633 に答える