2010-09-22 15 views
26

एक रेल नियंत्रक में, मैं इस तरह एक कुकी सेट कर सकता हूं:मैं रेल में डिफ़ॉल्ट रूप से कुकीज़ को सुरक्षित (https-only) कैसे बना सकता हूं?

cookies[:foo] = "bar" 

और निर्दिष्ट करें कि "सुरक्षित" (https-only) ध्वज इस तरह से हो सकता है:

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

:secure झूठा है चूक। डिफ़ॉल्ट रूप से, एप्लिकेशन-व्यापी से कुकीज़ कैसे सुरक्षित हो सकती हैं?

यह रेल पर है 2.3.8

उत्तर

4

धन्यवाद @knx, तुम मुझे क्या करना भेजा सही रास्ता wn। यहां क्लिक किया गया बंदरगाह है, जो काम करता प्रतीत होता है:

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

जॉन, जहां रेल ऐप में हम उपरोक्त वर्ग रखते हैं? शुरुआती – Rafael

+2

। धन्यवाद। एक और बात, मैं अपने देव env - webrick का उपयोग - जब मैं सुरक्षित ध्वज पर्यावरण में सच में सेट। आरबी मैं अपनी लॉगिन स्क्रीन पारित नहीं कर सकता - मैंने देखा कि प्रतिक्रिया में ऐप से सेट कुकी है। कोई विचार क्या हो सकता है? –

+0

महान में – Rafael

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 

इस बलों कुकी केवल पर भेजा जा करने के लिए https (और मैं भी सब कुछ मान,)।

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

यह रेल 4 में एक नई सुविधा है? –

+0

मुझे नहीं पता। हालांकि, रेल 4 में यह काम करता है। आप इस संपत्ति को रेल के अपने संस्करण में भी देख सकते हैं। – alsotang

+0

यह केवल सत्र कुकी के लिए है, है ना? सामान्य रूप से कुकीज़ के लिए नहीं? –

27

ActionController/ActionDispatch monkeypatch की कोई जरूरत नहीं है, और force_ssl दुष्प्रभाव न हो (उदा जब behind an ELB)।

सुरक्षित कुकीज़ प्राप्त करने के लिए सबसे सरल तरीका config/initializers/session_store.rb संशोधित करने के लिए है:

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

यह सही उत्तर है (सत्यापित है कि यह रेल 4.2.7.1 में काम करता है)। इसे आसानी से जांचने के लिए, 'सुरक्षित: सत्य' सेट करें और फिर आप सत्यापित कर सकते हैं कि कुकी सही ढंग से जेनरेट की गई है। फिर आप इसे वापस 'Rails.env.production' में बदल सकते हैं? – PlagueHammer

+0

ऐसा लगता है कि यह केवल सत्र कुकी को प्रभावित करेगा। पूछने वाले व्यक्ति ने सभी कुकीज़ के लिए डिफ़ॉल्ट के रूप में सुरक्षित अनुरोध किया। क्या @ डेविड-कैन सत्यापित कर सकता है कि क्या यह समाधान सभी कुकीज़ के लिए काम करता है? –

0

आप रैक ssl-एनफोर्सर मणि पर गौर करना चाहिए। मैं बस इसके लिए एक साफ जवाब ढूंढ रहा था और यह उस रेल के किस संस्करण से स्वतंत्र है, जिससे आप बेहद विन्यास योग्य हैं।

संबंधित मुद्दे

 संबंधित मुद्दे