Испускание некодированных строк в виде бритвы


Как ScottGu пишет в своем блоге post "по умолчанию контент, создаваемый с помощью @ block, автоматически кодируется HTML для лучшей защиты от сценариев атаки XSS". Мой вопрос: как вы можете вывести строку, не закодированную в HTML?

для простоты, пожалуйста, придерживайтесь этого простого случая:

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

4 ответа:

Это мой любимый подход:

@Html.Raw("<p>my paragraph text</p>")

источником была ссылка на синтаксис бритвы Фила Хаака:http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx

вы можете создать новый экземпляр MvcHtmlString, который не будет кодироваться HTML.

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

надеюсь, что будет более простой способ в будущем бритвы.

Если вы не используете MVC, вы можете попробовать это:

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

новый HtmlString, безусловно, ответ.

мы рассмотрели некоторые другие изменения синтаксиса razor, но в конечном итоге ни один из них не оказался короче новой HtmlString.

мы можем, однако, обернуть это в помощника. Возможно...

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

или

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

я столкнулся с этой проблемой также при переходе нашего проекта на новый движок Razor view. Подход, который я принял, немного отличался, потому что мы должны были генерировать данные JSON из C# и хотели вывести их при загрузке страницы.

что я в конечном итоге сделал, так это реализовать RawView, который был параллельным представлением внутри файлов cshtml. По сути, чтобы получить необработанную строку,

@(new HtmlString(View.Foo))

// became
@RawView.Foo

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

@RawView["Foo"]

в случае, если кто-то должен перебирать данные со списком ключей.

читая комментарий анурса, вероятно, было бы лучше, если бы я назвал это как литерал вместо RawView.