Railsコントローラーでは、次のようにCookieを設定できます。
cookies[:foo] = "bar"
そして、「セキュア」(httpsのみ)フラグが次のようにオンになるように指定します。
cookies[:foo, :secure => true] = "bar"
:secure
デフォルトではfalseです。アプリケーション全体でデフォルトでCookieを保護するにはどうすればよいですか?
これはRails2.3.8にあります
Railsコントローラーでは、次のようにCookieを設定できます。
cookies[:foo] = "bar"
そして、「セキュア」(httpsのみ)フラグが次のようにオンになるように指定します。
cookies[:foo, :secure => true] = "bar"
:secure
デフォルトではfalseです。アプリケーション全体でデフォルトでCookieを保護するにはどうすればよいですか?
これはRails2.3.8にあります
ActionController
モンキーパッチ/の必要はなくActionDispatch
、force_ssl
副作用があります(たとえば、ELBの背後にある場合)。
安全なCookieを実現する最も簡単な方法は、以下を変更することconfig/initializers/session_store.rb
です。
MyApp::Application.config.session_store(
:cookie_store,
key: '_my_app_session',
secure: Rails.env.production?
)
rails 3.1以降、railsセキュリティガイドによると、次のように設定できますapplication.rb
。
config.force_ssl = true
これにより、Cookieはhttps経由でのみ送信されます(他のすべても想定しています)。
@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
どう思いますか?
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
これが同じのビデオチュートリアルです。
迅速で汚い解決策:アクションパック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
# session only available over HTTPS
ActionController::Base.session_options[:secure] = true
Rack-ssl-enforcergemを確認する必要があります。私はこれに対する明確な答えを探していました。それは、使用しているRailsのバージョンに関係なく問題を解決し、さらに非常に構成可能です。
上記の回答のいくつかで述べられているようにこれを行うことができます(ファイル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_headers
gemを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