2014-11-18 9 views
7

का कारण बनता है मेरे पास एक रेल ऐप है जो एक डॉकर कंटेनर में चलता है जिसे आईपी 172.17.0.3 असाइन किया जाता है। मेजबान मशीन 51.x.x.x को आने वाले अनुरोध 172.17.0.3 में रेल ऐप पर अग्रेषित किए जाते हैं। अधिक विशेष रूप से, इस तरह के रूप में किया गया था:डॉकर में पोर्ट-फॉरवर्डेड रेल ऐप सीएसआरएफ अपवाद

docker run -p 8080:8080 rails_app 

हालांकि, रेल एप्लिकेशन Can't verify CSRF token authenticity त्रुटि फेंकता है एक उपयोगकर्ता पृष्ठों में से कुछ का उपयोग करने की कोशिश करता है जब। मेरा संदेह यह है कि रेल सोचते हैं कि आने वाला अनुरोध एक हमला है, क्योंकि गंतव्य का आईपी रेल ऐप के आईपी से मेल नहीं खाता है - यानी उपयोगकर्ता अनुरोध होस्ट मशीन 51.x.x.x पर निर्देशित होते हैं, जबकि रेल वास्तविक स्थान 172.17.0.3

पर है

क्या रेलों को यह बताने का कोई तरीका है कि ये अनुरोध कानूनी हैं? एक अतिरिक्त जानकारी के रूप में, मैं प्रमाणीकरण के लिए devise का उपयोग करता हूं, और सर्वर के रूप में unicorn का उपयोग करता हूं।

आप में से कुछ protect_from_forgery with: :exception से :null_session बदलने का सुझाव देने के लिए प्रेरित हो सकते हैं, लेकिन प्रॉक्सी के पीछे नहीं रखा गया है, तो एप्लिकेशन ठीक काम करता है। इसके अलावा, कुछ तर्क तब काम नहीं करेंगे जब मैंने उस हिस्से को बदल दिया क्योंकि मुझे लगता है कि उपयोगकर्ता सत्र के तरीके से सेटिंग गड़बड़ हो जाती है।

(user from public network) ----> (proxy) ----> (rails app on a private network) 
     (202.x.x.x)   (51.x.x.x)    (172.x.x.x) 

संपादित करें: एप्लिकेशन development सेटिंग्स में है

यह मेरा नेटवर्क का लेआउट है। यह त्रुटि है जो मुझे log/development.log फ़ाइलों में मिली है।

Started POST "/register" for 202.x.x.x at 2014-11-18 02:27:11 +0000 
Processing by UsersController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"aBG3nIAKK1ALMJ1DDYFlMkmqISMBMZc3iLmaeD2byG8=", "user"=>{"email"=>"[email protected]", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}} 
Can't verify CSRF token authenticity 
Completed 422 Unprocessable Entity in 2ms 

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken): 
    actionpack (4.1.4) lib/action_controller/metal/request_forgery_protection.rb:176:in `handle_unverified_request' 
    actionpack (4.1.4) lib/action_controller/metal/request_forgery_protection.rb:202:in `handle_unverified_request' 
    devise (3.4.0) lib/devise/controllers/helpers.rb:251:in `handle_unverified_request' 
    actionpack (4.1.4) lib/action_controller/metal/request_forgery_protection.rb:197:in `verify_authenticity_token' 
    activesupport (4.1.4) lib/active_support/callbacks.rb:424:in `block in make_lambda' 
    activesupport (4.1.4) lib/active_support/callbacks.rb:160:in `call' 
    activesupport (4.1.4) lib/active_support/callbacks.rb:160:in `block in halting' 
    activesupport (4.1.4) lib/active_support/callbacks.rb:166:in `call' 
    activesupport (4.1.4) lib/active_support/callbacks.rb:166:in `block in halting' 
    activesupport (4.1.4) lib/active_support/callbacks.rb:149:in `call' 
    activesupport (4.1.4) lib/active_support/callbacks.rb:149:in `block in halting_and_conditional' 
    activesupport (4.1.4) lib/active_support/callbacks.rb:149:in `call' 
    activesupport (4.1.4) lib/active_support/callbacks.rb:149:in `block in halting_and_conditional' 
activesupport (4.1.4) lib/active_support/callbacks.rb:86:in `run_callbacks' 
    actionpack (4.1.4) lib/abstract_controller/callbacks.rb:19:in `process_action' 
    actionpack (4.1.4) lib/action_controller/metal/rescue.rb:29:in `process_action' 
    actionpack (4.1.4) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action' 
    activesupport (4.1.4) lib/active_support/notifications.rb:159:in `block in instrument' 
    activesupport (4.1.4) lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
    activesupport (4.1.4) lib/active_support/notifications.rb:159:in `instrument' 
    actionpack (4.1.4) lib/action_controller/metal/instrumentation.rb:30:in `process_action' 
    actionpack (4.1.4) lib/action_controller/metal/params_wrapper.rb:250:in `process_action' 
    activerecord (4.1.4) lib/active_record/railties/controller_runtime.rb:18:in `process_action' 
    actionpack (4.1.4) lib/abstract_controller/base.rb:136:in `process' 
    actionview (4.1.4) lib/action_view/rendering.rb:30:in `process' 
    actionpack (4.1.4) lib/action_controller/metal.rb:196:in `dispatch' 
    actionpack (4.1.4) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch' 
    actionpack (4.1.4) lib/action_controller/metal.rb:232:in `block in action' 
    actionpack (4.1.4) lib/action_dispatch/routing/route_set.rb:82:in `call' 
    actionpack (4.1.4) lib/action_dispatch/routing/route_set.rb:82:in `dispatch' 
    actionpack (4.1.4) lib/action_dispatch/routing/route_set.rb:50:in `call' 
    actionpack (4.1.4) lib/action_dispatch/routing/mapper.rb:45:in `call' 
    actionpack (4.1.4) lib/action_dispatch/journey/router.rb:71:in `block in call' 
    actionpack (4.1.4) lib/action_dispatch/journey/router.rb:59:in `each' 
    actionpack (4.1.4) lib/action_dispatch/journey/router.rb:59:in `call' 
    actionpack (4.1.4) lib/action_dispatch/routing/route_set.rb:678:in `call' 
    omniauth (1.2.2) lib/omniauth/strategy.rb:186:in `call!' 
    omniauth (1.2.2) lib/omniauth/strategy.rb:164:in `call' 
    omniauth (1.2.2) lib/omniauth/strategy.rb:186:in `call!' 
    omniauth (1.2.2) lib/omniauth/strategy.rb:164:in `call' 
    omniauth (1.2.2) lib/omniauth/strategy.rb:186:in `call!' 
    omniauth (1.2.2) lib/omniauth/strategy.rb:164:in `call' 
    omniauth (1.2.2) lib/omniauth/strategy.rb:186:in `call!' 
    omniauth (1.2.2) lib/omniauth/strategy.rb:164:in `call' 
    omniauth (1.2.2) lib/omniauth/strategy.rb:186:in `call!' 
    omniauth (1.2.2) lib/omniauth/strategy.rb:164:in `call' 
    warden (1.2.3) lib/warden/manager.rb:35:in `block in call' 
    warden (1.2.3) lib/warden/manager.rb:34:in `catch' 
    warden (1.2.3) lib/warden/manager.rb:34:in `call' 
    rack (1.5.2) lib/rack/etag.rb:23:in `call' 
    rack (1.5.2) lib/rack/conditionalget.rb:35:in `call' 
    rack (1.5.2) lib/rack/head.rb:11:in `call' 
    actionpack (4.1.4) lib/action_dispatch/middleware/params_parser.rb:27:in `call' 
    actionpack (4.1.4) lib/action_dispatch/middleware/flash.rb:254:in `call' 
    rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context' 
    rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call' 
    actionpack (4.1.4) lib/action_dispatch/middleware/cookies.rb:560:in `call' 
    activerecord (4.1.4) lib/active_record/query_cache.rb:36:in `call' 
    activerecord (4.1.4) lib/active_record/connection_adapters/abstract/connection_pool.rb:621:in `call' 
    activerecord (4.1.4) lib/active_record/migration.rb:380:in `call' 
    actionpack (4.1.4) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call' 
    activesupport (4.1.4) lib/active_support/callbacks.rb:82:in `run_callbacks' 
    actionpack (4.1.4) lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
    actionpack (4.1.4) lib/action_dispatch/middleware/reloader.rb:73:in `call' 
    actionpack (4.1.4) lib/action_dispatch/middleware/remote_ip.rb:76:in `call' 
    actionpack (4.1.4) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call' 
    actionpack (4.1.4) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call' 
    railties (4.1.4) lib/rails/rack/logger.rb:38:in `call_app' 
    railties (4.1.4) lib/rails/rack/logger.rb:20:in `block in call' 
    activesupport (4.1.4) lib/active_support/tagged_logging.rb:68:in `block in tagged' 
    activesupport (4.1.4) lib/active_support/tagged_logging.rb:26:in `tagged' 
    activesupport (4.1.4) lib/active_support/tagged_logging.rb:68:in `tagged' 
    railties (4.1.4) lib/rails/rack/logger.rb:20:in `call' 
    actionpack (4.1.4) lib/action_dispatch/middleware/request_id.rb:21:in `call' 
    rack (1.5.2) lib/rack/methodoverride.rb:21:in `call' 
    rack (1.5.2) lib/rack/runtime.rb:17:in `call' 
    activesupport (4.1.4) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call' 
    rack (1.5.2) lib/rack/lock.rb:17:in `call' 
    actionpack (4.1.4) lib/action_dispatch/middleware/static.rb:64:in `call' 
    rack-cors (0.2.9) lib/rack/cors.rb:54:in `call' 
    rack (1.5.2) lib/rack/sendfile.rb:112:in `call' 
    railties (4.1.4) lib/rails/engine.rb:514:in `call' 
    railties (4.1.4) lib/rails/application.rb:144:in `call' 
    rack (1.5.2) lib/rack/lint.rb:49:in `_call' 
    rack (1.5.2) lib/rack/lint.rb:37:in `call' 
    rack (1.5.2) lib/rack/showexceptions.rb:24:in `call' 
    rack (1.5.2) lib/rack/commonlogger.rb:33:in `call' 
    sinatra (1.4.5) lib/sinatra/base.rb:217:in `call' 
    rack (1.5.2) lib/rack/chunked.rb:43:in `call' 
    rack (1.5.2) lib/rack/content_length.rb:14:in `call' 
    unicorn (4.8.3) lib/unicorn/http_server.rb:576:in `process_client' 
    unicorn (4.8.3) lib/unicorn/http_server.rb:670:in `worker_loop' 
    unicorn (4.8.3) lib/unicorn/http_server.rb:525:in `spawn_missing_workers' 
    unicorn (4.8.3) lib/unicorn/http_server.rb:140:in `start' 
    unicorn (4.8.3) bin/unicorn:126:in `<top (required)>' 
+0

क्या तुमने कभी यह पता लगा था? मैंने अभी डॉकर कंटेनर का उपयोग करके उबंटू वीएम पर एक उत्पादन वातावरण बनाया है ... फ्लास्क, mysql, nginx, और uwsgi। मुझे फॉर्मों पर सीआरएसएफ टोकन त्रुटियां भी मिल रही हैं। – Chockomonkey

+0

बस कुछ ऐसा ही लगा ... यदि आपके पास SERV_NAME को आपकी कॉन्फ़िगरेशन में परिभाषित किया गया है, तो इसे हटाने का प्रयास करें। – Chockomonkey

+0

@Chockomonkey क्या आप इसका मतलब विस्तार कर सकते हैं? क्या आपका मतलब है कि यदि आपके पास 'SERVER_NAME' को पर्यावरण चर के रूप में परिभाषित किया गया है? –

उत्तर

1

'protect_from_forgery method' का एक सरसरी पढ़ने से, हम निम्नलिखित है:

def protect_from_forgery(options = {}) 
    self.forgery_protection_strategy = protection_method_class(options[:with] || :null_session) 
    self.request_forgery_protection_token ||= :authenticity_token 
    prepend_before_action :verify_authenticity_token, options 
    append_after_action :verify_same_origin_request 
    end 

कौन सा 'verify_authenticity_token' नामक एक कॉलबैक कार्रवाई से पहले है। अगर हम अपने स्रोत को देखो हम निम्नलिखित हैं:

def verify_authenticity_token 
    mark_for_same_origin_verification! 

    if !verified_request? 
     logger.warn "Can't verify CSRF token authenticity" if logger 
     handle_unverified_request 
    end 
    end 

वहां से हम ध्यान दें कि यह कहता है 'verified_request?'।

def verified_request? 
    !protect_against_forgery? || request.get? || request.head? || 
     form_authenticity_token == params[request_forgery_protection_token] || 
     form_authenticity_token == request.headers['X-CSRF-Token'] 
    end 

उठाया अपवाद की प्रकृति को देखते हुए, मुझे लगता है कि होता है कि उनमें से एक या एकाधिक शर्तों का पूरा नहीं किया जा रहा है। मुझे नहीं लगता कि आईपी एड्रेसिंग के साथ इसका कोई संबंध नहीं है।

0

यदि आपकी रेल ऐप गैर-एसएसएल पर आपके प्रॉक्सी से बात कर रही है, तो ऐसी समस्या हो सकती है जहां आपका ActiveRecord :: सत्रस्टोर उस परिदृश्य के कारण फिट हो रहा है।

OurApplication::Application.config.session_store :active_record_store, secure: false

संपादित करें:: अभी भी कोई ठीक अभी तक ... हम शायद के रूप में विरोध किया एसएसएल क्षुधा पर समाप्त करने के लिए करने जा रहे हैं

हमारे ठीक सत्र दुकान असुरक्षित बनाने के लिए था इस पर प्रॉक्सी के लिए।

तो हमारे लिए, इस मुद्दे के अंत में एसएसएल के साथ कुछ लेना देना नहीं था। हमारे पास पहले पृष्ठ लोड पर एक जावास्क्रिप्ट कॉल निष्पादित किया जा रहा था जो बैकएंड सेवा (POST के माध्यम से) के खिलाफ हैंडशेक करने का प्रयास कर रहा था, लेकिन हमने उस सेवा पर कॉल रूट करने के लिए हमारे HAPROxy को ठीक से कॉन्फ़िगर नहीं किया था, इसलिए POST था रेल मारनाहालांकि रेल मार्ग के लिए 404 लौटे, फिर भी अनुरोध में गायब सीएसआरएफ टोकन की वजह से सत्र को रीसेट कर दिया गया। हैप्रोक्सी के रूटिंग को ठीक करने से इस मुद्दे को ठीक किया गया।

हमारे परिदृश्य में आपके साथ कुछ भी करने की संभावना नहीं है, और रेल 4 में, उन्होंने protect_from_forgery का डिफ़ॉल्ट व्यवहार सत्र को रीसेट करने के बजाय अपवाद बढ़ाने के लिए किया है। ओह, और हम भी अंत में असुरक्षित करने के लिए सत्र की दुकान स्थापित करने की आवश्यकता थी:

OurApplication::Application.config.session_store :active_record_store, secure: false

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