टॉमकैट पर HTTP विधियों को अस्वीकार करना मामला संवेदनशील है?


11

मैंने PUT, DELETE, आदि को हटाने के प्रयास के लिए अपने आवेदन के web.xml में निम्नलिखित डाला है:

 <security-constraint>
 <web-resource-collection>
  <web-resource-name>restricted methods</web-resource-name>
  <url-pattern>/*</url-pattern>
  <http-method>DELETE</http-method>
  <http-method>PUT</http-method>
  <http-method>SEARCH</http-method>
  <http-method>COPY</http-method>
  <http-method>MOVE</http-method>
  <http-method>PROPFIND</http-method>
  <http-method>PROPPATCH</http-method>
  <http-method>MKCOL</http-method>
  <http-method>LOCK</http-method>
  <http-method>UNLOCK</http-method>
  <http-method>delete</http-method>
  <http-method>put</http-method>
  <http-method>search</http-method>
  <http-method>copy</http-method>
  <http-method>move</http-method>
  <http-method>propfind</http-method>
  <http-method>proppatch</http-method>
  <http-method>mkcol</http-method>
  <http-method>lock</http-method>
  <http-method>unlock</http-method>
 </web-resource-collection>
 <auth-constraint />
 </security-constraint>

ठीक है, तो अब:

यदि मैं एक विधि के साथ अनुरोध करता हूं तो DELETEमुझे 403 वापस मिल जाता है।

यदि मैं एक विधि के साथ अनुरोध करता हूं तो deleteमुझे 403 वापस मिल जाता है।

परंतु

अगर मैं DeLeTeठीक होने की विधि के साथ एक अनुरोध करता हूं!

मैं इन मामलों को असंवेदनशील कैसे बना सकता हूं?

संपादित करें: मैं इसे C # प्रोग्राम के साथ परीक्षण कर रहा हूं:

    private void button1_Click(object sender, EventArgs e)
    {
        textBox1.Text = "making request";
        System.Threading.Thread.Sleep(400);
        WebRequest req = WebRequest.Create("http://serverurl/Application/cache_test.jsp");
        req.Method = txtMethod.Text;
        try
        {
            HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

            textBox1.Text = "Status: " + resp.StatusCode;

            if (resp.StatusCode == System.Net.HttpStatusCode.OK)
            {
                WebHeaderCollection header = resp.Headers;
                using (System.IO.StreamReader reader = new System.IO.StreamReader(resp.GetResponseStream(), ASCIIEncoding.ASCII))
                {
                    //string responseText = reader.ReadToEnd();
                    textBox1.Text += "\r\n" + reader.ReadToEnd();
                }
            }
        }
        catch (Exception ex)
        {
            textBox1.Text = ex.Message;
        }
    }

txtMethod.Textएक टेक्स्ट बॉक्स है जहाँ मैं विधि नाम लिख रहा हूँ। जब एक 403 होता है तो एक अपवाद फेंक दिया जाता है जो कैच ब्लॉक में पकड़ा जाता है।

Cache_test.jsp में शामिल हैं:

<%
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma","no-cache");

out.print("Method used was: "+request.getMethod());
%>

आप इसे कैसे परखेंगे?
जेवियर ल्यूकास

@XavierLucas, इस सवाल के साथ जोड़ा गया
developerwjk

1
आपका परीक्षण कार्यक्रम त्रुटिपूर्ण है। HttpWebRequestहोगा केस-insensitively समझते हैं और परिवर्तित अपरकेस में मानक HTTP तरीकों। इसके अतिरिक्त, यह केवल मानक HTTP विधियों की अनुमति के रूप में प्रलेखित है । सबसे अच्छा विकल्प एक कच्ची टीसीपी स्ट्रीम (उदाहरण के लिए नेटकैट या पुटी कच्चे, या टेलनेट, आदि) का उपयोग करना है।
बॉब

1
@ याकूब, मैंने इसे विज़ुअल सी # 2005 एक्सप्रेस में .NET 2.0 में किया और उन मुद्दों में से किसी में नहीं चला। यह वही भेज रहा है जो मैं टाइप करता हूं। इसलिए उन्हें बाद के संस्करण में बदल दिया जाना चाहिए।
डेवलपर

1
@ याकूब, लोल। Microsoft का प्रलेखन गलत / भ्रामक है। .NET 2.0 संस्करण के लिए वे यह भी कहते हैं कि "विधि संपत्ति HTTP 1.1 प्रोटोकॉल क्रियाओं में से किसी पर भी सेट की जा सकती है: GET, HEAD, POST, PUT, DELETE, TRACE, या विकल्प।" लेकिन यह व्यवहार में किसी भी तरह से प्रतिबंधित नहीं है।
developer

जवाबों:


13

HTTP मानक के संबंध में टॉमकैट के गलत व्यवहार के बावजूद, आपको ब्लैकलिस्ट के बजाय विशिष्ट तरीकों की अनुमति देने के लिए एक श्वेतसूची का उपयोग करना चाहिए।

उदाहरण के लिए, निम्नलिखित को छोड़कर सभी तरीकों को अवरुद्ध कर देगा श्वेत सूची केस-संवेदी GET और HEAD

<security-constraint>
    <web-resource-collection>
        <web-resource-name>restricted methods</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method-omission>GET</http-method-omission>
        <http-method-omission>HEAD</http-method-omission>
    </web-resource-collection>
    <auth-constraint />
</security-constraint>

(ध्यान दें: टॉमकैट 7+ की आवश्यकता है। पुराने संस्करणों का उपयोग करने वालों को अन्य समाधानों की जांच करनी होगी, उदाहरण के लिए एक सर्वलेट फ़िल्टर।)

संदर्भ


जब मैं POST के साथ भी शामिल होता हूं, तो मैं साइट पर एक पृष्ठ पर जाता हूं (बस एक लिंक या बुकमार्क पर क्लिक करता हूं) और यह मुझे 405 देता है।
developerwjk

वास्तव में यह मुझे HTTP स्टेटस 403 देता है - अनुरोधित संसाधन तक पहुंच से वंचित कर दिया गया है
developerwjk

मैंने इसे सर्वर के web.xml में आज़माया है, और इसने चूक को नजरअंदाज कर दिया और सब कुछ अवरुद्ध कर दिया। बाहर ले गया। अनुप्रयोग के web.xml में इसे आज़माया, और फिर, इसकी हर विधि को अवरुद्ध कर दिया और चूक को अनदेखा कर दिया।
developerwjk

इसके अलावा ऊपर के रूप में बिल्कुल कोशिश की लेकिन बाहर ले जा रही है <auth-constraint />और फिर यह सब कुछ की अनुमति देता है।
developerwjk

2
@developerwjk http-method-omissionसर्वप्रथम सर्वलेट एपीआई 3.0 में परिभाषित किया गया था, जिसे टॉमकैट 7+: tomcat.apache.org/whichversion.html द्वारा कार्यान्वित किया गया है । दुर्भाग्य से, इसका मतलब यह है कि यह टॉमकैट 6 और पुराने (नोट: 5 ईओएल पहले से ही) में काम नहीं करेगा। आप लिंक किए गए SO प्रश्न में दूसरे प्रस्तावित समाधान की कोशिश कर सकते हैं जो दो अलग-अलग सेट करने की सिफारिश करता है security-constraint- मैं पुष्टि नहीं कर सकता कि 7 में एक काम करता है, इसलिए इसे इस उत्तर में शामिल नहीं किया।
बॉब

13

खैर, Server: Apache-Coyotteअपने HTTP उत्तरों में हेडर सिग्नेचर रखने वाले कुछ रैंडम सर्वर पर त्वरित परीक्षण के बाद , ऐसा लगता है कि आप सही हैं क्योंकि get / HTTP/1.1\r\nHost: <target_IP>\r\n\r\nहर बार काम करने वाले साधारण नेटकैट कनेक्शन के साथ भेजने पर 400 HTTP कोड प्राप्त होना चाहिए था।

उदाहरण के लिए :

$ { echo -en "get / HTTP/1.1\r\nHost: <target_IP>:8080\r\n\r\n" ; } | nc <target_IP> 8080

01:14:58.095547 IP 192.168.1.3.57245 > <target_IP>.8080: Flags [P.], seq 1:42, ack 1, win 115, options [nop,nop,TS val 4294788321 ecr 0], length 41
E..]C.@.@..Y......p.....A..v.......s.......
..D.....get / HTTP/1.1
Host: <target_IP>:8080

[...]

01:14:58.447946 IP <target_IP>.8080 > 192.168.1.3.57245: Flags [.], seq 1:1409, ack 43, win 65494, options [nop,nop,TS val 7981294 ecr 4294787971], length 1408
E...f...i.....p.............A..............
.y....C.HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=ISO-8859-1
Transfer-Encoding: chunked
Date: Tue, 27 Jan 2015 00:15:14 GMT

मुझे कहना चाहिए कि मैं यहाँ थोड़ा हैरान हूँ और मुझे यह देखकर आश्चर्य नहीं होगा कि इस तरह के मामले में सभी HTTP / 1.1 तरीकों के लिए व्यवहार बढ़ाया गया।

आपको उनके बग ट्रैकिंग टूल पर बग रिपोर्ट भरनी चाहिए और उचित मेलिंग सूची को एक मेल भेजना चाहिए क्योंकि यह बुरे परिणामों के साथ RFC 2616 (नीचे देखें) का एक बदसूरत उल्लंघन है।

५.१.१ विधि

  The Method  token indicates the method to be performed on the
  resource identified by the Request-URI. The method is case-sensitive.

      Method         = "OPTIONS"                ; Section 9.2
                     | "GET"                    ; Section 9.3
                     | "HEAD"                   ; Section 9.4
                     | "POST"                   ; Section 9.5
                     | "PUT"                    ; Section 9.6
                     | "DELETE"                 ; Section 9.7
                     | "TRACE"                  ; Section 9.8
                     | "CONNECT"                ; Section 9.9
                     | extension-method
      extension-method = token

3
नोट: RFC 2616 को अब RFC 7230-7235 द्वारा बदल दिया गया है। RFC 7230 30 3.1.1 : "अनुरोध विधि केस-संवेदी है।" RFC 7231 : 4 : "कन्वेंशन द्वारा, मानकीकृत विधियों को सभी अपरकेस US-ASCII अक्षरों में परिभाषित किया गया है।"
बॉब

1
प्रतिक्रिया स्थिति कोड वास्तव में 405 होना चाहिए विधि अनुमत नहीं है।
रेयान

3
@LieRyan नहीं क्योंकि इसका मतलब यह होगा कि टोकन टोकन RFC को फिट करता है जबकि सर्वर इसे इस संसाधन पर उपयोग करने की अनुमति नहीं देता है। RFC 2616 4 10.4.1: [400 खराब अनुरोध] विकृत सिंटैक्स के कारण सर्वर द्वारा अनुरोध को समझा नहीं जा सका। RFC 2616 § 10.4.6 [405 पद्धति की अनुमति नहीं दी] विधि अनुरोध लाइन में निर्दिष्ट संसाधन अनुरोध- URI द्वारा की पहचान के लिए अनुमति नहीं है। टोकन किसी भी तरह से एक HTTP विधि नहीं है (ऊपर RFC 2616 .1 5.1.1 का अंश देखें)get
जेवियर लुकास

@XavierLucas: लोअर केस मेथड का उपयोग करके सिंटैक्स त्रुटि नहीं है, RFC2616 धारा 5 की जाँच करें । ABNF में, extension-methodसिंटैक्स है tokenजिसमें सभी अल्फ़ान्यूमेरिक वर्ण और कुछ प्रतीक शामिल हैं, न कि केवल RFC में विशेष रूप से सूचीबद्ध तरीके। HTTP का लगभग हर हिस्सा एक्स्टेंसिबल है, जब तक कि क्लाइंट और सर्वर दोनों सहमत नहीं हैं कि उन्हें कैसे बढ़ाया जा सकता है, जिसमें आपके स्वयं के निचले स्तर के तरीकों को परिभाषित करना शामिल है। अनुरोध पंक्ति "प्राप्त / HTTP / 1.1" वाक्य-रचना ठीक है, यह सिर्फ RFC का उल्लंघन करती है क्योंकि विधि नाम संवेदनशील होना चाहिए।
रेयान

@LieRyan extension-methodयहाँ अगले RFC के लिए दरवाजा खुला छोड़ने के लिए है, यहाँ RFC के दायरे से बाहर अपने स्वयं के तरीकों को पाने के लिए नहीं है और आप HTTP / 1.1 अनुपालन सेवाओं को चलाने का दिखावा करते हैं। तो एक 400 वापस किया जाना चाहिए क्योंकि इस तरह की कोई विधि अभी तक नवीनतम RFC में नहीं दिखाई दी है, जो कि, आज, एक अमान्य टोकन है। यदि टोकन वर्तमान विधि सूची के बारे में मान्य था और सर्वर-साइड लागू किया गया था, लेकिन अस्वीकृत हो गया तो 405 वापस किया जाना चाहिए। यदि विधि मान्य है, लेकिन सर्वर-साइड कार्यान्वित नहीं किया गया है तो 501 लौटाया जाना चाहिए।
जेवियर लुकास 12
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.