2012-07-06 12 views
5

this question के समान है, लेकिन मुझे इस बात की परवाह नहीं है कि कौन से वर्ण त्रुटि को आग लगेंगे/नहीं करेंगे। मैं अधिक उत्सुक हूं कि मैं किस विधि को कॉल कर सकता हूं, खुद को जांचने के लिए, यदि वर्तमान स्ट्रिंग उपरोक्त त्रुटि संदेश को आग लग जाएगी।यह जांचने के लिए कि क्या स्ट्रिंग आग लगती है "एक संभावित खतरनाक अनुरोध। फॉर्म मान पता चला ..." त्रुटि

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

इस विषय के आसपास पदों की प्रचुर मात्रा में उल्लेख किया है, ValidateRequest=false (या .NET 4.0 के लिए <httpRuntime requestValidationMode="2.0" />) इन कारनामों के लिए जाँच नेट बंद करने के लिए इस्तेमाल किया जा सकता है, लेकिन मैं किसी भी कारण की इस अतिरिक्त परत खोने के लिए नहीं दिख रहा है सुरक्षा जब मैं पहली जगह में स्ट्रिंग बना रहा हूं। और बस एक अपूर्ण सूची (<, &#, आदि) पर पुनः यादृच्छिक करने के लिए यादृच्छिक जनरेटर को स्पष्ट रूप से बताएं, यह सबसे साफ समाधान की तरह प्रतीत नहीं होता है, इसलिए मैं जांच कर रहा हूं कि .NET का उपयोग करने के समान तरीके का उपयोग करना है।

माइक्रोसॉफ्ट के स्पष्टीकरण का क्या सवाल है और उनके खिलाफ सुरक्षा के लिए क्या किया जा रहा है here

This guy प्रतिबिंबक के साथ खुदाई के बाद IsDangerousString नामक फ़ंक्शन खोजने के बारे में वार्ता, लेकिन मैं इसका उपयोग करने के लिए इस फ़ंक्शन को नहीं ढूंढ पा रहा हूं। इसके अलावा वह .NET 1.1 का जिक्र कर रहा है और मैं .NET 3.5

+0

दिलचस्प सवाल है, लेकिन मैं एक कारण है कि आप इस तरह के अस्पष्ट अक्षर शामिल हैं नहीं दिख रहा। मैं शायद बाइट [] भरने के लिए RandomNumberGenerator क्लास का उपयोग करता हूं और फिर बाइट को स्ट्रिंग में एन्कोड करने के लिए z-base32 एन्कोडर का उपयोग करता हूं। – Shelakel

+2

आप "शोषण" चरित्र को जानते हैं जिसे आप अनुमति देना चाहते हैं क्यों एचटीएमएल उन्हें पोस्ट से पहले एनकोड नहीं करता है और फिर एचटीएमएल उन्हें वापस डीकोड करता है – HatSoft

+0

@ शेलकेल निश्चित रूप से, यादृच्छिक पासवर्ड उत्पन्न करने के कई अन्य तरीके हैं। दुर्भाग्यवश, हालांकि, हम इस परियोजना के लिए पासवर्ड के साथ 4 वर्ण नियमों (लोअरकेस, अपरकेस, संख्या, विशेष चार) को पूरा करने के लिए आवश्यक हैं। बेशक, मैं केवल अपमानजनक "अस्पष्ट" पात्रों को हटा सकता हूं, लेकिन चूंकि कल्पना बहुत स्पष्ट नहीं है क्योंकि मैं उसी कार्य का उपयोग करना चाहता हूं जो सिस्टम को जांचना है। – Mercurybullet

उत्तर

5

एएसपी.NET क्लास अनुरोधों को मान्य करता है System.Web.CrossSiteScriptingValidation है, और जिस विधि को आप चाहते हैं वह IsDangerousString है। दुर्भाग्यवश, दोनों को internal चिह्नित किया गया है, इसलिए आप उन्हें सीधे एक्सेस नहीं कर सकते हैं। आपके पास कई विकल्प हैं:

विकल्प 1: प्रतिबिंब के माध्यम से IsDangerousString पर कॉल करें। हालांकि, माइक्रोसॉफ्ट किसी भी समय विधि बदल सकता है, जो आपके आवेदक को तोड़ देगा।

विकल्प 2: डीकंपाइल IsDangerousString और इसे अपने स्वयं के एप्लिकेशन पर कॉपी करें। नीचे दिया गया कोड देखें।

विकल्प 3: कॉल Membership.GeneratePassword। यह एक पासवर्ड देता है जो अनुरोध सत्यापन पास करने की गारंटी देता है। ASP.NET CrossSiteScriptingValidation वर्ग (.NET परावर्तक के माध्यम से) से

अंशः

private static char[] startingChars = new char[] { '<', '&' }; 

internal static bool IsDangerousString(string s, out int matchIndex) 
{ 
    matchIndex = 0; 
    int startIndex = 0; 
    while (true) 
    { 
     int num2 = s.IndexOfAny(startingChars, startIndex); 
     if (num2 < 0) 
     { 
      return false; 
     } 
     if (num2 == (s.Length - 1)) 
     { 
      return false; 
     } 
     matchIndex = num2; 
     char ch = s[num2]; 
     if (ch != '&') 
     { 
      if ((ch == '<') && ((IsAtoZ(s[num2 + 1]) || (s[num2 + 1] == '!')) || ((s[num2 + 1] == '/') || (s[num2 + 1] == '?')))) 
      { 
       return true; 
      } 
     } 
     else if (s[num2 + 1] == '#') 
     { 
      return true; 
     } 
     startIndex = num2 + 1; 
    } 
} 

private static bool IsAtoZ(char c) 
{ 
    return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))); 
} 
+3

जानकारी के लिए धन्यवाद।चूंकि फ़ंक्शन आंतरिक है और मैं इसे अपडेट के लिए सीधे एक्सेस नहीं कर पाऊंगा, क्या कोई कारण है कि केवल निम्नलिखित रेगेक्स (ignoreCase के साथ) का उपयोग न करें? '\ <[a-z! /?] | & #' – Mercurybullet

+0

रेगेक्स विकल्प 2 के बराबर है, केवल इतना संक्षिप्त है। :-) यह शायद सबसे अच्छा है जो आप अभी कर सकते हैं। एएसपी.नेट के अगले संस्करण में, हालांकि, आप [HttpRequest.Unvalidated] (http://msdn.microsoft.com/en-us/library/system.web का उपयोग करके कुछ फ़ील्ड के लिए सत्यापन को छोड़ने में सक्षम होंगे। .httprequest.unvalidated (v = VS.110) .aspx) संपत्ति। –

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

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