रेजर दृश्य में बिना सेंसर किए हुए तारों को छोड़ना


81

जैसा कि स्कॉटग्यू अपने ब्लॉग पोस्ट में कहते हैं «डिफ़ॉल्ट रूप से @ ब्लॉक का उपयोग करके उत्सर्जित सामग्री स्वचालित रूप से HTML है जो एक्सएसएस हमले के खिलाफ बेहतर सुरक्षा प्रदान करती है। मेरा सवाल है: आप एक गैर- HTML- एन्कोडेड स्ट्रिंग कैसे आउटपुट कर सकते हैं?

सादगी के लिए, pls इस सरल मामले से चिपके रहें:

@{
 var html = "<a href='#'>Click me</a>"
 // I want to emit the previous string as pure HTML code...
}

जवाबों:



17

आप MvcHtmlString का एक नया उदाहरण बना सकते हैं जिसमें HTML एन्कोडेड नहीं होगा।

@{
  var html = MvcHtmlString.Create("<a href='#'>Click me</a>")
}

उम्मीद है कि रेजर के भविष्य में एक आसान रास्ता होगा।

यदि आप MVC का उपयोग नहीं कर रहे हैं, तो आप यह कोशिश कर सकते हैं:

@{
  var html = new HtmlString("<a href='#'>Click me</a>")
}

2
वास्तव में आप new HtmlString()MVC 3 और साथ ही उस प्रकार का उपयोग करने में सक्षम हैं , जो कि .NET 4 है।
23:28 पर

वास्तव में! हालाँकि जब सब एक ही अभिव्यक्ति में टाइप कर रहा हूँ तो मुझे MVC एक और पसंद है। जैसे @ MvcHtmlString.Create (myString)। व्यक्तिगत पसंद!
२०१० को 36:३६ पर एल्डे

6

नई HtmlString निश्चित रूप से जवाब है।

हमने कुछ अन्य रेजर सिंटैक्स परिवर्तनों में देखा, लेकिन अंत में उनमें से कोई भी वास्तव में नए HtmlString की तुलना में छोटा नहीं था।

हालाँकि, हम इसे एक सहायक में लपेट सकते हैं। संभवतः ...

@Html.Literal("<p>something</p>")

या

@"<p>something</p>".AsHtml()

1
क्या HTML को आउटपुट करने के तरीके के रूप में @ = myString जोड़ना संभव होगा? शायद WebForms के लिए एक फ्लैशबैक का बहुत ...
aolde

2
हम सिंटैक्स निर्माणों को जोड़ने से बचना चाहते हैं जहां वे एक प्रमुख उपयोगकर्ता मामले को कवर नहीं करते हैं। अधिकांश समय, आप तार बनाने के लिए सहायक विधियों का उपयोग करेंगे और IHtmlString पूरी तरह से वहां काम करता है। विषम मामलों के लिए जहां आपको सहायक के बिना शाब्दिक स्ट्रिंग का उत्पादन करने की आवश्यकता होती है, हम आपके लिए एक विधि प्रदान कर सकते हैं: @Literal (foo) या समान।
एंड्रयू स्टैंटन-नर्स

0

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

मैंने आखिरकार रॉविवि को लागू करने के लिए क्या किया जो कि cshtml फाइलों के अंदर व्यू के समानांतर था। अनिवार्य रूप से, एक कच्ची स्ट्रिंग प्राप्त करने के लिए,

@(new HtmlString(View.Foo))

// became
@RawView.Foo

इसके लिए प्रोजेक्ट लेआउट में कुछ बदलाव करने की आवश्यकता है, इसलिए मैंने अभी इसके बारे में एक ब्लॉग पोस्ट लिखी है । संक्षेप में, इसके लिए MVC के डायनामिक व्यूडाउडर और डुप्लिकेट के नए कार्यान्वयन की आवश्यकता होती है जिसमें RawView शामिल होता है। मैंने भी आगे बढ़कर इंडेक्स ऑपरेटर को अनुमति देने के लिए RawView पर लागू किया

@RawView["Foo"]

ऑफ-चांस में कि किसी को डेटा की चाबी की सूची के साथ लूप करना है।

Aurse की टिप्पणी को पढ़ना, यह शायद बेहतर होता अगर मैंने इसे RawView के बजाय एक शाब्दिक नाम दिया होता।


0

मैं मोनो के तहत ASP.NET MVC और रेजर का उपयोग कर रहा हूं।

मुझे कुछ कारणों से System.Web.WebPages of System.Web.Mvc से HtmlHelper नहीं मिल सका।

लेकिन मैंने मॉडल की संपत्ति घोषित करने के बाद अनएन्कोडेड स्ट्रिंग का उत्पादन करने में कामयाबी हासिल की RazorEngine.Text.RawString। अब यह उम्मीद के मुताबिक आउटपुट देता है।

उदाहरण

@{
    var txt = new RawString("some text with \"quotes\"");
    var txt2 = "some text with \"quotes\"";
}
<div>Here is unencoded text: @txt</div>
<div>Here is encoded text: @txt2</div>

आउटपुट:

<div>Here is unencoded text: some text with "quotes"</div>
<div>Here is encoded text: some text with &quot;quotes&quot;</div>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.