Я обращаюсь к базе данных программного обеспечения, которое html кодирует специальные символы, такие как "
(двойные кавычки) в "
. Если просто вывести, например, @Model.Title
в Razor, строка Meaning of "xyz"
будет выведена как Meaning of "xyz"
. То же самое относится и к другим специальным символам, таким как знак &
, который иногда присутствует в заголовках.
В ветке форума MS предлагается использовать @Html.Raw(Model.Title)
. Это сработало, но разрешение любого HTML кажется мне угрозой безопасности. В заголовке не должно быть HTML. Если злоумышленник может ввести HTML, использование @Html.Raw
, похоже, делает возможной атаку XSS.
Этот вопрос предполагает WebUtility.HtmlDecode
, который взят из старой структуры 4.x . В NET Core называется WebUtility.HtmlDecode
. Использование @WebUtility.HtmlDecode(Model.Title)
тоже работает. Но в чем именно разница с @Html.Raw
? @WebUtility.HtmlDecode(Model.Title)
просто декодирует эти специальные символы, такие как & "
, без разрешения HTML? Это более безопасно для этого варианта использования или мне нужен какой-либо дополнительный синтаксический анализатор как sanitizer как HTMLAgilityPack
?
Test case
Чтобы проверить это, я установил название на "Hi" <script>alert("xss test");</script>
. Где @Html.Raw
показывает мне окно предупреждения, как и ожидалось, WebUtility.HtmlDecode
вместо этого печатает "Hi" <script>alert("xss test");</script>
без отображения каких-либо предупреждений. Так что, похоже, WebUtility.HtmlDecode
подходит для моего варианта использования, а предложение Html.Raw
хуже с точки зрения безопасности, верно?