2009-06-24 16 views
5

मैं एक पुराने क्लासिक एएसपी वेबसाइट को asp.net में परिवर्तित कर रहा हूं।क्या एचटीपी मॉड्यूल के साथ कुछ पोस्ट डेटा को हटाना संभव है?

एप्लिकेशन मूल रूप से उपयोगकर्ताओं के दिए गए सेट के लिए टूल सेट का विस्तार है लेकिन यह बाहरी विक्रेता पर होस्ट किया जाता है।

इस एप्लिकेशन में एक निर्बाध हस्तांतरण करने के लिए यह कुछ एक्सएमएल डेटा पोस्ट करता है जो "संभावित खतरनाक अनुरोध। फॉर्म वैल्यू" को फायर कर रहा है। मुझे पता है कि मैं validateRequest ध्वज बंद कर सकता हूं लेकिन मैं ऐसा नहीं करता।

मैंने एक httpmodule लिखा है जो इस डेटा को लेता है और उपयोगकर्ता को प्रमाणीकृत करने के लिए इसका उपयोग करता है, क्या पहले से ही पोस्ट डेटा में इन "खराब" मानों को हटाने के लिए, उसी मॉड्यूल या उस मामले के लिए एक अलग मॉड्यूल का उपयोग करना संभव है वह डेटा "मान्य" है?

अन्यथा यदि इनमें से कोई भी विचार काम नहीं करता है, तो मैं अन्य सुझावों के लिए खुला हूं।

उत्तर

7

हां। निम्न श्रेणी IHttpModule इंटरफ़ेस और रजिस्ट्रार और ईवेंट लागू करती है जो HttpRequestValidationException जांच से पहले आग लगती है। यह जांचता है कि अनुरोध एक पोस्ट है और "testinput" शून्य नहीं है और फिर HTML इसे एन्कोड करता है। कक्षा को आपके Web.config में httpModule के रूप में पंजीकृत होना आवश्यक है।

वर्ग ...

using System; 
using System.Collections.Specialized; 
using System.Reflection; 
using System.Web; 

public class PrevalidationSanitizer : System.Web.IHttpModule 
{ 
    private HttpApplication httpApp; 

    public void Init(HttpApplication httpApp) 
    { 
     this.httpApp = httpApp; 
     httpApp.PreRequestHandlerExecute += new System.EventHandler(PreRequestHandlerExecute_Event); 
    } 

    public void Dispose() { } 

    public void PreRequestHandlerExecute_Event(object sender, System.EventArgs args) 
    { 
     NameValueCollection form = httpApp.Request.Form; 

     Type type = form.GetType(); 

     PropertyInfo prop = type.GetProperty("IsReadOnly", BindingFlags.Instance 
      | BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); 

     prop.SetValue(form, false, null); 

     if (httpApp.Request.RequestType == "POST" != null 
      && httpApp.Request.Form["testinput"]) 
       httpApp.Request.Form.Set("testinput" 
        , httpApp.Server.HtmlEncode(httpApp.Request.Form["testinput"])); 
    } 
} 

web.config प्रविष्टि ...

<system.web> 
    <httpModules> 
    <add type="PrevalidationSanitizer" name="PrevalidationSanitizer" /> 
... 
+0

आह, यह चालाक है! मुझे नहीं पता था कि आप फॉर्म ऑब्जेक्ट को इस तरह लिखने योग्य बना सकते हैं।मुझे लगता है कि डेव की समस्या का समाधान सुरक्षा क्रेडेंशियल्स को पार्स करना होगा और फ़ॉर्म.रोमोव() – Alex

+0

का उपयोग करके फ़ॉर्म संग्रह ऑब्जेक्ट से उन्हें हटा देना कितना अच्छा होगा, इसे उत्तर के रूप में चिह्नित करना, हालांकि मैंने इसे स्वयं परीक्षण नहीं किया है – Dave

+1

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

0

मैं HTML फॉर्म के माध्यम से फ़ील्ड पोस्ट में XML डेटा रखने के खराब पैटर्न को कारगर करने का लुत्फ उठाऊंगा। मैं समझता हूं कि आप "निर्बाध रूप से" बंदरगाह करना चाहते हैं, जिसका अर्थ है कि आप एक समय के लिए एएसपी और एएसपीएक्स पृष्ठों को बनाए रखने में सक्षम होना चाहते हैं। हालांकि इस मामले में आपको एक ही समय में फॉर्म के फॉर्म और एक्शन लक्ष्य को बदलने पर विचार करना चाहिए।

मुझे लगता है कि यह सलाह के समान है मैंने here दिया। केवल इस मामले में स्थिति खराब है कि मूल एएसपी में कोड का पैटर्न वांछित से कम हो जाता है, यहां तक ​​कि क्लासिक एएसपी की सीमाओं के भीतर भी।

यदि आप एक ही समय में एएसपी फॉर्म और उसके एक्शन पेज को पूरी तरह से बंद नहीं करना चाहते हैं तो एक्सएसआर को एक्सएचआर का उपयोग करने के लिए एएसपी पेज को संशोधित करने पर विचार करें ताकि एक्सएमएल को एएसएक्स पर पोस्ट किया जा सके जो एक्सएमएल को कहीं सुरक्षित रखता है और एक GUID देता है । एक्सएमएल मूल रूप से आयोजित फ़ील्ड के बजाय एक छिपे हुए फ़ील्ड में लौटाए गए GUID को रखें। प्राप्त एएसपीएक्स पृष्ठ में पहले पोस्ट किए गए एक्सएमएल को पुनः प्राप्त करने के लिए GUID का उपयोग करें।

+0

आवेदन जो डेटा मैं कोई नियंत्रण नहीं है पोस्ट कर रहा है। मैं पूरे विक्रेता आवेदन को एएसपीएक्स से एएसपीएक्स में बदलने पर योजना बना रहा हूं। मैं इस पर प्रतिक्रिया का इंतजार कर रहा हूं और उम्मीद कर रहा हूं कि मैं फॉर्म एक्शन बदल सकता हूं लेकिन मुझे यकीन नहीं है कि विभाग कितना लचीला होगा। – Dave

0

बहुत परेशानी की तरह लगता है। validateRequest का उपयोग पृष्ठ के स्तर को ध्वजांकित करने के बारे में इतना बुरा क्या है?

बस सुनिश्चित करें कि आप सही ढंग से इनपुट को स्वच्छ कर दें और इसे एन्कोड करें यदि आपको इसे कहीं भी स्टोर करने की आवश्यकता है और/या सुनिश्चित करें कि आप ब्राउज़र को एन्कोड किए बिना ब्राउज़र में वापस थूक नहीं देते हैं।

+0

चूंकि ग्राहक इन क्रेडेंशियल्स को किसी भी पेज पर पोस्ट कर सकता है, इसलिए मुझे प्रत्येक पृष्ठ – Dave

+0

के लिए मान्य अनुरोध बंद करना होगा, मैं इनपुट स्ट्रीम पर एक फ़िल्टर का सुझाव देने जा रहा था, लेकिन इसका निपटारा करने के लिए सिरदर्द का अपना सेट है। CptSkippy का एक अच्छा समाधान है! – Alex

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