2010-09-22 61 views

回答

4

感謝@knx,你給我做在正確的道路上。這裏是我想出的monkeypatch,這似乎是工作:

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 

你怎麼看?

+0

約翰,在Rails應用程序中,我們將類放在上面? – Rafael 2012-05-17 21:48:29

+2

在初始化器 – 2012-05-17 23:06:15

+0

很好。謝謝。還有一件事,我的開發env - 使用webrick - 當我在environment.rb中將安全標誌設置爲true時,我無法通過我的登錄屏幕 - 我注意到應用程序在響應中設置了cookie。任何想法可能會發生什麼? – Rafael 2012-05-18 14:11:41

1

快速和髒溶液:我認爲這是可以通過在動作包餅乾模塊修改[] =方法(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 
14

開始與軌3.1,根據the rails security guide,你可以簡單地設置在application.rb如下:

config.force_ssl = true 

這迫使只發送的cookie通過https(我假設一切,太)。

0
# session only available over HTTPS 
ActionController::Base.session_options[:secure] = true 
+0

這是軌道4中的一項新功能嗎? – 2013-11-20 21:34:50

+0

我不知道。但是,在Rails 4中它起作用。您也可以在您的Rails版本中查看此屬性。 – alsotang 2013-11-21 08:05:40

+0

這僅適用於會話cookie,對不對?一般來說不用於Cookie? – 2014-04-13 23:26:29

27

沒有必要給猴補丁ActionController/ActionDispatch,和force_ssl具有副作用(例如,當behind an ELB)。

的最直接的方式來實現安全cookie是修改config/initializers/session_store.rb

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

這是正確的答案(證實這可以在Rails 4.2.7.1中使用)。爲了方便測試,請設置'secure:true',然後您可以驗證cookie是否正確生成。然後,您可以將其更改回'Rails.env.production?' – PlagueHammer 2016-12-03 01:01:14

+0

,看起來這隻會影響會話Cookie。詢問的人要求安全,作爲所有cookie的默認值。 Can @ david-cain可以驗證該解決方案是否適用於所有Cookie? – 2017-09-15 17:48:20

0

你應該看看機架SSL的實施者寶石。我只是在尋找一個乾淨的答案,它解決了這個問題,無論你使用哪個版本的Rails,還有它是非常可配置的。

相關問題