2012-01-06 11 views
8

मेरे पास एक एकीकृत प्रबंधित पाइपलाइन के साथ आईआईएस 7.0 पर चलने वाला मानक एएसपी.Net वेबफॉर्म एप्लिकेशन है। हमारी साइट पर कई छवियों में उनके फाइल नामों में रिक्त स्थान हैं (उदा। './baseball drawing.gif')। जब हमने अपनी एचटीएमएल पन्नों में इन छवियों जगह हम रास्तों सांकेतिक शब्दों में बदलना है ताकि हमारे एचटीएमएल img टैग इस < img src='./baseball%20drawing.gif' />डबल यूआरएल एनकोडेड अनुरोध पथ मान्य होने की अनुमति दें

अब की तरह लग रहे यूआरएल, समस्या में जब कुछ खोज इंजन और webcrawlers हमारी साइट सूचकांक करने की कोशिश आता है। जब वे हमारे पृष्ठों को स्क्रैप करते हैं तो वे हमारे पहले से ही एचटीएमएल-एन्कोडेड पथों को एन्कोड करेंगे जो इस './baseball%2520drawing.gif' जैसे छवि लिंक प्राप्त करते हैं, जहां %25 '%' के लिए यूआरएल एन्कोडिंग है। इससे दो समस्याएं आती हैं:

  1. जब उपयोगकर्ता इन खोज इंजनों से परिणाम प्राप्त करते हैं तो उन्हें टूटी हुई लिंक मिलती हैं।
  2. जब उपयोगकर्ता इन टूटी हुई लिंक पर नेविगेट करने का प्रयास करते हैं तो यह हमारे सिस्टम में त्रुटियों को फेंकता है।

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

मैं यह जानने का प्रयास कर रहा हूं कि इस समस्या को कोई किस्मत के साथ कैसे ठीक किया जाए। यहाँ मैं क्या कोशिश की है है: web.config में

  1. सेट <requestFiltering allowDoubleEscaping='true'> "404.11 यूआरएल डबल बच त्रुटि" को रोकने के लिए। इसने पहली त्रुटि तय की लेकिन एक नया कारण बन गया, "एक संभावित खतरनाक अनुरोध। पाथ मिला"।
  2. "संभावित खतरनाक Request.Path" त्रुटि को रोकने के लिए <httpRuntime requestPathInvalidChars> से '%' को हटा दिया गया। इसने दूसरी त्रुटि तय की लेकिन अब हमारे पास तीसरा है, "संसाधन नहीं मिला"।
  3. मैंने Request.Path देखने के लिए अपने कोड में एक ब्रेक लगाया। ऐसा लगता है कि यह 'बॉल% 2520Image.gif' के बजाय 'Ball Image.gif' के मान के साथ सही है। इस मामले के साथ मुझे यकीन नहीं है कि यह क्यों काम नहीं कर रहा है।

मुझे लगता है कि मेरे पास एक सुपर हैक है जहां मुझे वास्तव में समझने के बिना सब कुछ अक्षम करना है क्यों कुछ भी काम नहीं कर रहा है। तो मुझे लगता है कि मेरा प्रश्न तीन गुना

  1. समाधान प्रयास 1 समस्या का ख्याल क्यों नहीं आया?
  2. समाधान 2 समस्या का ख्याल क्यों नहीं रखता?
  3. मेरा अनुरोध क्यों है। पैथ चरण 3 में सही दिखता है लेकिन यह अभी भी काम नहीं करता है?

कोई भी सहायता जो भी प्रदान कर सकता है उसकी सराहना की जाएगी।

+0

ब्याज से, कौन सा खोज इंजन टूटा हुआ है? –

+0

अच्छा सवाल। स्वच्छ छवि खोज एक है (http://www.cleanimagesearch.com)। "बेसबॉल छवि" के लिए खोज के बारे में मैं क्या कह रहा हूं इसका एक उदाहरण देखने के लिए। आने वाली पहली छवियों में से एक तोड़ा जाएगा। यदि आप उस छवि के लिंक पर क्लिक करते हैं और यूआरएल में% 25 को प्रतिस्थापित करते हैं तो बस सब कुछ ठीक काम करेगा। वहां बहुत सारी जंक साइटें भी हैं जो पूरे वेब से छवियों का एक समूह है जिसमें टूटी हुई लिंक भी शामिल हैं। यदि आप इनमें से किसी एक का उदाहरण चाहते हैं तो मैं आपको एक लिंक ईमेल कर सकता हूं (मुझे इस तरह की साइटों पर भरोसा नहीं है इसलिए मैं यहां लिंक प्रकाशित नहीं करना चाहता हूं)। –

+0

मुझे यह भी लगता है कि यह समस्या आईपैड पर Google छवि खोज करते समय होती है। उस स्थिति में, हालांकि, Google विफलता को संभालने के लिए पर्याप्त स्मार्ट है ताकि छवि अभी भी सही तरीके से प्रदर्शित हो। हमें बस हमारी लॉग फाइलों में एक त्रुटि मिलती है। GoogleAgent एक आईपैड होने पर Google के कारण होने वाली सभी त्रुटियों को अनदेखा करने के लिए हमारे पास एक फ़िल्टर है और त्रुटि यह है कि Request.Path में% है। –

उत्तर

15

ठीक है, इंटर्ननेट और प्रयोग के बहुत सारे खोज के बाद मुझे लगता है कि मैं अंत में समझ रहा हूं कि क्या हो रहा है। मेरी मुख्य समस्या अत्यधिक पुष्टि पूर्वाग्रह का मामला था। मैंने जो कुछ भी पढ़ा वह कहा कि मैं वास्तव में जो कहता हूं उससे ज्यादा सुनना चाहता था।मैं अपने प्रश्न का उत्तर देने के लिए समझने के लिए आवश्यक महत्वपूर्ण बिंदुओं को सारांशित करने जा रहा हूं।

  1. सबसे पहले, मुझे यह समझने की आवश्यकता है कि आईआईएस और एएसपी.Net दो अलग-अलग अनुप्रयोग हैं। संक्षेप में आईआईएस क्या करता है, एक अनुरोध प्राप्त होता है, जो रूट को संभालने वाले एप्लिकेशन से अनुरोध करता है, हैंडलिंग एप्लिकेशन से आउटपुट प्राप्त करता है, और उसके बाद एप्लिकेशन से आउटपुट को अनुरोधकर्ता को भेजता है। आईएसआई से अनुरोध क्या प्राप्त होता है, इसे संभालता है, और उसके बाद आईआईएस को प्रतिक्रिया पास करता है। यह पूरी प्रक्रिया का एक बड़ा अति-सामान्यीकरण है, लेकिन यहां मेरे उद्देश्यों के लिए यह काफी अच्छा है। 1

  2. आने वाले एएसपी.NET अनुरोधों को दो द्वारपालों से गुजरना होगा। IIS7 RequestFiltering मॉड्यूल (system.webserver/requestFiltering में कॉन्फ़िगर किया गया), और उसके बाद ASP.Net HttpRuntime अनुरोध फ़िल्टर (system.web/httpRuntime 3 में कॉन्फ़िगर किया गया)।

  3. आईआईएस अनुरोधफिल्टरिंग मॉड्यूल एकमात्र ऐसा है जो आने वाले अनुरोधों को सामान्य करता है और यह केवल एक बार सामान्यीकरण लागू होता है। दोबारा मैं इसे दोहराता हूं केवल इसे एक बार लागू करता है। भले ही <requestFiltering allowDoubleEscaping="true" /> यह अभी भी एक बार सामान्यीकरण लागू करेगा। तो इसका मतलब है '% 2520' को '% 20' के लिए सामान्यीकृत किया जाएगा। इस बिंदु पर अगर अनुमति दें DoubleDscaping गलत है IIS अनुरोध को तब तक नहीं दे पाएगा क्योंकि '% 20' अभी भी सामान्यीकृत हो सकता है। यदि, हालांकि, DoubleDscaping को सत्य पर सेट करने की अनुमति है तो IIS7 अगले गेटकीपर, एएसपी.Net को '% 20' अनुरोध को पास कर देगा। यह पहली त्रुटि का कारण था।

  4. Asp.net फ़िल्टर वह है जहां अनुरोध पाथइनवाल्ड कैरेक्टरों की जांच की जाती है। तो अब हमारा '% 20' अमान्य है क्योंकि डिफ़ॉल्ट रूप से '%' अनुरोधपाथलिड कैरेक्टर का हिस्सा है। अगर हम उस सूची से '%' को हटा देते हैं तो हम इसे दूसरे द्वारपाल के माध्यम से बना देंगे और एएसपी.Net हमारे अनुरोध को संभालने का प्रयास करेगा। यह दूसरी त्रुटि का कारण था।

  5. अब एएसपीनेट सर्वर पर हमारे वर्चुअल पथ को भौतिक एक में परिवर्तित करने का प्रयास करेगा। दुर्भाग्यवश, हमारे पास अभी भी हमारे पथ में '% 20' है, '' हम चाहते हैं कि एएसपी.Net हमारे द्वारा इच्छित संसाधन को ढूंढने में सक्षम न हो और "संसाधन को त्रुटि नहीं मिल सकती"। जब मैंने अपने कोड में तोड़ दिया तो पथ मेरे लिए सही कारण था क्योंकि मैंने Request.Url प्रॉपर्टी पर एक घड़ी रखी थी। यह संपत्ति अपनी ToString() विधि में अपना सामान्यीकरण लागू करके सहायक होने की कोशिश करती है जिससे हमारे% 20 को '' 'जैसा दिखाना चाहिए, भले ही हम नहीं चाहते हैं। यह अंतिम त्रुटि का कारण था।

यह काम हम चाहते हैं कि पहले दो गेटकीपर के बाद अनुरोध प्राप्त करता है और पूरी तरह से यह ASP.Net को सौंपने से पहले यह हमारे अपने को सामान्य कस्टम मॉड्यूल लिख सकता है बनाने के लिए। ऐसा करने के बावजूद किसी भी चरित्र को तब तक आने की अनुमति होगी जब तक यह यूआरएल एन्कोड किया गया हो। उदाहरण के लिए, हम आमतौर पर हमारे पथ में '<' या '>' को अनुमति नहीं देना चाहते हैं क्योंकि इन्हें हमारे कोड में टैग डालने के लिए उपयोग किया जा सकता है। चूंकि चीजें अभी < पर काम करती हैं और> एएसपी.Net फ़िल्टर से पहले नहीं मिलेंगी क्योंकि वे अनुरोध पैथइनवालिड कैरेक्टर्स का हिस्सा हैं। हालांकि,% 253C और% 253E के रूप में एन्कोड किया गया है, यदि वे पहले दो द्वार खोलते हैं और फिर एएसपी.Net को सौंपने से पहले हमारे अपने कस्टम मॉड्यूल में अनुरोध को सामान्य कर सकते हैं।

निष्कर्ष में,% 2520 को पूर्ण सामान्यीकृत करने की अनुमति देने के लिए एक बड़ा सुरक्षा छेद बनाने के बिना नहीं किया जा सकता है। यदि अनुरोधकर्ता फ़िल्टरिंग मॉड्यूल को पहले दो गेटकीपरों के खिलाफ उस अनुरोध का परीक्षण करने से पहले प्राप्त होने वाले प्रत्येक अनुरोध को पूरी तरह से सामान्य करने के लिए संभव था तो यह अधिक सुरक्षित होगा लेकिन अभी यह कार्यक्षमता उपलब्ध नहीं है।

अगर मुझे कुछ गलत मिला तो मुझे बताएं और मुझे उम्मीद है कि यह किसी की मदद करेगा।

+1

वास्तव में अच्छा और स्पष्ट स्पष्टीकरण। एमएस डॉक्स का हिस्सा होना चाहिए, इमो के रूप में, वे इस पर खराब हो गए। –

+0

@GrimaceofDespair धन्यवाद Grimace –

+0

शानदार। इससे मुझे एक बहुत ही समान समस्या का समाधान करने में मदद मिली। मुझे यह इंगित करना चाहिए कि # 2 में, "in" system.webserver/requestFiltering system.webserver/security/requestFiltering होना चाहिए। आखिर में मैं global.asax में यूआरएल डिकोडिंग को संभालने में सक्षम था। – secretwep

0

आप डबल एस्केपिंग की अनुमति देना चाहते हैं, तो आप पर http://www.iis.net/ConfigReference/system.webServer/security/requestFiltering

यह आवश्यकता नहीं विन्यास के साथ IIS 7.0 पर मेरे लिए काम किया निर्देशों का पालन कर सकते हैं। डबल-एस्केपिंग का उस वेब साइट के कोड के लिए कोई प्रभाव नहीं पड़ता है जिस पर मैंने इसे लागू किया था; मुझे नहीं पता कि अन्य साइटों के लिए संभावित सुरक्षा प्रभाव क्या हो सकते हैं।

+0

एंड्रयू का जवाब देने के लिए समय निकालने के लिए धन्यवाद। जब तक कि मैंने कुछ निर्देशों को याद नहीं किया है, वही हैं जिन्हें मैंने पहले से ही डबल एस्केपिंग सक्षम करने के लिए किया है। यहां मैंने देखा है (http://cl.ly/270I3E3n2U1Z1p0S1F3P)। यह मुझे आश्चर्यचकित करता है कि अगर हमारे पास कुछ अन्य कॉन्फ़िगरेशन सेटिंग सेट है ताकि यह सही तरीके से काम नहीं कर रहा हो। हालांकि मुझे ऐसा कुछ भी नहीं मिला है। जब मैं सोमवार को काम करता हूं तो मैं एक नई वेबसाइट तैयार करूंगा और देख सकता हूं कि यह अभी भी मेरे लिए काम नहीं करता है। यह हमें बताएगा कि यह मेरी साइट पर कुछ और सेटिंग है या नहीं। –

+0

मैंने आज सुबह एक खाली परीक्षण साइट स्थापित की जिसमें कुछ भी नहीं बल्कि एक छवि और मूल web.config फ़ाइल है। आप यहां देख सकते हैं कि यह सही URL एन्कोडिंग http://cl.ly/301o3A3k0x3c2i3E3p1s के साथ काम करता है। मेरी वेब.कॉन्फिग फ़ाइल को संशोधित किए बिना% 2520 का उपयोग करते समय मुझे यह त्रुटि http://cl.ly/1Y2w2N3D401d1U2s0s2n मिलती है। तो मैं अमान्य वर्णों से% को हटा देता हूं और यह http://cl.ly/1C0e2q3F1v1d0Q1N0E2h प्राप्त करता हूं। अब मैं डबल यूआरएल एन्कोडिंग की अनुमति देता हूं और यह http://cl.ly/2O0k2I1q3Q0D0x0E3O2m प्राप्त करता हूं। मुझे यकीन नहीं है कि यह आपके लिए या किसी और के लिए किसी अन्य कॉन्फ़िगरेशन के बिना कैसे काम करता है लेकिन ऐसा लगता है। –

+0

(देरी से प्रतिक्रिया के लिए खेद है।) क्या आप कह रहे हैं कि यह केवल तब काम करता है जब आप केवल आईआईएस में कॉन्फ़िगरेशन बदलते हैं और web.config नहीं? यही वह परिदृश्य है जो मेरे लिए काम करता है। मैंने आईआईएस कॉन्फ़िगरेशन के साथ शुरुआत की, और जैसा कि मैंने काम किया, मैं web.config को बदलने के लिए आगे नहीं गया। –