Виділення некодованих рядків у режимі бритви


81

Як говорить ScottGu в своєму блозі пост «за змістом по замовчуванням , випромінюваного з допомогою @ блок автоматично HTML закодований , щоб краще захистити від сценаріїв атак XSS». Моє запитання: як можна вивести рядок, який не кодується HTML?

Для простоти, будь ласка, дотримуйтесь цього простого випадку:

@{
 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>")
}

Сподіваємось, у майбутньому Razor буде простіший шлях.

Якщо ви не використовуєте MVC, ви можете спробувати це:

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

2
Насправді ви могли б також використовувати new HtmlString()MVC 3, оскільки цей тип є .NET 4.
marcind

Справді! Однак, набираючи все це одним виразом, мені більше подобається MVC. Наприклад, @ MvcHtmlString.Create (myString). Особисті уподобання!
aolde

6

новий HtmlString - це безперечно відповідь.

Ми розглядали деякі інші зміни синтаксису бритви, але врешті-решт жодна з них насправді не була коротшою за нову HtmlString.

Однак ми можемо обернути це помічником. Можливо ...

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

або

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

1
Чи можна було б додати @ = myString як спосіб виводу HTML? Можливо, занадто багато спалаху до WebForms ...
aolde

2
Ми хочемо уникати додавання синтаксичних конструкцій там, де вони не охоплюють основний випадок користувача. Здебільшого ви будете використовувати допоміжні методи для побудови рядків, і IHtmlString там ідеально працює. Для дивних випадків, коли вам потрібно вивести буквальний рядок без помічника, ми можемо надати вам метод: @Literal (foo) або подібний.
Ендрю Стентон-Медсестра,

0

Я також зіткнувся з цією проблемою при переході нашого проекту на новий механізм подання Razor. Підхід, який я застосував, був дещо іншим, оскільки нам довелося генерувати дані JSON із C # і хотіли виводити їх при завантаженні сторінки.

Що я врешті-решт зробив, це реалізував RawView, який був паралеллю перегляду всередині файлів cshtml. По суті, щоб отримати сирий рядок,

@(new HtmlString(View.Foo))

// became
@RawView.Foo

Це вимагає декількох змін у макеті проекту, тому я щойно написав про це в блозі тут . Коротше кажучи, для цього потрібна була дублікат реалізації DynamicViewDataDictionary MVC та нової WebViewPage, що містить RawView. Я також пішов і застосував оператор індексу в RawView, щоб дозволити

@RawView["Foo"]

У випадку, коли комусь потрібно прокрутити дані за допомогою списку ключів.

Читаючи коментар anurse, можливо, було б краще, якби я назвав це як Literal замість RawView.


0

Я використовую ASP.NET MVC та Razor під Mono.

Я не зміг отримати HtmlHelper з System.Web.WebPages of System.Web.Mvc з деяких причин.

Але мені вдалося вивести некодований рядок після оголошення властивості моделі як 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.