Подтвердить что ты не робот

Нужно ли значение HtmlEncode Textbox, если включена проверка ASP.Net Request Validation?

Если ASP.NET Request Validation включена для сайта, вам все еще нужна информация о строках HtmlEncode и HtmlDecode для простых форм (например, текстовые поля ASP)?

4b9b3361

Ответ 1

Если ASP.NET Request Validation включена для сайта, вам все равно нужно HtmlEncode

ASP.NET Request Validation - это взлом, чтобы попытаться обойти запущенные программы глупых авторов. Не пишите сломанные программы.

Любая текстовая строка, которую вы пишете на HTML-странице, должна быть закодирована в HTML; это вопрос правильности, а не только безопасность (которая является подмножеством правильности). Даже если проверка запроса могла бы волшебным образом удалить любую возможную атаку XSS (и это не так похоже на случай), отказ от вывода текста HtmlEncode все равно оставит вас открытым для создания неверного результата, искажая ваши данные. Скажем, я писал сообщение на форуме о некоторых переменных a, b и c и хотел сказать:

a<b b>c b>a

Если это отразилось на исходном HTML-источнике, я бы получил:

a c b > a

и, возможно, остальная часть страницы тоже будет смелой. Упс

Запрос валидации является фиктивным и на него не следует полагаться. Быть включенным по умолчанию и "рекомендуется для всех производственных сред" печально и заставляет меня серьезно сомневаться в здравом рассудке команды ASP.NET.

Если вы правильно написали свою программу, вам это не нужно, и она просто мешает вам. (Например, если SO использовала его, я бы не смог опубликовать этот пост, который упоминает тег <script>.) Если вы не правильно написали свою программу, Request Validation не будет исправлять ваши дыры в безопасности, это просто сделает их немного более неясными.

и строковая информация HtmlDecode

Обычно вы не делаете HtmlDecode в веб-приложении. Вы кодируете, чтобы вывести контент в HTML, но когда контент возвращается из поданной формы, он является простым текстом, а не HTML-кодом.

в и из простых форм (например, текстовые поля ASP)?

Текстовые файлы должны быть точными; установка их .Text делает любую необходимую кодировку, делая точную строку, которую вы указали в текстовом поле. Но. Некоторые вещи, которые выглядят так, будто они должны быть кодировкой HTML, на самом деле этого не делают. Например:

myTextBox.Text= "a<b b>c"; // Fine!
myLabel.Text= "a<b b>c"; // Broken!

Боже мой. Text не всегда означает текст. Иногда это означает HTML. Спасибо, Microsoft, чтобы мутить воды темы слишком много людей, которые уже трудно понять.

Ответ 2

В текстовых полях ASP.NET нет опасности для текста, независимо от того, включена или нет проверка запроса. Элемент управления текстовым полем автоматически кодирует данные при отображении в текстовом поле.

При выводе данных, созданных пользователем в других местах, важно, чтобы HTML (или JavaScript) кодировал эти данные. ASP.NET Request Validation обеспечивает только минимальный уровень защиты. Это непроницаемо или даже близко к нему. Он предназначен только для защиты от самых простых атак.

Вам все равно нужно кодировать вещи, когда вы выводите их на другие части вашего сайта.

Edit
То, что я подразумеваю под другими местами, заключается в том, что если пользователь вводит данные в текстовое поле, использование элемента управления текстовым полем ASP.NET безопасно, потому что элемент управления автоматически кодирует вывод, чтобы он отображался безопасно.

Скажите, например, что вы работаете со страницей информации пользователя StackOverflow. Когда пользователь выбирает свое имя пользователя, он может выбрать ввод того, что может быть вредоносным, когда вы выводите его в другую часть вашего сайта. Например, мое имя входа в StackOverflow отображается в верхней части каждой страницы для меня и также отображается на странице "Пользователи".

На странице "Пользователи" AJAX используется для загрузки пользователей. Когда JavaScript идет для оценки имени пользователя, он не связан одними и теми же правилами кодирования с тегами HTML, поэтому я могу ввести что-то в текстовое поле имени пользователя, которое может вызвать некоторые нарушения, когда оно выводится в списке пользователей.

StackOverflow явно правильно кодирует пользовательские данные при отправке клиенту, поэтому они безопасны. Прежде чем отправить свое имя клиенту, они (предположительно) имеют некоторую процедуру кодирования JavaScript, которая гарантирует, что мое имя пользователя не может стать вредоносным при выполнении кода JavaScript.

У вас также могут быть проблемы при использовании этого элемента управления входами nonASP.NET. В входных тегах используются атрибуты для определения содержимого, поэтому вы можете легко ввести текст, который прошел бы мимо проверки проверки запроса, но мог бы позволить пользователю добавлять вредоносный атрибут "mouseover".