ValidateRequest = "असत्य" Asp.Net 4 में काम नहीं करता है


156

मेरे पास एक फॉर्म है जिस पर मैं ckeditor का उपयोग करता हूं। इस फॉर्म ने Asp.Net 2.0 और 3.5 पर ठीक काम किया लेकिन अब यह Asp.Net 4+ में काम नहीं करता है। मेरे पास ValidateRequest = "false" निर्देश है। कोई सुझाव?


किसी को परवाह होने पर सत्यापन नियंत्रण को ठीक से प्रस्तुत करने के बारे में संक्षिप्त लेख है: .NET 4 में त्रुटि सत्यापन
इयान

किसी को भी कृपया मुझे बता सकते हैं कि ValidationRequest = false का उपयोग करने की क्या कमियां हैं?
fc123

जवाबों:


194

त्रुटि पृष्ठ पर समाधान मिला। बस requestValidationMode = "2.0" जोड़ने की आवश्यकता है

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime requestValidationMode="2.0" />
</system.web>

MSDN जानकारी: HttpRuntimeSection.RequestValidationMode गुण


1
यह बहुत बढ़िया है, लेकिन क्या किसी को इस पृष्ठ को सेट करने का कोई तरीका पता है? इसके अलावा मैं इसे web.config में कैसे डालूं ताकि यह अभी भी .NET 2 के साथ काम करे?
एम.के.

1
@MK: मुझे नहीं लगता कि इस सेटिंग के लिए कोई पृष्ठ निर्देश है। आप इसे .net 2 पर नहीं चला सकते। मुझे नहीं लगता कि यह आवश्यक होगा। क्योंकि आप केवल एक फ्रेमवर्क संस्करण को लक्षित करके एक वेब ऐप बना सकते हैं। बस इस लाइन को .net 4 web.config पर कॉपी करें जिसकी जरूरत है ...
हसनगं

2
लेकिन .net 4 के लिए मान्यता में क्या बदलाव आया है? क्या सत्यापन मोड को बदले बिना ऐसा करने का कोई तरीका है?
स्लाई

4
: @Sly: आप इस सवाल का जवाब यहां पा सकते हैं asp.net/learn/whitepapers/aspnet4/...
HasanG

किसी को भी कृपया मुझे बता सकते हैं कि क्यों asp.net 4.0 में requestValidationMode = "2.0" का उपयोग करना एक अच्छा विचार है?
fc123

102

एक पृष्ठ के लिए सत्यापन को 2.0 पर वापस करने का एक तरीका है। बस नीचे दिए गए कोड को अपने web.config में जोड़ें:

<configuration>
    <location path="XX/YY">
        <system.web>
            <httpRuntime requestValidationMode="2.0" />
        </system.web>
    </location>

    ...
    the rest of your configuration
    ...

</configuration>

स्थान कोई भी पथ है, और आपके द्वारा ट्री में निर्दिष्ट फ़ोल्डर के नीचे किसी भी नोड पर आधारित है।
DFTR

7
यह स्वीकार किए गए उत्तर की तुलना में बेहतर समाधान है क्योंकि यह स्थान मार्ग में आपके द्वारा निर्धारित विशिष्ट दायरे तक सीमित नहीं बल्कि विस्तृत है
चार्ल्स वेस्ले

5
ऊपर <स्थान ..> घोषणा को <कॉन्फ़िगरेशन> घोषणा के अंदर रखा जाना चाहिए, लेकिन आगे किसी भी स्थान पर नहीं।
rassassett

1
प्रति पेज सेटिंग .NET 4.6.1 को लक्षित करने वाली परियोजनाओं के लिए काम नहीं कर रही है।
डेनिस टी

56

मुझे पता है कि यह एक पुराना सवाल है, लेकिन अगर आप MVC 3 में इस समस्या का सामना करते हैं, तो आप अपने ActionMethodसाथ सजावट कर सकते हैं [ValidateInput(false)]और बस एकल के लिए अनुरोध सत्यापन को बंद कर सकते हैं ActionMethod, जो आसान है। और आपको web.configफ़ाइल में कोई भी बदलाव करने की आवश्यकता नहीं है , इसलिए आप अभी भी हर जगह .NET 4 अनुरोध सत्यापन का उपयोग कर सकते हैं।

जैसे

[ValidateInput(false)]
public ActionMethod Edit(int id, string value)
{
    // Do your own checking of value since it could contain XSS stuff!
    return View();
}

1
@RossCooper यह asp.net MVC के लिए ही है
mxmissile

28

यह सत्यापन मोड को बदले बिना काम करता है।

आपको एक System.Web.Helpers.Validation.Unvalidatedसहायक का उपयोग करना होगा System.Web.WebPages.dll। यह एक ऐसी UnvalidatedRequestValuesवस्तु को वापस करने जा रहा है जो बिना सत्यापन के फॉर्म और QueryString को एक्सेस करने की अनुमति देता है।

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

var queryValue = Server.UrlDecode(Request.Unvalidated("MyQueryKey"));

मेरे लिए MVC3 और .NET 4 के लिए काम करता है।


1
क्या आप इस विधि के साथ एक क्वेरीस्ट्रीमिंग को पुनः प्राप्त करने का एक उदाहरण प्रदान कर सकते हैं? मुझे लगता है कि 'असंबद्ध का सदस्य नहीं है ...' सभी वस्तुओं को मैं इसे जोड़ने की कोशिश करता हूं। मुझे लगता है कि मुझे इसमें शामिल होने की याद आ रही है
CodedMonkey

3
var queryValue = Server.UrlDubble (Request.Unvalidated ("MyQueryKey"));
सूफूका

1
यह निश्चित रूप से स्वीकृत उत्तर होना चाहिए। सुरक्षा बनाए रखता है और बेहद लचीला है क्योंकि आप इसे चयनात्मक आधार पर उपयोग कर सकते हैं।
cmartin

वेब फ़ॉर्म के लिए आपको सत्यापन त्रुटि से बचने के लिए QueryString संग्रह में प्रविष्टि को बदलना होगा- एक संभावित खतरनाक अनुरोध देखें। ग्राहक को html मार्क कॉल से asp.net पेज पर html मार्कअप भेजते समय क्लाइंट से मूल्य का पता लगाया गया था
माइकल फ्रीजेन

15

ध्यान दें कि एक और दृष्टिकोण 4.0 सत्यापन व्यवहार के साथ रखना है, लेकिन अपनी स्वयं की कक्षा को परिभाषित करना है जो इससे उत्पन्न होती है RequestValidatorऔर सेट होती है:

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

(कहाँ YourNamespace.YourValidatorअच्छा है, आप अनुमान लगाने में सक्षम होना चाहिए ...)

इस तरह से आप 4.0s व्यवहार के फायदे (विशेष रूप से, कि पहले प्रसंस्करण में सत्यापन होता है) के फायदे रखते हैं, जबकि उन अनुरोधों को भी अनुमति देते हैं जिनके माध्यम से आपको गुजरने की आवश्यकता होती है।


7
यह जानकर अच्छा लगता है। लेकिन मुझे अभी भी लगता है कि ASP.Net का संपूर्ण अनुरोध सत्यापन सुविधा पथभ्रष्ट है। इनपुट अपने आप में समस्या नहीं है, यह वही है जो आप इसके साथ करते हैं। यह SQL, HTML, या जावास्क्रिप्ट कोड को आपके ऐप के इनपुट के रूप में स्वीकार करने के लिए पूरी तरह से मान्य हो सकता है, जब तक कि आप इसे आउटपुट करने से पहले इसे एन्कोडिंग / एग्जॉस्ट कर रहे हैं या इसे अपने डेटाबेस में स्टोर करते हैं।
जॉर्डन राइगर

2
@JordanRieger मैं आंशिक रूप से सहमत हूँ। OOTB, इसमें कम से कम सुरक्षित करने के लिए डिफ़ॉल्ट होने का लाभ है (0wned के बजाय चीजों के माध्यम से और आपको त्रुटियां मिलती हैं), लेकिन यह एक उपद्रव का एक सा है और पूर्व 4.0 व्यवहार बहुत-या-कुछ भी नहीं है। एक कस्टमाइजेशन लेयर की क्षमता के लिए कुछ है जो कस्टम रिक्वेस्ट वैलीटेशन टाइप के साथ किसी भी अन्य प्रोसेसिंग से पहले उपयोग किया जाता है, लेकिन बहुत से सत्यापन को अन्य प्रोसेसिंग के साथ अधिक बंधे होने की आवश्यकता होती है। सभी में मुझे लगता है कि यह अच्छी आदतों को प्रोत्साहित करने के बजाय कुछ (लेकिन सभी नहीं) से बुरी आदतों वाले लोगों की रक्षा करने के लिए अधिक करता है।
जॉन हन्ना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.