Каждый раз, когда пользователь публикует что-либо, содержащее <
или >
находящееся на странице в моем веб-приложении, я получаю это исключение.
Я не хочу вдаваться в дискуссию о целесообразности создания исключения или сбоя всего веб-приложения, потому что кто-то ввел символ в текстовое поле, но я ищу элегантный способ справиться с этим.
Отслеживание исключения и отображение
Произошла ошибка. Вернитесь и введите заново всю форму, но на этот раз не используйте <
не кажется достаточно профессиональным для меня.
Отключение post validation ( validateRequest="false"
) определенно позволит избежать этой ошибки, но сделает страницу уязвимой для ряда атак.
В идеале: когда происходит обратная запись, содержащая ограниченные символы HTML, это опубликованное значение в коллекции Form будет автоматически кодироваться в формате HTML. Таким образом, .Text
свойство моего текстового поля будетsomething & lt; html & gt;
Есть ли способ, которым я могу сделать это из обработчика?
<httpRuntime requestValidationMode="2.0" />
в web.configОтветы:
Я думаю, что вы атакуете его с неправильной точки зрения, пытаясь закодировать все опубликованные данные.
Обратите внимание, что «
<
» также может приходить из других внешних источников, таких как поле базы данных, конфигурация, файл, канал и так далее.Кроме того, "
<
" не является опасным по своей природе. Это опасно только в определенном контексте: при написании строк, которые не были закодированы в вывод HTML (из-за XSS).В других контекстах разные подстроки опасны, например, если вы записываете предоставленный пользователем URL в ссылку, подстрока "
javascript:
" может быть опасной. Символ одинарной кавычки, с другой стороны, опасен при интерполяции строк в запросах SQL, но совершенно безопасен, если он является частью имени, переданного из формы или считанного из поля базы данных.Суть в том, что вы не можете отфильтровать случайный ввод для опасных символов, потому что любой символ может быть опасным при правильных обстоятельствах. Вы должны кодировать в точке, где некоторые конкретные символы могут стать опасными, потому что они переходят на другой язык, где они имеют особое значение. Когда вы пишете строку в HTML, вы должны кодировать символы, которые имеют особое значение в HTML, используя Server.HtmlEncode. Если вы передаете строку в динамический оператор SQL, вы должны кодировать разные символы (или, лучше, позвольте платформе сделать это за вас, используя подготовленные операторы или тому подобное) ..
Когда вы уверены, что HTML-кодирование везде, вы передаете строки в HTML, а затем установите
validateRequest="false"
в<%@ Page ... %>
директиве в ваших.aspx
файлах.В .NET 4 вам может потребоваться сделать немного больше. Иногда необходимо также добавить
<httpRuntime requestValidationMode="2.0" />
в web.config ( ссылка ).источник
<httpRuntime requestValidationMode="2.0" />
тег местоположения, чтобы избежать потери полезной защиты, обеспечиваемой проверкой с остальной части вашего сайта.[AllowHtml]
на свойстве модели.GlobalFilters.Filters.Add(new ValidateInputAttribute(false));
вApplication_Start()
.<pages validateRequest="false" />
in<system.web />
. При этом свойство будет применено ко всем страницам.Существует другое решение этой ошибки, если вы используете ASP.NET MVC:
Образец C #:
Образец Visual Basic:
источник
[AllowHtml]
это лучше, чемValidateInput(false)
, потому что[AllowHtml]
определяется сразу для свойства, то есть поля редактора, и всякий раз, когда оно используется, нет необходимости использовать его для нескольких действий. Что ты предлагаешь?В ASP.NET MVC (начиная с версии 3) вы можете добавить
AllowHtml
атрибут к свойству модели.Это позволяет запросу включать разметку HTML во время привязки модели, пропуская проверку запроса для свойства.
источник
ValidateInput(false)
иAllowHtml
? В чем преимущество одного над другим? Когда бы я хотел использоватьAllowHtml
вместоValidateInput(false)
? Когда бы я хотел использоватьValidateInput(false)
болееAllowHtml
? Когда бы я хотел использовать оба? Имеет ли смысл использовать оба?Если вы используете .NET 4.0, убедитесь, что вы добавили это в свой файл web.config внутри
<system.web>
тегов:В .NET 2.0 проверка
aspx
запросов применяется только к запросам. В .NET 4.0 это было расширено, чтобы включить все запросы. Вы можете вернуться к выполнению только проверки XSS при обработке.aspx
, указав:Вы можете отключить запрос Validate полностью , указав:
источник
<system.web>
тегов.В ASP.NET 4.0 можно разрешить разметку в качестве входных данных для определенных страниц, а не для всего сайта, поместив все это в
<location>
элемент. Это обеспечит безопасность всех ваших других страниц. Вам НЕ нужноValidateRequest="false"
указывать на странице .aspx.Безопаснее управлять этим внутри вашего web.config, потому что на уровне сайта вы можете видеть, какие страницы допускают разметку в качестве входных данных.
Вам все еще нужно программно проверять ввод на страницах, где проверка запроса отключена.
источник
Предыдущие ответы были хорошими, но никто не сказал, как исключить проверку одного поля для инъекций HTML / JavaScript. Я не знаю о предыдущих версиях, но в MVC3 Beta вы можете сделать это:
Это все еще проверяет все поля, кроме исключенного. Хорошая вещь об этом состоит в том, что ваши атрибуты проверки все еще проверяют поле, но вы просто не получаете исключение «потенциально опасное значение Request.Form было обнаружено из клиента».
Я использовал это для проверки правильности выражения. Я сделал свой собственный атрибут ValidationAttribute, чтобы проверить, является ли регулярное выражение допустимым или нет. Поскольку регулярные выражения могут содержать нечто, похожее на скрипт, я применил приведенный выше код - регулярное выражение все еще проверяется, действительно ли оно допустимо или нет, но не в том случае, если оно содержит скрипты или HTML.
источник
[AllowHtml]
свойства модели вместо[ValidateInput]
действия для достижения того же конечного результата.[AllowHtml]
не вариант. Я рекомендую проверить эту статью: weblogs.asp.net/imranbaloch/… , но она тоже несколько устарела и может быть устаревшей.В ASP.NET MVC вам нужно установить requestValidationMode = "2.0" и validateRequest = "false" в web.config и применить атрибут ValidateInput к действию вашего контроллера:
а также
источник
validateRequest="false"
не было необходимости, толькоrequestValidationMode="2.0"
Вы можете кодировать текстовое поле HTML , но, к сожалению, это не остановит исключение. По моему опыту нет никакого пути, и вы должны отключить проверку страницы. Делая это, вы говорите: «Я буду осторожен, я обещаю».
источник
Для MVC игнорируйте проверку ввода, добавив
над каждым действием в контроллере.
источник
Вы можете поймать эту ошибку в Global.asax. Я все еще хочу подтвердить, но показать соответствующее сообщение. В блоге, указанном ниже, такой образец был доступен.
Перенаправление на другую страницу также кажется разумным ответом на исключение.
http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html
источник
Ответ на этот вопрос прост:
Это отключило бы проверку для конкретного запроса.
источник
Request
?Помните, что некоторые элементы управления .NET будут автоматически кодировать HTML-код. Например, установка свойства .Text в элементе управления TextBox автоматически закодирует его. Это, в частности, означает превращение
<
в<
,>
в>
и&
в&
. Так что будьте осторожны с этим ...Однако свойство .Text для HyperLink, Literal и Label не будет кодировать HTML-объекты, поэтому оборачиваем Server.HtmlEncode (); все, что установлено в этих свойствах, является обязательным, если вы хотите предотвратить
<script> window.location = "http://www.google.com"; </script>
вывод на свою страницу и последующее выполнение.Сделайте небольшой эксперимент, чтобы увидеть, что кодируется, а что нет.
источник
В файле web.config в тегах вставьте элемент httpRuntime с атрибутом requestValidationMode = "2.0". Также добавьте атрибут validateRequest = "false" в элементе pages.
Пример:
источник
Если вы не хотите отключать ValidateRequest, вам нужно реализовать функцию JavaScript, чтобы избежать исключения. Это не лучший вариант, но он работает.
Затем в коде позади события PageLoad добавьте атрибут к вашему элементу управления с помощью следующего кода:
источник
Кажется, никто еще не упомянул ниже, но это решает проблему для меня. И прежде чем кто-нибудь скажет: да, это Visual Basic ... хм.
Я не знаю, есть ли минусы, но для меня это сработало потрясающе.
источник
Другое решение:
источник
Если вы используете framework 4.0, тогда запись в web.config (<pages validateRequest = "false" />)
Если вы используете framework 4.5, тогда запись в web.config (requestValidationMode = "2.0")
Если вы хотите только одну страницу, то в вашем aspx-файле вы должны поставить первую строку так:
если у вас уже есть что-то вроде <% @ Page, просто добавьте остальные =>
EnableEventValidation="false"
%>Я рекомендую не делать этого.
источник
В ASP.NET вы можете перехватить исключение и что-то с ним сделать, например, отобразить дружеское сообщение или перенаправить на другую страницу ... Также есть вероятность, что вы можете выполнить проверку самостоятельно ...
Показать дружеское сообщение:
источник
Я думаю, вы могли бы сделать это в модуле; но это оставляет открытыми некоторые вопросы; Что делать, если вы хотите сохранить входные данные в базе данных? Внезапно, поскольку вы сохраняете закодированные данные в базу данных, вы в конечном итоге доверяете вводу данных, что, вероятно, является плохой идеей. В идеале вы храните необработанные незакодированные данные в базе данных и каждый раз кодируете.
Отключение защиты на уровне страницы и последующее кодирование - лучший вариант.
Вместо использования Server.HtmlEncode вы должны взглянуть на более новую, более полную библиотеку Anti-XSS от команды Microsoft ACE.
источник
причина
ASP.NET по умолчанию проверяет все элементы управления вводом на предмет потенциально небезопасного содержимого, которое может привести к межсайтовому скриптингу (XSS) и инъекциям SQL . Таким образом, он запрещает такой контент, выбрасывая вышеуказанное исключение. По умолчанию рекомендуется разрешить эту проверку при каждой обратной передаче.
Решение
Во многих случаях вам нужно отправить HTML-контент на вашу страницу через Rich TextBoxes или Rich Text Editors. В этом случае вы можете избежать этого исключения, установив для тега ValidateRequest в
@Page
директиве значение false.Это отключит проверку запросов для страницы, для которой вы установили флаг ValidateRequest в значение false. Если вы хотите отключить это, проверьте в вашем веб-приложении; вам нужно установить его в false в вашем разделе web.config <system.web>
Для .NET 4.0 или более поздних платформ вам также необходимо добавить следующую строку в разделе <system.web>, чтобы вышеуказанная работа работала.
Вот и все. Я надеюсь, что это поможет вам избавиться от вышеуказанной проблемы.
Ссылка: ASP.Net Ошибка: потенциально опасное значение Request.Form было обнаружено от клиента
источник
Я нашел решение, которое использует JavaScript для кодирования данных, которое декодируется в .NET (и не требует jQuery).
Добавьте следующую функцию JavaScript в свой заголовок.
function boo () {targetText = document.getElementById ("HiddenField1"); sourceText = document.getElementById ("userbox"); targetText.value = escape (sourceText.innerText); }В вашей текстовой области включите onchange, который вызывает boo ():
Наконец, в .NET используйте
Я знаю, что это односторонний подход - если вам нужен двусторонний подход, вам нужно проявить творческий подход, но это дает решение, если вы не можете редактировать файл web.config.
Вот пример, который я (MC9000) придумал и использовал через jQuery:
И разметка:
Это прекрасно работает. Если хакер попытается отправить сообщение в обход JavaScript, он просто увидит ошибку. Вы также можете сохранить все эти данные, закодированные в базе данных, затем удалить их (на стороне сервера), проанализировать и проверить на наличие атак, прежде чем отображать их в другом месте.
источник
escape(...)
может занять много времени. В моем случае разметка представляла собой целый (2 МБ) XML-файл. Вы можете спросить: «Почему бы тебе просто не использовать<input type="file"...
и ... я согласен с тобой :)Другие решения здесь хороши, однако, задним ходом немного неудобно применять [AllowHtml] к каждому отдельному свойству Model, особенно если у вас более 100 моделей на сайте приличного размера.
Если, как и я, вы хотите отключить эту (ИМХО довольно бессмысленную) функцию для всего сайта, вы можете переопределить метод Execute () в вашем базовом контроллере (если у вас еще нет базового контроллера, я предлагаю сделать его, они могут быть довольно полезно для применения общего функционала).
Просто убедитесь, что вы HTML кодируете все, что выкачивается в представления, полученные из пользовательского ввода (это поведение по умолчанию в ASP.NET MVC 3 с Razor в любом случае, поэтому, если по какой-то причудливой причине вы не используете Html.Raw (), вы не должен требовать эту функцию.
источник
Я тоже получал эту ошибку.
В моем случае пользователь ввел акцентированный символ
á
в имени роли (в отношении поставщика членства ASP.NET).Я передаю имя роли методу, чтобы предоставить пользователям эту роль, и
$.ajax
почтовый запрос с треском провалился ...Я сделал это, чтобы решить проблему:
Вместо
Сделай это
@Html.Raw
сделал свое дело.Я получал имя роли как значение HTML
roleName="Cadastro bás"
. Это значение с сущностью HTMLá
было заблокировано ASP.NET MVC. Теперь я получаюroleName
значение параметра таким, каким оно должно быть:roleName="Cadastro Básico"
и движок ASP.NET MVC больше не будет блокировать запрос.источник
Отключение проверки страницы , если вам действительно нужны специальные символы , такие как,
>
,,<
и т.д. Затем убедитесь , что при отображении пользовательского ввода, данные HTML-кодирования.Существует уязвимость безопасности при проверке страницы, поэтому ее можно обойти. Также на валидацию страницы нельзя полагаться исключительно.
См .: http://web.archive.org/web/20080913071637/http://www.procheckup.com:80/PDFs/bypassing-dot-NET-ValidateRequest.pdf
источник
Вы также можете использовать функцию escape (string) в JavaScript для замены специальных символов. Затем на стороне сервера использовать сервер. URLDecode (строка), чтобы переключить его обратно.
Таким образом, вам не нужно отключать проверку ввода, и другим программистам будет понятнее, что строка может иметь HTML-содержимое.
источник
Я заканчивал тем, что использовал JavaScript перед каждой обратной передачей, чтобы проверить символы, которые вам не нужны, такие как:
Конечно, моя страница - это, в основном, ввод данных, и очень мало элементов, которые выполняют обратную передачу, но, по крайней мере, их данные сохраняются.
источник
Вы можете использовать что-то вроде:
Позже
nvc["yourKey"]
должен работать.источник
Пока это только символы "<" и ">" (а не сами двойные кавычки), и вы используете их в контексте, например, <input value = " this " />, вы в безопасности (тогда как для <textarea > этот </ textarea> вы бы уязвимы конечно). Это может упростить вашу ситуацию, но для чего-то большего используйте одно из других опубликованных решений.
источник
Если вы просто хотите сказать своим пользователям, что <и> не должны использоваться, НО, вы не хотите, чтобы вся форма была обработана / отправлена обратно (и потеряна вся информация) до того, как вы могли бы просто не вставить валидатор вокруг поля для проверки этих (и, возможно, других потенциально опасных) символов?
источник
Ни одно из предложений не сработало для меня. Я не хотел отключать эту функцию для всего сайта, так как в 99% случаев я не хочу, чтобы мои пользователи размещали HTML на веб-формах. Я просто создал свой метод обхода, так как я единственный, кто использует это конкретное приложение. Я преобразовываю ввод в HTML в коде и вставляю его в свою базу данных.
источник