39

Railsコントローラーでは、次のようにCookieを設定できます。

cookies[:foo] = "bar"

そして、「セキュア」(httpsのみ)フラグが次のようにオンになるように指定します。

cookies[:foo, :secure => true] = "bar"

:secureデフォルトではfalseです。アプリケーション全体でデフォルトでCookieを保護するにはどうすればよいですか?

これはRails2.3.8にあります

4

8 に答える 8

48

ActionControllerモンキーパッチ/の必要はなくActionDispatchforce_ssl副作用があります(たとえば、ELBの背後にある場合)。

安全なCookieを実現する最も簡単な方法は、以下を変更することconfig/initializers/session_store.rbです。

MyApp::Application.config.session_store( 
  :cookie_store, 
  key: '_my_app_session',
  secure: Rails.env.production?
)
于 2015-07-06T20:33:56.307 に答える
19

rails 3.1以降、railsセキュリティガイドによると、次のように設定できますapplication.rb

config.force_ssl = true

これにより、Cookieはhttps経由でのみ送信されます(他のすべても想定しています)。

于 2013-09-21T11:20:51.410 に答える
4

@knxに感謝します、あなたは私を正しい道に送りました。これが私が思いついたモンキーパッチです。これは機能しているようです。

class ActionController::Response
  def set_cookie_with_security(key, value)
    value = { :value => value } if Hash != value.class
    value[:secure] = true
    set_cookie_without_security(key, value)
  end
  alias_method_chain :set_cookie, :security
end

どう思いますか?

于 2010-09-23T18:09:26.103 に答える
2

SSLを強制し、Ruby on Railsアプリケーション全体でセキュアCookieを有効にするには、production.rbなどの環境ファイルでforce_sslを有効にします。

# config/environments/production.rb
config.force_ssl = true

Ruby on RailsアプリケーションでHTTPおよびHTTPSトラフィックをサポートする必要がある場合は、セッションCookieがHTTPS経由でのみ送信されるようにアプリケーションのセキュアCookieフラグを設定します。

その結果、HTTPを介してセッション状態を維持できなくなりますが、少なくともセッションハイジャック攻撃から身を守ることができます。

# config/initializers/session_store.rb
# set secure: true, optionally only do this for certain Rails environments (e.g., Staging / Production
Rails.application.config.session_store :cookie_store, key: '_testapp_session', secure: true

これが同じのビデオチュートリアルです

于 2019-01-02T12:08:58.580 に答える
1

迅速で汚い解決策:アクションパックCookieモジュール(actionpack / lib / action_controller /cookies.rb)の[]=メソッドを変更することで可能だと思います

から:

    def []=(name, options)
      if options.is_a?(Hash)
        options = options.inject({}) { |options, pair| options[pair.first.to_s] = pair.last; options }
        options["name"] = name.to_s
      else
        options = { "name" => name.to_s, "value" => options }
      end

      set_cookie(options)
    end

に:

    def []=(name, options)
      if options.is_a?(Hash)
        options.merge!({:secure => true})
        options = options.inject({}) { |options, pair| options[pair.first.to_s] = pair.last; options }
        options["name"] = name.to_s
      else
        options = { "name" => name.to_s, "value" => options }
      end

      set_cookie(options)
    end
于 2010-09-23T00:28:04.417 に答える
1
# session only available over HTTPS
ActionController::Base.session_options[:secure] = true
于 2013-11-20T04:01:25.153 に答える
0

Rack-ssl-enforcergemを確認する必要があります。私はこれに対する明確な答えを探していました。それは、使用しているRailsのバージョンに関係なく問題を解決し、さらに非常に構成可能です。

于 2016-06-17T20:42:07.910 に答える
0

上記の回答のいくつかで述べられているようにこれを行うことができます(ファイルsecureのオプションを使用してconfig/initializers/session_store.rbください):

MyApp::Application.config.session_store :cookie_store, key: '_my_app_session',
                                                       secure: Rails.env.production?

これはセッションCookieのみを保護しますが、他のCookieは保護されません。

RailsアプリのすべてのCookieをデフォルトで保護する場合は、 secure_headersgemを使用できます。secure_headersgemをGemfile、gemに追加し、次のコンテンツを含むファイルをbundle install作成するだけです。config/initializers/secure_headers.rb

SecureHeaders::Configuration.default do |config|
  config.cookies = {
    secure: true, # mark all cookies as "Secure"
  }
end

これにより、デフォルトでRailsアプリのすべてのCookieが安全になります。

これらの推奨構成を追加し、httponlyおよびsamesiteオプションを設定することもできます。

SecureHeaders::Configuration.default do |config|
  config.cookies = {
    secure: true, # mark all cookies as "Secure"
    httponly: true, # mark all cookies as "HttpOnly"
    samesite: {
      lax: true # mark all cookies as SameSite=lax
    }
  }
end
于 2020-08-07T05:21:03.583 に答える