उपयोगकर्ता को ASP.NET MVC में HTML इनपुट करने की अनुमति दें - ValidateInput या AllowHtml


120

मैं किसी उपयोगकर्ता को ASP.net MVC का उपयोग करके किसी विशेष क्षेत्र में HTML इनपुट करने की अनुमति कैसे दे सकता हूं।

मेरे पास कई फ़ील्ड्स के साथ एक लंबा फ़ॉर्म है जो नियंत्रक में इस जटिल ऑब्जेक्ट को मैप किया जाता है।

मैं एक फ़ील्ड बनाना चाहता हूं (विवरण) HTML की अनुमति देता है जिसे मैं बाद में अपने स्वयं के स्वच्छता को पहले से ही बताऊंगा।


3
भविष्य के आगंतुकों के लिए: IMHO, क्रिस जे या यूजीन बोसिकोव के उत्तर ASP.NET MVC के बाद के संस्करणों के लिए स्वीकृत एक से बेहतर हैं, खासकर यदि आप केवल एक क्षेत्र में HTML की अनुमति देना चाहते हैं।
एलसी।

जवाबों:


163

उस नियंत्रक में क्रिया (पोस्ट) के लिए निम्नलिखित विशेषता जोड़ें जिसे आप HTML के लिए अनुमति देना चाहते हैं:

[ValidateInput(false)] 

संपादित करें: चार्लिनो टिप्पणियों के अनुसार :

अपने web.config में उपयोग किए गए सत्यापन मोड को सेट करें। MSDN देखें :

<httpRuntime requestValidationMode="2.0" />

संपादित करें सितम्बर 2014: स्प्रिंट 252 टिप्पणियों के अनुसार :

आपको अब [AllowHtml]विशेषता का उपयोग करना चाहिए । MSDN से नीचे देखें :

ASP.NET MVC 3 अनुप्रयोगों के लिए, जब आपको अपने मॉडल पर HTML पोस्ट करने की आवश्यकता होती है, तो अनुरोध सत्यापन को बंद करने के लिए ValidateInput (गलत) का उपयोग न करें। बस अपनी मॉडल संपत्ति में [AllowHtml] जोड़ें, जैसे:

public class BlogEntry {
    public int UserId {get;set;}
    [AllowHtml] 
    public string BlogText {get;set;}
 }

1
यदि आप .NET 4 का उपयोग कर रहे हैं, तो आपको <httpRuntime requestValidationMode="2.0" />अपनी web.config फ़ाइल में भी सेट करना होगा ।
चार्लिनो

3
क्या वास्तव में .NET 4 के लिए कोई समाधान नहीं है जिसमें अनुरोध सत्यापन मोड को अपग्रेड करना शामिल नहीं है?
bzlm

20
MSDN ( msdn.microsoft.com/de-de/magazine/hh708755.aspx ) का कहना है कि, आपको ValidateInpute का उपयोग नहीं करना चाहिए और इसके बजाय AllowHtmlAttribute लें। (Did'nt अंग्रेजी संस्करण पाया)
अलेक्जेंडर श्मिट

8
उम्मीद है कि हाल ही में किए गए 3 डाउन वोटों को संबोधित करने के लिए संपादित करें ... यह एक 4 साल पुराना उत्तर था :)
केल्से

1
@ djack109 आमतौर पर, आप अपने दृश्य मॉडल के रूप में अपने EF मॉडल का उपयोग नहीं करते हैं। आप एक अलग वर्ग लिखेंगे जो आपके CRUD संचालन के लिए वास्तविक डेटा का प्रतिनिधित्व करता है। इस तरह जब आपका EF6 मॉडल पुनर्जीवित होता है, तो कुछ भी नहीं खोता है। आपको उन मॉडलों को भी पतला करना चाहिए जिनके पास केवल उस कार्य को करने की आवश्यकता होती है जिसे आप कार्य करना चाहते हैं।
एलन क्लार्क कोपलैंड जूनियर

131

[AllowHtml]संपत्ति के ऊपर विशेषता के बारे में क्या ?


5
यह मेरे लिए एक बेहतर तरीका है, जो किसी भी वैश्विक व्यवहार को बदलने से बचता है। मैंने अपने मॉडल पर एक संपत्ति में इस विशेषता को जोड़कर अपनी समस्या हल कर ली है।
जोनाथन सायस

2
पूरी तरह से क्रिस समाधान के साथ यहाँ सहमत हूँ, पूरे आवेदन के लिए html सत्यापन को अक्षम करने का कोई कारण नहीं है यदि आपको HTML इनपुट को स्वीकार करने में सक्षम होने के लिए एक मॉडल में केवल एक संपत्ति की आवश्यकता है। Web.config में मान्यता को हटाने से आपके ऐप में एक बड़ा सुरक्षा छेद खुल जाएगा।
मिगेल

1
दुर्भाग्य से यह काम नहीं करता है यदि आप मेटाडेटा
टाइप

@dav_i: यह समाधान के साथ ठीक काम करता है MetadataTypeAttributeऔर बेहतर है क्योंकि यह संपूर्ण ऑब्जेक्ट के बजाय केवल व्यक्तिगत फ़ील्ड पर HTML की अनुमति देता है।
कोडिंग किया

@TrueBlueAussie, मैं अपने mvc 4.0 वातावरण में घंटों से कोशिश कर रहा हूं और यद्यपि AllowHtml को यह काम नहीं करना चाहिए। मुझे हार स्वीकार करनी पड़ी और कम सुरक्षित विकल्प के साथ जाना पड़ा जो पैंट है। AllowHtml बस does not MetadataTypeAttribute के उपयोग के साथ काम करने लगते हैं
जूलियन गप्पी

42

मॉडल में जोड़ें:

using System.Web.Mvc;

और अपनी संपत्ति को

        [AllowHtml]
        [Display(Name = "Body")]
        public String Body { get; set; }

मेरे बिंदु से यह कोड इस त्रुटि से बचने का सबसे अच्छा तरीका है। यदि आप HTML संपादक का उपयोग कर रहे हैं, तो आपके पास सुरक्षा मुद्दे नहीं होंगे क्योंकि यह पहले से ही प्रतिबंधित है।


9

[AllowHtml]विशिष्ट संपत्ति पर जोड़ना अनुशंसित समाधान है क्योंकि सुरक्षा स्तर को कम करने के लिए बहुत सारे ब्लॉग और टिप्पणियां हैं, जो अस्वीकार्य होना चाहिए।

इसे जोड़कर, MVC फ्रेमवर्क नियंत्रक को हिट करने की अनुमति देगा और उस नियंत्रक में कोड निष्पादित किया जाएगा।

हालाँकि, यह आपके कोड, फ़िल्टर इत्यादि पर निर्भर करता है कि प्रतिक्रिया कैसे उत्पन्न होती है और क्या कोई और मान्यता है जो किसी अन्य समान त्रुटि को ट्रिगर कर सकती है।

किसी भी मामले में, [AllowHtml]विशेषता जोड़ना सही उत्तर है, क्योंकि यह html को नियंत्रक में deserialized करने की अनुमति देता है। आपके दृष्टिकोण में उदाहरण:

[AllowHtml]
public string MessageWithHtml {get; set;}

8

मुझे उसी समस्या का सामना करना पड़ा, हालांकि मैंने [System.Web.Mvc.AllowHtml]संबंधित संपत्ति में कुछ उत्तरों में वर्णित किया।

मेरे मामले में, मेरे पास एक UnhandledExceptionFilterवर्ग है जो एमवीसी सत्यापन होने से पहले अनुरोध वस्तु तक पहुंचता है (और इसलिए AllowHtml का कोई प्रभाव नहीं पड़ता है) और यह पहुंच एक उठाता है [HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client

इसका अर्थ है, अनुरोध वस्तु के कुछ गुणों तक पहुँचना वैधता से वैधता प्राप्त करता है (मेरे मामले में इसकी Paramsसंपत्ति)।

सत्यापन को रोकने के लिए एक समाधान MSDN पर प्रलेखित है

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

इसलिए, यदि आपके पास इस तरह का कोड है

var lParams = aRequestContext.HttpContext.Request.Params;
if (lParams.Count > 0)
{
  ...

इसे बदलो

var lUnvalidatedRequest = aRequestContext.HttpContext.Request.Unvalidated;

var lForm = lUnvalidatedRequest.Form;
if (lForm.Count > 0)
{
  ...

या केवल उस Formसंपत्ति का उपयोग करें जो सत्यापन को आग नहीं लगती है

var lForm = aRequestContext.HttpContext.Request.Form;
if (lForm.Count > 0)
{
  ...

1
धन्यवाद! निवेदन। केवल एक ही समाधान मेरे लिए काम कर रहा था।
पेट्टर इवर्सन

3

यदि आपको एक्शन-विधि पैरामीटर ("मॉडल प्रॉपर्टी" के विपरीत) के लिए html इनपुट की अनुमति देने की आवश्यकता है, तो ऐसा करने का कोई अंतर्निहित तरीका नहीं है, लेकिन आप कस्टम मॉडल बाइंडर का उपयोग करके इसे आसानी से प्राप्त कर सकते हैं:

public ActionResult AddBlogPost(int userId,
    [ModelBinder(typeof(AllowHtmlBinder))] string htmlBody)
{
    //...
}

AllowHtmlBinder कोड:

public class AllowHtmlBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var request = controllerContext.HttpContext.Request;
        var name = bindingContext.ModelName;
        return request.Unvalidated[name]; //magic happens here
    }
}

पूर्ण स्रोत कोड और मेरे ब्लॉग पोस्ट में स्पष्टीकरण का पता लगाएं: https://www.jitbit.com/alexblog/273-aspnet-mvc-allowing-html-for-particular-action-parameters/


1
असंबद्ध केवल 4.5 और इसके बाद के संस्करण में उपलब्ध होने लगता है।
बेन

@ सही है! कृपया इस संशोधित समाधान की जाँच करें। stackoverflow.com/questions/59483284/…
om-ha

3

URL एनकोडिंग डेटा मेरे लिए भी काम करता है

उदाहरण के लिए

var data = '<b> हैलो </ b>'

पोस्ट करने से पहले ब्राउज़र कॉल में encodeURIComponent (डेटा)

सर्वर पर HttpUtility.UrlDecode (प्राप्त_डेटा) को डिकोड करने के लिए

इस तरह से आप वास्तव में नियंत्रित कर सकते हैं कि किस क्षेत्र में html की अनुमति है


अब तक का सबसे आसान तरीका
N1gthm4r3

1

NopCommerce का उपयोग करके ई-कॉमर्स साइट के विकास के दौरान मुझे इस समस्या का सामना करना पड़ा है, मुझे पिछले उत्तरों की तरह यह समाधान 3 अलग-अलग तरीकों से मिला है। लेकिन NopCommerce संरचना के अनुसार मैंने उन तीनों को एक बार में नहीं पाया। मैंने अभी देखा है कि वहाँ वे सिर्फ उपयोग कर रहे हैं [AllowHtml]और यह किसी भी समस्या को छोड़कर ठीक काम कर रहा है। जैसा कि पहले पूछा गया प्रश्न

व्यक्तिगत रूप से मैं पसंद नहीं करता [ValidateInput(false)]क्योंकि मैं कुल मॉडल इकाई जाँच को रोक रहा हूँ, जो असुरक्षित है। लेकिन अगर किसी को लिखने के लिए यहाँ एक नज़र है

[AllowHtml] 
public string BlogText {get;set;}

तब यह सिर्फ एक ही संपत्ति को छोड़ता है, और केवल विशेष संपत्ति की अनुमति देता है और अन्य सभी संस्थाओं की जांच करता है। इसलिए यह मेरे लिए बेहतर लगता है।


1

मेरे मामले में, OutputCache एक्शन फिल्टर के साथ संयुक्त होने पर AllowHtml विशेषता काम नहीं कर रही थी। इस जवाब ने मेरे लिए समस्या हल कर दी। आशा है कि यह किसी की मदद करता है।


1

आप [AllowHtml]उदाहरण के लिए अपनी परियोजना के लिए उपयोग कर सकते हैं

 [AllowHtml]
 public string Description { get; set; }

इस कोड का उपयोग करने के लिए कक्षा पुस्तकालय के लिए आप इस पैकेज का उपयोग करें

Install-Package Microsoft.AspNet.Mvc

इसके बाद उपयोग करें using

using System.Web.Mvc;

0

यहाँ कोई भी जवाब मेरे लिए दुर्भाग्य से काम नहीं आया।

मैंने कस्टम मॉडल बाइंडिंग का उपयोग किया और तीसरे पक्ष के सैनिटाइज़र का उपयोग किया।

मेरे स्व-उत्तरित प्रश्न को यहाँ देखें

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