Безопасный способ включить пользовательский ввод текста в HTML - PullRequest
0 голосов
/ 14 сентября 2018

Это кажется легким, но у меня проблемы с поиском правильных условий поиска, чтобы получить то, что мне нужно ...

У меня есть требование, чтобы часть моей веб-страницы отображала ранее введенную заметку от пользователя. Заметка сохраняется в базе данных, и в настоящее время я включаю ее, используя Razor, например:

<span>@Model.UserNote</span>

Это отлично работает, но у меня покалывает чувство паучья ... что если пользователь решит, что он хочет, чтобы его заметка была похожа на "</span><script>...</script><span>". Я знаю, как использовать параметры, чтобы избежать атак с использованием инъекций в SQL Server, но существует ли эквивалент HTML или другой подход, позволяющий избежать сохранения или внедрения вредоносной разметки в HTML? Отображение текста в элементе управления, как текстовое поле, кажется более безопасным, но может не дать мне визуальный вид, который я ищу. Заранее спасибо!

1 Ответ

0 голосов
/ 15 сентября 2018

То, что вы хотите найти, это межсайтовый скриптинг (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 и то, что именно эти средства защиты делают для создания безопасного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...