То, что вы хотите найти, это межсайтовый скриптинг (xss).
Общее решение заключается в кодировании вывода в соответствии с его контекстом. Например, если вы пишете такие данные в обычный html, вам нужна html-кодировка, которая в основном заменяет <на & lt; и так далее в динамических данных (~ пользовательский ввод), чтобы все отображалось только как текст. Для контекста javascript (например, <em>, но не только внутри тега <script>
) вам потребуется кодировка javascript.
В .net есть HttpUtility
, который включает такие методы, например. HttpUtility.JavascriptStringEncode()
. Кроме того, ранее существовала отдельная библиотека AntiXSS, которая может помочь, обеспечивая еще более строгую кодировку (на основе белого списка), в отличие от HttpUtility
на основе черного списка. Так что не бросайте свои собственные, это хитрее, чем может показаться на первый взгляд - просто используйте хорошо известную реализацию.
Также Razor имеет встроенную защиту от тривиальных xss-атак. Используя @myVar, Razor автоматически применяет кодировку html, поэтому приведенный выше код безопасен. Обратите внимание, что не будет безопасным в контексте javascript, где вам нужно применить кодировку javascript самостоятельно (т.е. вызвать соответствующий метод, например, из HttpUtility
).
Обратите внимание, что без надлежащего кодирования использование поля ввода или текстовой области не является более безопасным - инъекция - это инъекция, не имеет большого значения, какие символы необходимо использовать, если инъекция возможна.
Также немного связанный, .net обеспечивает другую защиту, кроме автоматической кодировки HTML. Он использует «проверку запроса» и по умолчанию не позволяет параметрам запроса (либо получить, либо отправить) содержать символ меньше (<), за которым сразу следует буква. Такой запрос будет заблокирован платформой как потенциально небезопасный, если только эта функция не будет намеренно отключена. </p>
Ваш оригинальный пример заблокирован обоими этими механизмами (автоматическое кодирование и проверка запросов).
Очень важно отметить, что с точки зрения xss это самая верхушка айсберга. Хотя эти средства защиты в .net несколько помогают, в общем, они ни в коем случае не являются достаточными. Хотя ваш пример безопасен, в целом вам необходимо понимать xss и то, что именно эти средства защиты делают для создания безопасного кода.