Url (/%) में प्रतिशत चिह्न के साथ IIS अनुरोध को ठीक से संभालें


14

मैं ठीक से IIS अनुरोध प्राप्त करने के लिए किसी भी तरह के समाधान की तलाश कर रहा हूं जैसे कि /programming//% और http://bing.com/% पर 400 बैड रिक्वेस्ट पेज प्रदर्शित नहीं करने के लिए, लेकिन एक कस्टम एरर पेज प्रदर्शित करें http://google.com/% और http://facebook.com/% do के समान (जाहिर है कि वे उदाहरण IIS पर नहीं हैं)।

मेरा मानना ​​है कि मैंने http://support.microsoft.com/kb/820129 के अनुसार सभी लागू http.sys रजिस्ट्री सेटिंग्स (AllowRestrictedChars, PercentUAllowed) को स्थापित करने की कोशिश की है, लेकिन इससे कोई मदद नहीं मिली है। AllowRestrictedChars और एक कस्टम 400 पेज को सेट करने के लिए /programming//%12 जैसे यूआरएल हैं, लेकिन /% नहीं।


3
आपको पता चलता है कि यह एक अपूर्ण URL-एस्केप है और एक बुरा अनुरोध है, इसलिए 400 इसे ठीक से संभाल रहा है? PercentU और AllowRestricted वास्तव में लागू नहीं हैं
Rup

हां, मैं करता हूं (और /% केवल एक उदाहरण URL है, लेकिन जाहिर है कि त्रुटि हर अमान्य एस्केप चरित्र के साथ होती है)। IIS 400 को हैंडल कर रहा है, लेकिन मैं एक कस्टम 400 पेज दिखाना चाहता हूं, जैसे मैं IIS में अन्य स्टेटस कोड के साथ कर सकता हूं, और जैसे कि गैर-IIS सर्वर 400 के लिए कैसे कर सकते हैं।
bkaid

मेरे पास अपनी वेबसाइटों की ओर इशारा करते हुए कुछ शक्तिशाली लिंक हैं जो गलती से इस तरह से एन्कोडेड हैं। लेकिन मुझे 301 को सही पृष्ठ पर लाने की अनुमति नहीं है, इसके बजाय यह एक कठिन त्रुटि है। यह अस्वीकार्य है।
बूमरौपर

जवाबों:


20

यह IIS कर्नेल स्तर में सही अवरुद्ध है। एक परीक्षण के रूप में मैंने IIS में प्रत्येक मॉड्यूल को बाहर निकाला ताकि इसमें स्थिर पेज हैंडलर भी न हो, और इसने 400 त्रुटि संदेश प्रदर्शित किया।

मुझे विश्वास नहीं है कि यह संभव है कि आईआईएस के साथ ऐसा हो। आपके द्वारा उल्लिखित रजिस्ट्री सेटिंग्स अन्य प्रकार के प्रतिबंधित वर्णों के लिए हैं। मैंने उस कार्यक्षमता को बदलने के लिए एक लीवर नहीं देखा है।

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

Update2: यहाँ इस पर तीन महान लिंक हैं। IIS टीम से नाज़िम लाला और वेड हिल्मो दोनों ने आपके सवाल पर चर्चा के कारण इस बारे में ब्लॉग किया है। इसके अलावा स्कॉट हंसेलमैन के पास querystring भाग पर एक शानदार पोस्ट है। .NET:

अद्यतन: मैंने आधिकारिक जवाब पाने के लिए IIS टीम के एक सदस्य के साथ जाँच की। उन्होंने उल्लेख किया कि% RFC 1738 ( http://www.ietf.org/rfc/rfc1738.txt ) के अनुसार एक असुरक्षित चरित्र माना जाता है ।

यहाँ रीलेवेंट टेक्स्ट है:

असुरक्षित:

वर्ण कई कारणों से असुरक्षित हो सकते हैं। अंतरिक्ष वर्ण असुरक्षित है क्योंकि महत्वपूर्ण स्थान गायब हो सकते हैं और महत्वहीन स्थान तब पेश किए जा सकते हैं जब URL को स्थानांतरित या टाइपसेट या वर्ड-प्रोसेसिंग कार्यक्रमों के उपचार के अधीन किया जाता है। वर्ण "<" और ">" असुरक्षित हैं क्योंकि उनका उपयोग मुफ्त पाठ में URL के आसपास के सीमांकक के रूप में किया जाता है; उद्धरण चिह्न ("" ") का उपयोग कुछ सिस्टम में URL को सीमांकित करने के लिए किया जाता है। वर्ण" # "असुरक्षित है और इसे हमेशा एन्कोड किया जाना चाहिए क्योंकि इसका उपयोग वर्ल्ड वाइड वेब में और अन्य प्रणालियों में एक टुकड़ा या एंकर से URL को हटाने के लिए किया जाता है।" पहचानकर्ता जो इसका अनुसरण कर सकता है। वर्ण "%" असुरक्षित है क्योंकि इसका उपयोग अन्य वर्णों के एन्कोडिंग के लिए किया जाता है। अन्य वर्ण असुरक्षित हैं क्योंकि गेटवे और अन्य परिवहन एजेंट कभी-कभी ऐसे वर्णों को संशोधित करने के लिए जाने जाते हैं। ये वर्ण "{", "}", "|", "\", "^", "~", "[", "]", और "` "हैं।

सभी असुरक्षित वर्णों को हमेशा URL के भीतर एन्कोड किया जाना चाहिए। उदाहरण के लिए, वर्ण "#" को उन सिस्टमों में भी URL के अंदर एनकोड किया जाना चाहिए जो सामान्य रूप से खंड या एंकर आइडेंटिफ़ायर से नहीं निपटते हैं, ताकि यदि URL को किसी अन्य सिस्टम में कॉपी किया जाए जो उनका उपयोग करता है, तो उसे बदलना आवश्यक नहीं होगा URL एन्कोडिंग।

इसलिए आईआईएस ने मुख्य रूप से अपनी हमले की सतह को कम करने के लिए एक सक्रिय सुरक्षा उपाय को मुख्य स्तर पर ब्लॉक कर दिया है।


मैं अपनी साइट पर गतिशील रूप से उत्पन्न होने वाले अमान्य यूआरएल के किसी भी अजीब अजीब संयोजन की निगरानी करने के लिए सभी त्रुटियों को ठीक से लॉग इन करना और खुद को संभालना पसंद करता हूं - इस घटना में एक ठीक से यूआरएल से बच नहीं रहा है।
bkaid

1
त्रुटियों को खुद से निपटने के लिए कुछ कहा जाना चाहिए, लेकिन अगर स्पष्ट रूप से स्पष्ट विफलताओं को आप के लिए संभाला जाता है, तो यह एक अच्छा बोनस है। IIS को उस वर्ण के माध्यम से अनुमति नहीं देनी चाहिए जो NTFS फ़ाइल सिस्टम में किसी फ़ाइल या फ़ोल्डर के अनुरूप नहीं है। यह नहीं पता होगा कि फ़ोल्डर पथ के साथ क्या करना है। यदि यह एक ऐसा चरित्र पैटर्न नहीं है जो एक वैध चरित्र के बराबर है, तो यह निर्णय लेना होगा कि क्या करना है। इस मामले में यह प्रतीत होता है कि यह अमान्य वर्णों को अनदेखा करने के बजाय ब्लॉक करने के लिए समर्पित था।
स्कॉट फोर्सिथ - एमवीपी

@thekaido स्कॉट के रूप में यह अधूरा URLS पार्स करने के लिए कोई मतलब नहीं है। आप किस प्रकार का कस्टम एरर पेज बना सकते हैं क्योंकि आपको पता नहीं है कि उपयोगकर्ता क्या करने की कोशिश कर रहा था (क्योंकि अनुरोध अधूरा है)। ध्यान दें कि IE9 आपको अपूर्ण अनुरोध के साथ सर्वर पर आने की अनुमति नहीं देगा
जिम बी

मैं इन सभी चीजों के निहितार्थ को समझता हूं लेकिन अपाचे और अन्य वेब सर्वर इसके लिए IIS की अनुमति देते हैं। अनुचित रूप से बच गया URL केवल URL का IIS आपको ऐसा हैंडल नहीं करने देगा जो मुझे पता हो। IIS को NTFS फ़ाइल सिस्टम में मैप न करने वाले अन्य वर्णों की अनुमति देनी चाहिए क्योंकि मेरी साइट ASP.NET MVC का उपयोग करके बनाई गई है जहां अनुरोध गैर-फ़ाइल आधारित संसाधनों के लिए रूट किए जाएंगे।
bkaid

वास्तव में मैं NTFS में% के बारे में सही है। अधिकांश अन्य पात्रों के साथ इसकी अनुमति है: en.wikipedia.org/wiki/Ntfs । (फ़ाइल नाम में अनुमत पात्रों की खोज)।
स्कॉट फोर्सिथ - एमवीपी

3

मैं 3 संभावित तरीकों के बारे में सोच सकता हूं

  1. सामान्य रूप से 400 त्रुटियों के लिए कस्टम पृष्ठ पर इंगित करने के लिए IIS बदलें

  2. यदि यह IIS में किसी विशिष्ट वेब साइट के लिए अद्वितीय है, तो आप web.config में ऐसा कुछ कर सकते हैं:

    <customErrors defaultRedirect = "ErrorPage.aspx" मोड = "ऑन">
    <त्रुटि स्थितिकोड = "400" पुनर्निर्देशित = "myCustom400Error.aspx" />
    </ customErunors>

  3. एक httpModule लिखें जो आने वाले URL का निरीक्षण करता है और उन्हें संभालता है


4
इनमें से कोई भी कार्य - IIS अनुरोध के साथ कभी नहीं गुजरता है।
द्विविद

विकल्प # 1 को कोई फर्क नहीं पड़ता कि क्या काम करना चाहिए क्योंकि इस तरह आईआईएस त्रुटि का जवाब देता है
डेव वाइज

4
मैंने बस फिर से 1 और # 2 विकल्प की कोशिश की और दोनों में से कोई भी काम नहीं किया। IIS इस अनुरोध को विशेष रूप से स्कॉट उल्लेख की तरह संभाल रहा है।
बकायदा

3

इसके चारों ओर एकमात्र तरीका IIS कर्नेल के पहले URL की जाँच करने जैसा लगता है।

आपको उस URL पर अपने अंतिम-उपयोगकर्ता को अग्रेषित करने से पहले उन्हें जांचने के लिए स्क्रिप्ट के माध्यम से अपने गतिशील रूप से उत्पन्न लिंक भेजने की आवश्यकता होगी ...

उस पर रोक लगाते हुए, आप जानते हैं कि यह एकमात्र ऐसी स्थिति है, जहां IIS इसे आपके इच्छित तरीके से संभाल नहीं पाएगा। इसलिए, उन्मूलन की प्रक्रिया से, यदि आपके पास कोई अनहोनी अनुरोध है, तो आप जानते हैं कि इसका क्या कारण है।

शायद एक कस्टम 400 पेज में रेफरल की जाँच करने से यातायात के स्रोत को कम करने में मदद मिलेगी?


2

इस IIS फ़ोरम की पोस्ट इंगित करती है कि HTTP 400 (बुरा अनुरोध) http.sys द्वारा ब्लॉक किया गया है और इसे IIS के लिए नहीं बनाते हैं जो उन लिंक से मेल खाता है जो @Scott Forsyth - MVP उनके मूल उत्तर में शामिल हैं।

आप c: \ Windows \ System32 \ LogFiles \ HTTPERR \ के तहत इन अनुरोधों का एक लॉग देख सकते हैं

मुझे नहीं पता कि क्या आप उस प्रतिक्रिया पृष्ठ को कॉन्फ़िगर कर सकते हैं जो इस प्रकार की त्रुटि के लिए उपयोगकर्ता को वापस भेजा जाता है, लेकिन चूंकि बिंग इस समस्या से ग्रस्त है, इसलिए मुझे संदेह है कि या तो संभव नहीं है या कुछ भयानक सिस्टम हैक की आवश्यकता होगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.