Разрешить специальные символы, такие как "и &", но не сам HTML - является ли WebUtility.HtmlDecode более безопасным, чем Html .Raw в ASP. NET Core 2.1? - PullRequest
0 голосов
/ 07 мая 2020

Я обращаюсь к базе данных программного обеспечения, которое 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

Чтобы проверить это, я установил название на &quot;Hi&quot; <script>alert("xss test");</script>. Где @Html.Raw показывает мне окно предупреждения, как и ожидалось, WebUtility.HtmlDecode вместо этого печатает "Hi" <script>alert("xss test");</script> без отображения каких-либо предупреждений. Так что, похоже, WebUtility.HtmlDecode подходит для моего варианта использования, а предложение Html.Raw хуже с точки зрения безопасности, верно?

...