1

デフォルトでは、Rails はセッション情報に Cookie ストレージを使用します。私が従ったチュートリアルでは、それが最良の方法であり、超高速であり、すべてが暗号化されると述べています. しかし、Cookie コンテンツを base64 でデコードすると、そこにセッション情報が表示されます。色々と文字化けが混じっていますが、あります。

ここで何が欠けていますか?

Rails はそのシークレット トークンを使用して Cookie 内の情報を暗号化しませんか? どうすればそうすることができますか?

4

1 に答える 1

3

Rails はシークレット トークンを使用してセッションに署名します。生データはまだそこにありますが、それを変更すると署名と一致しなくなり、Rails はそれを拒否します。Cookie 文字列は のようsession_data--signatureになり、セッション データは base64 でエンコードされたマーシャリングされたオブジェクトであり、署名はHMAC(session string, secret token).

セッションデータの一般的な前提は、それが秘密ではないということです (一般に、CSRF トークンやユーザー ID などの少数のもののみを含む必要があるため) が、ユーザーが変更できないようにする必要があります。Cookie 署名はこれを実現します。

ユーザーがデータを見ることができないように実際にデータを暗号化する必要がある場合は、OpenSSL 対称暗号化などを使用するか、非 Cookie データ ストアに切り替えることができます。

これは、私自身のアプリの Cookie ストアの亜種です。私はそれをテストしていませんが、理論的には、実際に暗号化された Cookie が生成されるはずです。これは、デフォルトの Cookie ストアよりもかなり遅くなることに注意してください。ランタイムによっては、潜在的に DOS ベクターになる可能性があります。さらに、暗号化されたデータは暗号化されていないデータよりも長くなり、セッション Cookie には 4kb の制限があるため、セッションに大量のデータを保存している場合、その制限を超えてしまう可能性があります.

# Define our message encryptor
module ActiveSupport
  class EncryptedMessageVerifier < MessageVerifier
    def verify(message)
      Marshal.load cryptor.decrypt_and_verify(message)
    end

    def generate(value)
      cryptor.encrypt_and_sign Marshal.dump(value)
    end

    def cryptor
      ActiveSupport::MessageEncryptor.new(@secret)
    end
  end
end

# And then patch it into SignedCookieJar
class ActionDispatch::Cookies::SignedCookieJar
  def initialize(parent_jar, secret)
    ensure_secret_secure(secret)
    @parent_jar = parent_jar
    @verifier   = ActiveSupport::EncryptedMessageVerifier.new(secret)
  end
end
于 2012-11-30T21:02:38.380 に答える