2012-05-09 15 views
15

मैं डोमेन ए (hefty.burger.com) पर फ़ाइल अपलोड स्वीकार करने के लिए सिनात्रा और सीओआरएस का उपयोग कर रहा हूं। डोमेन बी (fizzbuzz.com) में एक ऐसा फॉर्म है जो एसिनात्रा और रैक संरक्षण सेटिंग

पर एक रूट पर एक फ़ाइल अपलोड करता है मेरे पास एक विकल्प मार्ग और एक पोस्ट रूट है, जिसे '/ अपलोडर' नाम दिया गया है।

options '/uploader' do 
    headers 'Access-Control-Allow-Origin' => 'http://fizz.buzz.com', 
    'Access-Control-Allow-Methods' => 'POST' 
    200 
end 

post '/uploader' do 
    ... 
    content_type :json 
    [{:mary => 'little lamb'}].to_json 
end 

विकल्पों पहली हिट हो जाता है ... और यह काम करता .. तो पोस्ट को हिट हो जाता है और देता है एक 403

मैं सुरक्षा अक्षम करते हैं, के बाद से काम करता है ... सुरक्षा किस तरह करते हैं सुरक्षा को बनाए रखने के लिए मुझे एक सूची से बाहर निकलने की जरूरत है, लेकिन इन पदों के माध्यम से अनुमति दें?

मुझे हाल ही में हीरोोकू पर लात मारने वाले नए रैक संरक्षण द्वारा जला दिया गया है और मुझे कुछ दुख हुआ है ... किसी के पास यहां क्या करना है इसके लिए कोई अच्छा संकेतक है? कारण मैं कहता हूं, अचानक मैं सत्र अपहरण के मुद्दों पर अलर्ट के साथ लॉग प्रविष्टियां देख रहा हूं (लगभग निश्चित रूप से चलने से अधिक कुछ नहीं> ऐप के लिए 1 Dyno)। मैं अपने Gemfile.lock में रैक-सुरक्षा (1.2.0) देखता हूं, भले ही मैंने कभी इसके लिए नहीं पूछा ... मेरे मैनिफेस्ट में कुछ इसके लिए बुला रहा है, इसलिए यह लोड हो गया है, लेकिन मेरे सिनात्रा ऐप में कुछ भी इसकी आवश्यकता नहीं है या इसे स्थापित करें।

+1

आप लॉगिंग सक्षम यह दिखाना चाहिए जो सुरक्षा जिम्मेदार था है, तो (यह पहले लकड़हारा प्रस्तावना के साथ) 'RemoteToken' से रोका हमले की तरह कुछ। – matt

+0

मैं रैक संरक्षण 1.5.3 पर यह देख रहा हूँ। यह रैक संरक्षण eb7e4c9a176d के साथ नहीं हुआ था। –

उत्तर

1

ऐसा इसलिए है क्योंकि आप अपने विकल्प मार्ग में वापस स्वीकृत विधियों को वापस नहीं कर रहे हैं?

एक प्रश्न here उस पर संदर्भित करता है जो अनुमति विधियों को वापस नोट करता है।

एक एक्सटेंशन here और मिडलवेयर here आपकी मदद कर सकता है।

+1

नहीं, मैं सही विकल्प निर्धारित कर रहा हूं। मैं स्पष्ट रूप से पोस्ट की अनुमति देता हूं और अभी तक पोस्ट 403 प्रतिबंधित है। मुझे यकीन नहीं है कि रैक सुरक्षा का कौन सा हिस्सा उस पर नियंत्रण कर रहा है। दस्तावेज़ बिल्कुल स्पष्ट नहीं हैं और इसमें कॉरस से संबंधित कुछ भी शामिल नहीं है। –

+1

डेविड, मैं कल रात अंतरिक्ष में रहा होगा। सिवाय =>: json_csrf' आप की स्थापना, 'उपयोग रैक :: संरक्षण, कोशिश कर सकते हैं? किसी ने रैक :: सुरक्षा के Git रेपो [रैक :: संरक्षण और CORS के बारे में] (https://github.com/rkh/rack-protection/issues/14) पर एक मुद्दा भी है। – al3xnull

3

मुझे अनुमान लगाएं, आप क्रोम ऐप 'देव HTTP क्लाइंट' के साथ परीक्षण कर रहे हैं? बजाय इस प्रयास करें:

curl -v -X POST http://fizz.buzz.com/uploader 

रैक सुरक्षा मॉड्यूल से: "समर्थित ब्राउज़र :: गूगल क्रोम 2, Safari 4 और बाद में"

यह काम करना चाहिए:

class App < Sinatra::Base 
    ... 
    enable :protection 
    use Rack::Protection, except: :http_origin 
    use Rack::Protection::HttpOrigin, origin_whitelist: ["chrome-extension://aejoelaoggembcahagimdiliamlcdmfm", "http://fizz.buzz.com"] 

    post '/uploader' do 
    headers \ 
     'Allow' => 'POST', 
     'Access-Control-Allow-Origin' => 'http://fizz.buzz.com' 
    body "it work's !" 
    end 

आप शायद क्रोम-एक्सटेंशन के बारे में आश्चर्यचकित करें: // aejoelaoggembcahagimdiliamlcdmfm? ठीक है, जब आप क्रोम ऐप के साथ POST अनुरोध भेजते हैं तो रैक सुरक्षा env ['HTTP_ORIGIN'] के रूप में होती है।

+1

एक नया सिनात्रा ऐप्लिकेशन में मैं 'उपयोग रैक :: संरक्षण :: HttpOrigin, origin_whitelist बदलना पड़ा: [" क्रोम एक्सटेंशन: // aejoelaoggembcahagimdiliamlcdmfm "," http://fizz.buzz.com "]' करने के लिए 'सेट: संरक्षण, origin_whitelist: [ 'क्रोम एक्सटेंशन: // aejoelaoggembcahagimdiliamlcdmfm']' –

17

अपने सिनात्रा अनुप्रयोग में इस का उपयोग करते हुए अपनी समस्या को हल करना चाहिए:

set :protection, :except => [:json_csrf] 

एक बेहतर समाधान 1.4 सिनात्रा उन्नत करने के लिए है, जो रैक :: संरक्षण 1.5 का उपयोग करता है और the problem आप देख रहे हैं का कारण नहीं होना चाहिए हो सकता है।

समस्या यह है कि RackProtection::JsonCsrf का आपका संस्करण CORS के साथ असंगत है जब आप सामग्री-प्रकार: एप्लिकेशन/जेसन के साथ प्रतिक्रिया देते हैं।

def call(env) 
    status, headers, body = app.call(env) 
    if headers['Content-Type'].to_s.split(';', 2).first =~ /^\s*application\/json\s*$/ 
    if referrer(env) != Request.new(env).host 
     result = react(env) 
     warn env, "attack prevented by #{self.class}" 
    end 
    end 
    result or [status, headers, body] 
end 

आप इस अनुरोध रेफ़रलकर्ता सर्वर के रूप में एक ही मेजबान से नहीं है, एक application/json प्रतिक्रिया है को खारिज कर दिया देख सकते हैं: यहाँ रैक संरक्षण में old json_csrf.rb से एक टुकड़ा है।

यह समस्या रैक संरक्षण, जो अब मानता है कि क्या अनुरोध एक XMLHttpRequest है के बाद के संस्करण में हल किया गया था:

def has_vector?(request, headers) 
    return false if request.xhr? 
    return false unless headers['Content-Type'].to_s.split(';', 2).first =~ /^\s*application\/json\s*$/ 
    origin(request.env).nil? and referrer(request.env) != request.host 
    end 

आप सिनात्रा 1.3.2 का उपयोग कर रहे हैं और अपग्रेड नहीं कर सकते समाधान निष्क्रिय करने के लिए है, तो यह विशेष सुरक्षा। सीओआरएस के साथ आप स्पष्ट रूप से क्रॉस-डोमेन एक्सएचआर अनुरोध सक्षम कर रहे हैं। सिनात्रा आपको पूरी तरह से सुरक्षा को अक्षम करने देता है, या Rack::Protection के विशिष्ट घटकों को अक्षम करता है (सिनात्रा दस्तावेज़ों में "Configuring Attack Protection" देखें)।

Rack::Protection12 middleware components प्रदान करता है कि मदद हार आम हमलों:

  • Rack::Protection::AuthenticityToken
  • Rack::Protection::EscapedParams
  • Rack::Protection::FormToken
  • Rack::Protection::FrameOptions
  • Rack::Protection::HttpOrigin
  • Rack::Protection::IPSpoofing
  • Rack::Protection::JsonCsrf
  • Rack::Protection::PathTraversal
  • Rack::Protection::RemoteReferrer
  • Rack::Protection::RemoteToken
  • Rack::Protection::SessionHijacking
  • Rack::Protection::XssHeader

लेखन के समय, सभी लेकिन इनमें से चार स्वचालित रूप से लोड कर रहे हैं जब आप रैक का उपयोग :: सुरक्षा मिडलवेयर (Rack::Protection::AuthenticityToken, Rack::Protection::FormToken, Rack::Protection::RemoteReferrer, और Rack::Protection::EscapedParams स्पष्ट रूप से जोड़ा जाना चाहिए)।

सिनात्रा रैक :: सुरक्षा की डिफ़ॉल्ट सेटिंग्स one exception के साथ उपयोग करता है: यदि आप सत्र सक्षम करते हैं तो यह केवल SessionHijacking और RemoteToken जोड़ता है।

और, अंत में, यदि आप सीनाट्रा के साथ सीओआरएस का उपयोग करने की कोशिश कर रहे हैं, तो आप rack-cors का प्रयास कर सकते हैं, जो आपके लिए बहुत सारी जानकारी का ख्याल रखता है।

+0

लेकिन जो फ़ाइल में आपको लगता है कि लाइन रख सकता हूं? भ्रामक। – AKWF

2

यदि आपको यह समस्या दिखाई देती है, तो आप CORS (क्रॉस-मूल संसाधन साझाकरण) का उपयोग नहीं कर रहे हैं, और एक रिवर्स-प्रॉक्सी (जैसे nginx या apache) के पीछे हैं, सुनिश्चित करें कि आपकी रिवर्स-प्रॉक्सी अलग नहीं हो रही है host शीर्षलेख और इसे स्थानीयहोस्ट के साथ बदलना।

उदाहरण के लिए, nginx में आप proxy_set_header उपयोग करने की आवश्यकता:

location/{ 
    proxy_pass http://localhost:9296; 
    proxy_set_header Host $host; 
} 

जब हैडर एक अनुरोध से बाहर छीन लिया है, रैक :: संरक्षण यह एक CSRF हमले होने के लिए विश्वास रखता है।

+0

आपका पोस्ट मेरी वास्तुकला के लिए एक दस्ताना की तरह था, लेकिन जोड़ने 'proxy_set_header होस्ट $ मेजबान;' मेरी nginx config करने के लिए, इसे हल नहीं किया। – bonafernando