2014-07-11 8 views
9

निम्नलिखित मानकोंक्या यह उम्मीद की जाती है कि ये पैरामीटर हमेशा किसी भी रेल एप्लिकेशन में 500 उठाएंगे?

http://example.com/?b=1&b[a]=2 

हमेशा यह एक त्रुटि जो गैर catchable हो रहा है बढ़ाने के लिए बनाता है के साथ एक रेल आवेदन साधते।

उदा।

यह निम्न त्रुटि को जन्म देती है:

Invalid query parameters: expected Hash (got String) for param `b' 

अनुरोध कभी नहीं रेल आवेदन कोड पूरी करता है।

यहाँ पूर्ण पश्व-अनुरेखन के अंतिम पंक्तियां हैं:

ActionController::BadRequest (Invalid query parameters: expected Hash (got String) for param `b'): 
    rack (1.5.2) lib/rack/utils.rb:127:in `normalize_params' 
    rack (1.5.2) lib/rack/utils.rb:96:in `block in parse_nested_query' 
    rack (1.5.2) lib/rack/utils.rb:93:in `each' 
    rack (1.5.2) lib/rack/utils.rb:93:in `parse_nested_query' 
    rack (1.5.2) lib/rack/request.rb:373:in `parse_query' 
    actionpack (4.1.4) lib/action_dispatch/http/request.rb:313:in `parse_query' 
    rack (1.5.2) lib/rack/request.rb:188:in `GET' 
    actionpack (4.1.4) lib/action_dispatch/http/request.rb:274:in `GET' 
    actionpack (4.1.4) lib/action_dispatch/http/parameters.rb:16:in `parameters' 
    actionpack (4.1.4) lib/action_dispatch/http/filter_parameters.rb:37:in `filtered_parameters' 
    actionpack (4.1.4) lib/action_controller/metal/instrumentation.rb:22: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/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' 
    rack (1.5.2) lib/rack/etag.rb:23:in `call' 
    rack (1.5.2) lib/rack/conditionalget.rb:25: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' 

मैं रेल 3.2 में कुछ साल पहले इस खोज की थी और मुझे आश्चर्य है कि क्यों यह अभी भी पर रेल 4.1.4 दुर्घटनाओं है।

किसी के पास क्या हो रहा है इसके बारे में कोई अच्छी व्याख्या है?

+0

पैरा वास्तव में बेतुका हैं लेकिन आप सही हैं, इसे किसी भी तरह से रेल ऐप को मारना चाहिए – apneadiving

+0

यह सही है। हालांकि, मुझे लगता है कि यहां एक छोटी सी सुरक्षा समस्या है। यह पता लगाना आसान है कि क्या वेबसर्वर रेल पर रूबी का उपयोग कर रहा है या नहीं, जिसे IMHO को obfuscated किया जाना चाहिए। –

उत्तर

4

यह तकनीकी रूप से प्रभावित करता है रैक, नहीं रेल और मेरा अनुमान है कि यह एक बग ... रैक ठीक से एक नेस्टेड क्वेरी को पार्स करने के लिए अपने रास्ते से हट जाने के लिए लगता है है ...

should "parse nested query strings correctly" do 
    Rack::Utils.parse_nested_query("foo"). 
     should.equal "foo" => nil 
    Rack::Utils.parse_nested_query("foo="). 
     should.equal "foo" => "" 
    Rack::Utils.parse_nested_query("foo=bar"). 
     should.equal "foo" => "bar" 
    Rack::Utils.parse_nested_query("foo=\"bar\""). 
     should.equal "foo" => "\"bar\"" 

    Rack::Utils.parse_nested_query("foo=bar&foo=quux"). 
     should.equal "foo" => "quux" 
    Rack::Utils.parse_nested_query("foo&foo="). 
     should.equal "foo" => "" 
    Rack::Utils.parse_nested_query("foo=1&bar=2"). 
     should.equal "foo" => "1", "bar" => "2" 
    Rack::Utils.parse_nested_query("&foo=1&&bar=2"). 
     should.equal "foo" => "1", "bar" => "2" 
    Rack::Utils.parse_nested_query("foo&bar="). 
     should.equal "foo" => nil, "bar" => "" 
    Rack::Utils.parse_nested_query("foo=bar&baz="). 
     should.equal "foo" => "bar", "baz" => "" 
    Rack::Utils.parse_nested_query("my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F"). 
     should.equal "my weird field" => "q1!2\"'w$5&7/z8)?" 

    Rack::Utils.parse_nested_query("a=b&pid%3D1234=1023"). 
     should.equal "pid=1234" => "1023", "a" => "b" 

    Rack::Utils.parse_nested_query("foo[]"). 
     should.equal "foo" => [nil] 
    Rack::Utils.parse_nested_query("foo[]="). 
     should.equal "foo" => [""] 
    Rack::Utils.parse_nested_query("foo[]=bar"). 
     should.equal "foo" => ["bar"] 

    Rack::Utils.parse_nested_query("foo[]=1&foo[]=2"). 
     should.equal "foo" => ["1", "2"] 
    Rack::Utils.parse_nested_query("foo=bar&baz[]=1&baz[]=2&baz[]=3"). 
     should.equal "foo" => "bar", "baz" => ["1", "2", "3"] 
    Rack::Utils.parse_nested_query("foo[]=bar&baz[]=1&baz[]=2&baz[]=3"). 
     should.equal "foo" => ["bar"], "baz" => ["1", "2", "3"] 

    Rack::Utils.parse_nested_query("x[y][z]=1"). 
     should.equal "x" => {"y" => {"z" => "1"}} 
    Rack::Utils.parse_nested_query("x[y][z][]=1"). 
     should.equal "x" => {"y" => {"z" => ["1"]}} 
    Rack::Utils.parse_nested_query("x[y][z]=1&x[y][z]=2"). 
     should.equal "x" => {"y" => {"z" => "2"}} 
    Rack::Utils.parse_nested_query("x[y][z][]=1&x[y][z][]=2"). 
     should.equal "x" => {"y" => {"z" => ["1", "2"]}} 

    Rack::Utils.parse_nested_query("x[y][][z]=1"). 
     should.equal "x" => {"y" => [{"z" => "1"}]} 
    Rack::Utils.parse_nested_query("x[y][][z][]=1"). 
     should.equal "x" => {"y" => [{"z" => ["1"]}]} 
    Rack::Utils.parse_nested_query("x[y][][z]=1&x[y][][w]=2"). 
     should.equal "x" => {"y" => [{"z" => "1", "w" => "2"}]} 

    Rack::Utils.parse_nested_query("x[y][][v][w]=1"). 
     should.equal "x" => {"y" => [{"v" => {"w" => "1"}}]} 
    Rack::Utils.parse_nested_query("x[y][][z]=1&x[y][][v][w]=2"). 
     should.equal "x" => {"y" => [{"z" => "1", "v" => {"w" => "2"}}]} 

    Rack::Utils.parse_nested_query("x[y][][z]=1&x[y][][z]=2"). 
     should.equal "x" => {"y" => [{"z" => "1"}, {"z" => "2"}]} 
    Rack::Utils.parse_nested_query("x[y][][z]=1&x[y][][w]=a&x[y][][z]=2&x[y][][w]=3"). 
     should.equal "x" => {"y" => [{"z" => "1", "w" => "a"}, {"z" => "2", "w" => "3"}]} 

    lambda { Rack::Utils.parse_nested_query("x[y]=1&x[y]z=2") }. 
     should.raise(TypeError). 
     message.should.equal "expected Hash (got String) for param `y'" 

    lambda { Rack::Utils.parse_nested_query("x[y]=1&x[]=1") }. 
     should.raise(TypeError). 
     message.should.match(/expected Array \(got [^)]*\) for param `x'/) 

    lambda { Rack::Utils.parse_nested_query("x[y]=1&x[y][][w]=2") }. 
     should.raise(TypeError). 
     message.should.equal "expected Array (got String) for param `y'" 
    end 

दूसरी ओर , मुझे लगता है कि प्रश्न अधिक ठीक रूप में लिखा जाएगा:

http://example.com/?b[]=1&b[a]=2 या http://example.com/?b[a]=1&b[a]=2

आप http://codefol.io/posts/How-Does-Rack-Parse-Query-Params-With-parse-nested-query के बाहर एक लात मिल सकता है।

+0

लिंक के लिए धन्यवाद यह बहुत दिलचस्प है। हालांकि मुझे आश्चर्य है, अगर यह सामान्य है कि अपवाद उठाया गया है, तो इस तथ्य के बारे में क्या है कि यह कहीं भी नहीं पकड़ा गया है? क्या हम निष्कर्ष निकाल सकते हैं कि यह एक अपेक्षित व्यवहार है या क्या यह एक बग है जिसे ठीक किया जाना चाहिए? –

+0

अच्छा सवाल ... जितना अधिक मैं इसके बारे में सोचता हूं, 'अमान्य क्वेरी पैरामीटर: पैरामीटर' बी 'के लिए अपेक्षित हैश (स्ट्रिंग मिला) मुझे लगता है कि यह बिल्कुल ठीक होना चाहिए। आप ऐप पहचान के बारे में एक दिलचस्प बिंदु बनाते हैं, शायद आपको https://github.com/rack/rack/issues पर कोई समस्या जोड़नी चाहिए और देखें कि वे क्या कहते हैं ... –

+0

https://github.com/rails/rails/मुद्दों/11,502 –

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