2012-02-20 18 views
8

Railsのクッキーに少量のデータ(10文字未満)を保存する必要があります。私は誰もそのデータを読んだり、自分のデータを挿入したりすることはできません(これは、さまざまな種類の攻撃に対してこのアプリケーションを開くためです)。私はクッキーの内容を暗号化することが(私はそれに署名する必要がありますか?)行く方法だと思います。それを行う最善の方法は何ですか?Railsで暗号化されたCookieを保存する

今私はこれをやっていますが安全ですが、多くのことがセキュリティよりもはるかによく知っていて、実際には安全ではないことが分かった人々にとって安全です。

私はこのように秘密にして保存しています:

encryptor = ActiveSupport::MessageEncryptor.new(Example::Application.config.secret_token) 
cookies[:secret] = { 
    :value => encryptor.encrypt(secret), 
    :domain => "example.com", 
    :secure => !(Rails.env.test? || Rails.env.development?) 
} 

をして、私はこのようにそれを読んでいる:

encryptor = ActiveSupport::MessageEncryptor.new(Example::Application.config.secret_token) 
secret = encryptor.decrypt(cookies[:secret]) 

は、安全ですか?それを行うより良い方法はありますか?

更新:私はRailsのセッションについて知っているとどのようにそれがクッキーを署名することにより、任意のセッションのサーバ側のコンテンツを保存し、私はそれが何のためにあるのかのセッションを使用して行うことで、両方の、安全です。しかし、ここで私の質問は、私はセッションに欲しくない情報の一部であるクッキーを保存することですが、私はまだそれが安全であることが必要です。

+0

なぜ、サーバーサイドではなくクッキーに格納する必要があるのですか?定義上より安全です。 – Russell

+0

@russellまあ、ブラウザに何かを保存する必要がありますよね?さもなければ、それをもう一度特定することはできません。それが実際のデータであろうとテーブル上のレコードのIDであろうと、それはデータのサイズやその他の考慮事項に関する好みと必要性の問題です。私が保存しているのは、すでにテーブルのレコードのIDです。私は別のテーブルを作ることができましたが、この場合は無駄に思えます。 – Pablo

+0

DBを使用するようにデフォルトのセッションストアを変更すると、テーブルなどの作成に関するオーバーヘッドがほとんどなく、必要なセキュリティが得られると思うので、答えを追加しました。 – Russell

答えて

0

私はJacobMの回答を再投稿しています。正解で正しい方向に私を指摘してくれたので、削除しました。彼が削除を取り消すと、私はこれを削除し、彼を最高の答えとして選ぶでしょう。

まず第一に、あなたがencrypt_and_verify代わりのencryptを使用している場合、それは あなたのためのクッキーを署名します。

しかし、セキュリティに関しては、私自身が自分のものを使うのではなく、公に審査された のソリューションに常に頼っています。 例はencrypted-cookies gemです。

+0

なぜ署名されたクッキーを使用しないのですか?(Rails 3.xではデフォルトでサポートされています) –

+1

@KandadaBoggu encrypt_and_verifyまたは暗号化クッキーのgem(1.0以降)で処理されたクッキーは署名されていますが、このデータが公開されるのであれば、それほど深刻なことではありませんが、私はそれについて考えず、暗号化されて安全に保たれるので、ユーザーに不透明です。 – Pablo

+0

それは意味があります.. –

13
  • cookies.signed[:secret] # returns "foo bar" 
    

はクッキーがActionController::Base.cookie_verifier_secretを使用して署名されたクッキーにアクセスするセキュアなクッキーに

cookies.signed[:secret] = { 
:value => "foo bar", 
:domain => "example.com", 
:secure => !(Rails.env.test? || Rails.env.development?) 
} 
  • を設定します。イニシャライザファイルにcookie_verifier_secretを設定することができます。

  • +0

    私はセッションを使いたくありません。私のセッションはドメイン(blah.example.com)ごとにあり、このデータはシステム全体(.example.com)のためのものであり、したがって設定時にはドメインオプションです。 – Pablo

    +0

    答えが一新されました。 –

    +0

    .signedで設定されたクッキーは.signedでアクセスする必要があります。したがって、2番目のコードブロックは 'cookies.signed [:secret]'でなければなりません。 –

    1

    KandadaBogguによると、セッション変数が必要なように見え、セッション変数はデフォルトで暗号化されてCookieに保存されています。あなたがconfig/initializers/session_store.rbの内容を見ている場合は、次のようなものがあります:

    あなたが「shouldnのセッションのためのデータベースの代わりに、クッキーベースのデフォルト値を、使用する必要があることを私に示唆
    # Be sure to restart your server when you modify this file. 
    MyRailsApp::Application.config.session_store :cookie_store, :key => '_my_rails_app_session' 
    
    # Use the database for sessions instead of the cookie-based default, 
    # which shouldn't be used to store highly confidential information 
    # (create the session table with "rails generate session_migration") 
    # MyRailsApp::Application.config.session_store :active_record_store 
    

    機密性の高い情報を保管するために使用されます。あらかじめ調理されたマイグレーションにより、すべての設定が非常に簡単になり、オーバーヘッドがほとんどなくなります。後で新しい秘密情報を追加する必要がある場合は、基本的にゼロのオーバーヘッドがあります。

    +0

    私はセッションを使いたくありません。私のセッションはドメイン(blah.example.com)ごとにあり、このデータはシステム全体(.example.com)のためのものであり、したがって設定時にはドメインオプションです。 – Pablo

    関連する問題