От клиента обнаружено потенциально опасное значение Request.Form

Каждый раз, когда пользователь публикует что-то, содержащее < или > на странице в моем веб-приложении, я получаю это исключение.

Я не хочу вдаваться в обсуждение разумности создания исключения или сбоя всего веб-приложения из-за того, что кто-то ввел символ в текстовое поле, но я ищу элегантный способ справиться с этим.

Захват исключения и отображение

Произошла ошибка, вернитесь и введите всю форму еще раз, но на этот раз, пожалуйста, не используйте ‹

мне не кажется достаточно профессиональным.

Отключение проверки публикации (validateRequest="false") определенно позволит избежать этой ошибки, но сделает страницу уязвимой для ряда атак.

В идеале: когда происходит обратная отправка, содержащая ограниченные символы HTML, это опубликованное значение в коллекции форм будет автоматически закодировано в HTML. Таким образом, свойство .Text моего текстового поля будет something & lt; html & gt;

Есть ли способ сделать это из обработчика?


person Radu094    schedule 17.09.2008    source источник
comment
Обратите внимание, что вы можете получить эту ошибку, если у вас также есть имена объектов HTML () или номера объектов (') во входных данных.   -  person Drew Noakes    schedule 14.10.2010
comment
Что ж, поскольку это мой вопрос, я чувствую, что могу определить, в чем на самом деле суть: сбой всего процесса приложения и возврат общего сообщения об ошибке из-за того, что кто-то набрал '‹', - это излишне. Тем более, что вы знаете, что большинство людей просто `` validateRequest = false '' избавятся от него, тем самым повторно открывая уязвимость.   -  person Radu094    schedule 18.09.2014
comment
@DrewNoakes: имена сущностей () не кажутся проблемой в соответствии с моими тестами (протестированы в .Net 4.0), хотя номера сущностей (') не проходят проверку (как вы сказали). Если вы дизассемблируете метод System.Web.CrossSiteScriptingValidation.IsDangerousString с помощью .Net Reflector, вы увидите, что код специально ищет html-теги (начиная с ‹) и номера объектов (начиная с & #)   -  person Gyum Fox    schedule 06.05.2015
comment
Создайте новый сайт в VS2014, используя проект MVC по умолчанию, и запустите его. Щелкните ссылку регистрации, добавьте любой адрес электронной почты и используйте ‹P455-0r [! в качестве пароля. Та же ошибка из коробки, не пытаясь сделать что-либо вредоносное, поле пароля не будет отображаться, поэтому это не будет XSS-атака, но единственный способ исправить это - полностью удалить проверку с помощью ValidateInput (false) ? Предложение AllowHtml не работает в этой ситуации, все равно взорвалось с той же ошибкой. От клиента обнаружено потенциально опасное значение Request.Form (Пароль = ‹P455-0r [!).   -  person stephenbayer    schedule 27.05.2015
comment
TL; DR поместите <httpRuntime requestValidationMode="2.0" /> в web.config   -  person    schedule 02.11.2016
comment
См. Также Критические изменения ASP.NET 4 для фона.   -  person Bouke    schedule 06.11.2018


Ответы (45)


Я думаю, вы атакуете его с неправильной точки зрения, пытаясь закодировать все опубликованные данные.

Обратите внимание, что < также может поступать из других внешних источников, таких как поле базы данных, конфигурация, файл, канал и т. Д.

Кроме того, < по своей сути не опасен. Это опасно только в определенном контексте: при написании строк, которые не были закодированы для вывода HTML (из-за XSS).

В других контекстах опасны разные подстроки, например, если вы записываете предоставленный пользователем URL-адрес в ссылку, подстрока javascript: может быть опасной. С другой стороны, символ одинарной кавычки опасен при интерполяции строк в SQL-запросах, но совершенно безопасен, если он является частью имени, отправленного из формы или прочитанного из поля базы данных.

Суть в том, что вы не можете фильтровать случайный ввод для опасных символов, потому что любой символ может быть опасным при определенных обстоятельствах. Вы должны кодировать в точке, где некоторые конкретные символы могут стать опасными, потому что они переходят в другой подъязык, где имеют особое значение. Когда вы пишете строку в HTML, вы должны кодировать символы, которые имеют особое значение в HTML, используя Server.HtmlEncode. Если вы передаете строку в динамический оператор SQL, вы должны кодировать разные символы (или, лучше, пусть платформа сделает это за вас, используя подготовленные операторы и т.п.).

Если вы уверены, что кодируете HTML везде, где передаете строки в HTML, затем установите ValidateRequest="false" в директиве <%@ Page ... %> в ваших .aspx файлах.

В .NET 4 вам может потребоваться немного больше. Иногда необходимо также добавить <httpRuntime requestValidationMode="2.0" /> в web.config (ссылка).

person JacquesB    schedule 17.09.2008
comment
@Hightechrider благодарит за ссылку. Простая настройка validateRequest = false не работает для представления в ASP.Net MVC @olavk - Красиво. Джоэл нашел время, чтобы прокомментировать ваш ответ. - person IEnumerator; 27.04.2010
comment
Для тех, кто опаздывает: validateRequest = false входит в директиву Page (первая строка вашего файла .aspx) - person MGOwen; 20.10.2010
comment
Совет. Поместите <httpRuntime requestValidationMode="2.0" /> в тег местоположения, чтобы избежать потери полезной защиты, обеспечиваемой проверкой со стороны остальной части вашего сайта. - person Brian; 17.05.2011
comment
Похоже, ‹httpRuntime requestValidationMode = 2.0 /› работает только тогда, когда на машине установлен фреймворк 2.0. Что делать, если фреймворк 2.0 не установлен вообще, а установлен только фреймворк 4.0? - person Samuel; 20.07.2011
comment
В MVC3 это [AllowHtml] в свойстве модели. - person Jeremy Holovacs; 09.09.2011
comment
Чтобы отключить его глобально для MVC 3, вам также понадобится GlobalFilters.Filters.Add(new ValidateInputAttribute(false)); в Application_Start(). - person Alex; 18.07.2012
comment
@MGOwen вы также можете добавить директиву страницы в web.config через <pages validateRequest="false" /> в <system.web />. Это свойство применит ко всем страницам. - person m-smith; 31.07.2012
comment
Этот ответ на в этом вопросе есть ссылка на установку requestValidationMode = 2.0 только для одной страницы вашего сайта, что определенно более безопасно, чем отключение проверки для всего сайта. - person Steve Wranovsky; 09.08.2012
comment
Вы можете использовать CausesValidation="false" для определенных элементов управления в WebForms. - person Justin Skiles; 24.10.2013
comment
Хочу отметить, что не только javascript: может быть опасным. Представьте, что ‹/div› ‹/div› сделает с вашим макетом. - person Vojtech B; 24.05.2014
comment
Есть ли какой-либо другой метод, кроме отключения validateRequest, поскольку он угрожает безопасности веб-сайта. - person NCA; 30.06.2014
comment
Я просто хочу указать, что динамический SQL, работающий на SQL Server, всегда должен выполняться с использованием процедуры sp_executesql, чтобы снизить риск безопасности. - person devinbost; 29.08.2014
comment
@Samuel: requestValidationMode="4.0" (или что-нибудь ›= 4.0) означает, что проверка выполняется всякий раз, когда осуществляется доступ к данным HTTP-запроса (URL-адрес, файлы cookie). requestValidationMode="2.0" (или что-либо менее 4.0) - включить проверку HTTP-запроса только для страниц. Взгляните на MSDN: msdn.microsoft.com/en-us/library/ - person Dio Phung; 30.09.2014
comment
@AdamKDean [ValidateInput (false)] работает только в том случае, если недопустимые символы находятся в строке запроса. Если они находятся в пути запроса, это не сработает. - person PandaWood; 24.03.2016
comment
В ASP.NET MVC Razor имеет автоматически закодированные в HTML строки с 2010 года. Итак, я думаю, что можно безопасно использовать [ValidateInput(false)] в действиях контроллера POST (которые получают данные формы)? - person nmit026; 12.12.2016
comment
@JustinSkiles CausesValidation изменяется только так, чтобы поле не запускало проверку валидаторов поля, таких как RequiredFieldValidator. - person Peter; 16.01.2017
comment
для .net 4 requestvalidationmode также необходим внутри web.config - person masoud Cheragee; 03.04.2017
comment
почему эта проблема не возникает на локальном хосте, а возникает только на сервере, просто любопытно узнать ... однако ваше решение добавления запроса проверки = false сработало для меня нормально - person clarifier; 06.07.2017
comment
Как установить путь к местоположению для всего сайта / домена? (точка не работает) - person PPB; 04.05.2018
comment
@clarifier похоже, что IIS Express по умолчанию requestValidationMode="2.0" вместо "4.5" в IIS. Указание 2.0 или 4.5 дает такое же поведение в вашей локальной среде (при условии, что IIS Express), а также в производственной среде. - person Bouke; 06.11.2018
comment
@JacquesB Эй, может, стоит немного его отредактировать, чтобы Server.HtmlEncode немного выделялся. Я думаю, что это то, что люди ищут большую часть времени, поскольку это фактическая реализация, но я знаю, что слишком много раз пропускал ее чтение. - person DubDub; 29.04.2019
comment
Необходимо <pages validateRequest="false"/> и <httpruntime requestValidationMode="2.0" /> в web.config для этого для тренировки. Спасибо OP @JacquesB - person mlaribi; 16.03.2020
comment
В .NET 4 в web.config добавьте: ‹httpRuntime requestValidationMode = 2.0 /› ‹pages enableViewStateMac = false validateRequest = false› - person mirko cro 1234; 17.09.2020
comment
Это сработало для меня - person A X; 09.01.2021

Если вы используете ASP.NET MVC, есть другое решение этой ошибки:

Пример C #:

[HttpPost, ValidateInput(false)]
public ActionResult Edit(FormCollection collection)
{
    // ...
}

Пример Visual Basic:

<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
Function Edit(ByVal collection As FormCollection) As ActionResult
    ...
End Function
person Zack Peterson    schedule 08.10.2009
comment
проблема может возникнуть, когда она нужна на одной странице всего приложения - person ; 18.12.2010
comment
Вы также можете добавить атрибут [ValidateInput (false)] на уровне класса. Если вы добавите его в базовый класс контроллера, он будет применяться ко всем действиям методов контроллера. - person Shan Plourde; 29.05.2011
comment
@Zack Спасибо за решение. С другой стороны, мне интересно, лучше ли [AllowHtml], чем ValidateInput(false), потому что [AllowHtml] определяется сразу для свойства, то есть поля редактора, и всякий раз, когда оно используется, нет необходимости использовать его для нескольких действий. Что ты посоветуешь? - person Jack; 22.07.2015
comment
@Zack Peterson Насколько безопасно использовать? Нет проблем с безопасностью? - person shrey Pav; 30.10.2017

В ASP.NET MVC (начиная с версии 3) вы можете добавить _ 1_ свойству в вашей модели.

Это позволяет запросу включать разметку HTML во время привязки модели, пропуская проверку запроса для свойства.

[AllowHtml]
public string Description { get; set; }
person Anthony Johnston    schedule 05.09.2011
comment
Намного лучше сделать это декларативно, чем в контроллере! - person Andiih; 09.03.2012
comment
Это исчезло в MVC 4? - person granadaCoder; 24.07.2015
comment
Вроде бы только в DotNet 4.0 Framework. msdn.microsoft.com/ ru-us / library / Что делать ??? - person granadaCoder; 24.07.2015
comment
спасибо, чувак ... ты молодец ... я действительно ценю этот ответ ... спасибо ... спасибо ... 2 часа потрачены на поиск y, я получаю эту ошибку - person Rakeshyadvanshi; 18.01.2016
comment
В чем разница между ValidateInput(false) и AllowHtml? В чем преимущество одного перед другим? Когда я хочу использовать AllowHtml вместо ValidateInput(false)? Когда я хочу использовать ValidateInput(false) вместо AllowHtml? Когда я захочу использовать оба? Есть ли смысл использовать оба? - person Ian Boyd; 29.07.2016
comment
ValidateInput находится в методе, AllowHtml находится в свойстве модели, поэтому вы разрешаете только тот, который, как вы ожидаете, будет иметь html, а не все - person Anthony Johnston; 10.08.2016
comment
Я использовал [AllowHtml], но оказался в ситуации, когда у меня нет модели, поскольку форма содержит динамический набор свойств, основанный на конфигурации, управляемой данными. Привязка модели недостаточно умна, чтобы вернуть их в списки, поэтому я анализирую их из Request.Form. Есть ли способ сделать это только для одного поля в Request.Form, или мне, возможно, что-то не хватает, как обрабатывать этот вариант использования в MVC? - person Julia McGuigan; 06.06.2018
comment
Использовать [AllowHtml]. Пожалуйста, добавьте using System.Web.Mvc; Это помогло мне оставаться в безопасности, а также избежать единственного поля, в котором я ожидал получить опасный незашифрованный HTML. Совет от профессионалов: использование System.Web; // Перед сохранением в базу данных обязательно запустите кодировщик html, подобный этой строке myEncodedString = HttpUtility.HtmlEncode (myString); // При извлечении из базы данных вы можете аналогичным образом запустить декодер, подобный этому StringWriter myWriter = new StringWriter (); // Декодируем закодированную строку следующим образом. HttpUtility.HtmlDecode (myEncodedString, myWriter); - person Paras Parmar; 05.06.2020

Если вы используете .NET 4.0, убедитесь, что вы добавили это в свой файл web.config внутри тегов <system.web>:

<httpRuntime requestValidationMode="2.0" />

В .NET 2.0 проверка запроса применяется только к aspx запросам. В .NET 4.0 это было расширено и теперь включает все запросы. Вы можете вернуться к только проверке XSS при обработке .aspx, указав:

requestValidationMode="2.0"

Вы можете отключить проверку запроса полностью, указав:

validateRequest="false"
person JordanC    schedule 30.07.2010
comment
Внутри тегов <system.web>. - person Hosam Aly; 04.11.2010
comment
Я поместил это в web.config, но до сих пор вызывает ошибку. Потенциально опасное значение Request.Form. - person Filip; 12.12.2010
comment
Похоже, ‹httpRuntime requestValidationMode = 2.0 /› работает только тогда, когда на машине установлен фреймворк 2.0. Что делать, если фреймворк 2.0 не установлен вообще, а установлен только фреймворк 4.0? - person Samuel; 20.07.2011
comment
Это полностью сработало для меня. Ни один из шагов документа в других ответах не был необходим (включая validateRequest = false)! - person tom redfern; 02.10.2012

Для ASP.NET 4.0 вы можете разрешить разметку в качестве входных данных для определенных страниц, а не для всего сайта, поместив все это в элемент <location>. Это обеспечит безопасность всех остальных ваших страниц. Вам НЕ нужно помещать ValidateRequest="false" на вашу страницу .aspx.

<configuration>
...
  <location path="MyFolder/.aspx">
    <system.web>
      <pages validateRequest="false" />
      <httpRuntime requestValidationMode="2.0" />
    </system.web>
  </location>
...
</configuration>

Это безопаснее контролировать внутри вашего web.config, потому что вы можете видеть на уровне сайта, какие страницы допускают разметку в качестве входных данных.

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

person Carter Medlin    schedule 27.11.2012
comment
Подробнее о requestValidationMode = 2 | 4 здесь: msdn.microsoft.com/en-us/library/ - person GlennG; 13.02.2015
comment
К сожалению, это не будет работать с ASP.net 2.0 как есть. Удалите строку httpRuntime, и она заработает. - person Fandango68; 11.03.2015
comment
Я добавил предупреждение, напоминающее людям о необходимости вручную проверять ввод, когда проверка отключена. - person Carter Medlin; 17.06.2015

Предыдущие ответы хороши, но никто не сказал, как исключить одно поле из проверки для инъекций HTML / JavaScript. Я не знаю о предыдущих версиях, но в MVC3 Beta вы можете сделать это:

[HttpPost, ValidateInput(true, Exclude = "YourFieldName")]
public virtual ActionResult Edit(int id, FormCollection collection)
{
    ...
}

Это по-прежнему проверяет все поля, кроме исключенного. Приятно то, что ваши атрибуты проверки по-прежнему проверяют поле, но вы просто не получаете исключения «Потенциально опасное значение Request.Form было обнаружено от клиента».

Я использовал это для проверки регулярного выражения. Я создал свой собственный атрибут ValidationAttribute, чтобы проверить, допустимо ли регулярное выражение. Поскольку регулярные выражения могут содержать что-то похожее на скрипт, я применил приведенный выше код - регулярное выражение все еще проверяется, действительно ли оно или нет, но не содержит ли оно скрипты или HTML.

person gligoran    schedule 06.11.2010
comment
К сожалению, похоже, что функция Exclude была удалена из MVC 3 RTW :( - person Matt Greer; 23.03.2011
comment
Также он не был включен в MVC 4 - person wilsjd; 27.06.2013
comment
Используйте [AllowHtml] в свойствах модели вместо [ValidateInput] в действии для достижения того же конечного результата. - person Mrchief; 25.03.2014
comment
@gligoran [AllowHtml] лучше, чем ValidateInput(false) для полей редактора? Поскольку [AllowHtml] определяется сразу для свойства, то есть поля редактора, и всякий раз, когда он используется, нет необходимости использовать его для нескольких действий. Что ты посоветуешь? - person Jack; 22.07.2015
comment
@Christof Обратите внимание, что моему ответу 5 лет. Я очень давно не сталкивался с этой проблемой, так что, возможно, есть гораздо более эффективные способы ее решения. Что касается этих двух вариантов, я думаю, это зависит от вашей ситуации. Возможно, вы раскрываете эту модель более чем в одном действии, и в некоторых местах HTML разрешен или запрещен. В таком случае [AllowHtml] не вариант. Я рекомендую прочитать эту статью: weblogs.asp .net / imranbaloch /, но он тоже несколько устарел и может быть устаревшим. - person gligoran; 22.07.2015
comment
@gligoran Хорошо, спасибо. Я попытался использовать [AllowHtml] в MVC5, но увидел, что ValidateInput(false) лучше и без проблем. Еще раз спасибо за ответ. - person Jack; 22.07.2015
comment
Еще есть способ исключить определенные параметры метода из проверки, посмотрите мой ответ здесь: stackoverflow.com/a/50796666/56621 - person Alex from Jitbit; 15.11.2018

В ASP.NET MVC вам необходимо установить requestValidationMode = "2.0" и validateRequest = "false" в web.config и применить атрибут ValidateInput к действию вашего контроллера:

<httpRuntime requestValidationMode="2.0"/>

<configuration>
    <system.web>
        <pages validateRequest="false" />
    </system.web>
</configuration>

а также

[Post, ValidateInput(false)]
public ActionResult Edit(string message) {
    ...
}
person ranthonissen    schedule 30.11.2010
comment
Для меня validateRequest="false" не был нужен, только requestValidationMode="2.0" - person tom redfern; 02.10.2012
comment
requestValidationMode = 2.0 по-прежнему генерирует ошибку с данными в кодировке HTML. Нет решения, кроме как base64 кодировать все, а затем отправлять его. - person MC9000; 13.06.2015

Вы можете HTML-кодировать содержимое текстового поля, но, к сожалению, это не остановит исключение. По моему опыту, нет никакого пути, и вам нужно отключить проверку страницы. Поступая так, вы говорите: «Я буду осторожен, обещаю».

person Pavel Chuchuva    schedule 17.09.2008

Ответ на этот вопрос прост:

var varname = Request.Unvalidated["parameter_name"];

Это отключит проверку для конкретного запроса.

person flakomalo    schedule 25.04.2013
comment
Применимо только для ASP.NET 4.5 (и, предположительно, для всего, что будет после него). Pre 4.5 не поддерживает это. - person Beska; 04.11.2014
comment
Хотел бы я подскочить сюда. Я использую .NET 4.5, и это именно то, что мне нужно, поскольку я не использую MVC и не могу изменить web.config. - person Chris Gillum; 18.11.2014
comment
Да, но что, если вы используете .Net 2? У некоторых из нас нет выбора - person Fandango68; 18.03.2015
comment
это получает параметры POST или GET? - person max4ever; 15.04.2015
comment
Вы говорите, что это предотвращает уже созданное исключение? Или .net 4.5 задерживает исключение и проверку до тех пор, пока данные не будут фактически прочитаны из Request? - person ebyrob; 08.03.2017
comment
Это был единственный вариант, которым я мог воспользоваться. Мне нужно извлекать непосредственно из запроса / формы, без использования моделей или параметров в MVC. Другие варианты по-прежнему подтверждали ввод. - person Jesse Sierks; 17.10.2017

Вы можете поймать эту ошибку в Global.asax. Я все еще хочу подтвердить, но показать соответствующее сообщение. В указанном ниже блоге был доступен такой образец.

    void Application_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();

        if (ex is HttpRequestValidationException)
        {
            Response.Clear();
            Response.StatusCode = 200;
            Response.Write(@"[html]");
            Response.End();
        }
    }

Перенаправление на другую страницу также кажется разумным ответом на исключение.

http://www.romsteady.net/blog/2007/06/how-to-catch-httprequestvalidationexcep.html

person BenMaddox    schedule 13.10.2009

Для MVC игнорируйте проверку ввода, добавив

[ValidateInput (false)]

над каждым действием в контроллере.

person A.Dara    schedule 29.01.2014
comment
Похоже, это не работает в случае, если он попадает в метод контроллера через настроенный маршрут. - person PandaWood; 24.03.2016
comment
На самом деле, техническое объяснение заключается в том, что это работает только тогда, когда оскорбительный символ находится в строке запроса ... если он находится в пути запроса, атрибут Validation не работает - person PandaWood; 24.03.2016

Имейте в виду, что некоторые элементы управления .NET автоматически кодируют выходные данные в формате HTML. Например, установка свойства .Text в элементе управления TextBox автоматически закодирует его. В частности, это означает преобразование < в &lt;, > в &gt; и & в &amp;. Так что будьте осторожны с этим ...

myTextBox.Text = Server.HtmlEncode(myStringFromDatabase); // Pseudo code

Однако свойство .Text для HyperLink, Literal и Label не будет кодировать HTML, поэтому обертывание Server.HtmlEncode (); вокруг чего-либо, установленного в этих свойствах, необходимо, если вы хотите предотвратить вывод <script> window.location = "http://www.google.com"; </script> на вашу страницу и его последующее выполнение.

Поэкспериментируйте, чтобы увидеть, что кодируется, а что нет.

person Community    schedule 17.09.2008

В файле web.config внутри тегов вставьте элемент httpRuntime с атрибутом requestValidationMode = "2.0". Также добавьте атрибут validateRequest = "false" в элемент страниц.

Пример:

<configuration>
  <system.web>
   <httpRuntime requestValidationMode="2.0" />
  </system.web>
  <pages validateRequest="false">
  </pages>
</configuration>
person Mahdi jokar    schedule 14.03.2012
comment
Для меня validateRequest = false не нужен, только requestValidationMode = 2.0 - person tom redfern; 02.10.2012
comment
Раздел страниц должен находиться в разделе system.web. - person Carter Medlin; 27.11.2012
comment
опасный ответ, еще раз. - person MC9000; 13.06.2015
comment
Мне было нужно и то, и другое. Спасибо - person Jack; 23.02.2016

Если вы не хотите отключать ValidateRequest, вам необходимо реализовать функцию JavaScript, чтобы избежать исключения. Не лучший вариант, но работает.

function AlphanumericValidation(evt)
{
    var charCode = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode :
        ((evt.which) ? evt.which : 0));

    // User type Enter key
    if (charCode == 13)
    {
        // Do something, set controls focus or do anything
        return false;
    }

    // User can not type non alphanumeric characters
    if ( (charCode <  48)                     ||
         (charCode > 122)                     ||
         ((charCode > 57) && (charCode < 65)) ||
         ((charCode > 90) && (charCode < 97))
       )
    {
        // Show a message or do something
        return false;
    }
}

Затем в коде позади события PageLoad добавьте атрибут в свой элемент управления с помощью следующего кода:

Me.TextBox1.Attributes.Add("OnKeyPress", "return AlphanumericValidation(event);")
person Community    schedule 12.01.2009
comment
Это по-прежнему оставит приложение уязвимым для поддельных запросов POST. У обычного пользователя возникнут проблемы с вводом символов, таких как,: или кавычек, но у обычного хакера не будет проблем с POST-отправкой искаженных данных на сервер. Я бы отказался от этого отказа. - person Radu094; 27.10.2009
comment
@ Radu094: это решение позволяет сохранить ValidateRequest = true, что означает, что хакеры все равно будут атаковать эту стену. Голосуйте за, так как это делает вас менее уязвимым, чем отключение ValidateRequest. - person jbehren; 17.08.2011

Кажется, никто еще не упомянул об этом ниже, но это решает проблему для меня. И прежде чем кто-нибудь скажет, что да, это Visual Basic ... фу.

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Example.aspx.vb" Inherits="Example.Example" **ValidateRequest="false"** %>

Не знаю, есть ли какие-то недостатки, но для меня это сработало потрясающе.

person Piercy    schedule 27.01.2012
comment
Работает для веб-форм c # или VB - person TheAlbear; 22.10.2014

Другое решение:

protected void Application_Start()
{
    ...
    RequestValidator.Current = new MyRequestValidator();
}

public class MyRequestValidator: RequestValidator
{
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
    {
        bool result = base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);

        if (!result)
        {
            // Write your validation here
            if (requestValidationSource == RequestValidationSource.Form ||
                requestValidationSource == RequestValidationSource.QueryString)

                return true; // Suppress error message
        }
        return result;
    }
}
person Sel    schedule 08.12.2013
comment
Отлично! Не знал о возможности заменить валидатор запросов. Вместо того, чтобы просто сказать хорошо, как вы, я расширил эту идею, чтобы не проверять поля, которые заканчиваются на _NoValidation в качестве своего имени. Код ниже. - person Walden Leverich; 02.05.2014
comment
Вальден Леверих, для этого см. Атрибут [AllowHtml] - person Sel; 28.01.2015
comment
Сел, да, в среде MVC это сработает. Но в приложении веб-форм у меня нет модели для этого. :-) - person Walden Leverich; 30.01.2015

Если вы используете framework 4.0, тогда запись в web.config (‹pages validateRequest =" false "/>)

<configuration>
    <system.web>
        <pages validateRequest="false" />
    </system.web>
</configuration>

Если вы используете framework 4.5, тогда запись в файле web.config (requestValidationMode = "2.0")

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" requestValidationMode="2.0"/>
</system.web>

Если вы хотите только одну страницу, в вашем aspx файле вы должны поместить первую строку следующим образом:

<%@ Page EnableEventValidation="false" %>

если у вас уже есть что-то вроде ‹% @ Page, просто добавьте остальное => EnableEventValidation="false"%>

Рекомендую этого не делать.

person Durgesh Pandey    schedule 10.12.2015

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

Отображение дружественного сообщения:

protected override void OnError(EventArgs e)
{
    base.OnError(e);
    var ex = Server.GetLastError().GetBaseException();
    if (ex is System.Web.HttpRequestValidationException)
    {
        Response.Clear();
        Response.Write("Invalid characters."); //  Response.Write(HttpUtility.HtmlEncode(ex.Message));
        Response.StatusCode = 200;
        Response.End();
    }
}
person Jaider    schedule 17.07.2012

Я думаю, вы могли бы сделать это в модуле; но это оставляет открытыми некоторые вопросы; что, если вы хотите сохранить ввод в базу данных? Внезапно из-за того, что вы сохраняете закодированные данные в базе данных, вы в конечном итоге доверяете вводимым из нее данным, что, вероятно, является плохой идеей. В идеале вы храните необработанные некодированные данные в базе данных и каждый раз кодируете.

Отключение защиты на уровне страницы и последующее кодирование каждый раз - лучший вариант.

Вместо использования Server.HtmlEncode вам следует взглянуть на более новый, более полный Библиотека Anti-XSS от команды Microsoft ACE.

person blowdart    schedule 17.09.2008

Я нашел решение, которое использует JavaScript для кодирования данных, которые декодируются в .NET (и не требуют jQuery).

  • Сделайте текстовое поле элементом HTML (например, textarea) вместо элемента ASP.
  • Добавьте скрытое поле.
  • # P2 # function boo () {targetText = document.getElementById ("HiddenField1"); sourceText = document.getElementById ("ящик пользователя"); targetText.value = escape (sourceText.innerText); }

В текстовое поле включите onchange, который вызывает boo ():

<textarea id="userbox"  onchange="boo();"></textarea>

Наконец, в .NET используйте

string val = Server.UrlDecode(HiddenField1.Value);

Я знаю, что это односторонний подход - если вам нужен двусторонний, вам придется проявить творческий подход, но это дает решение, если вы не можете редактировать web.config

Вот пример, который я (MC9000) придумал и использовал через jQuery:

$(document).ready(function () {

    $("#txtHTML").change(function () {
        var currentText = $("#txtHTML").text();
        currentText = escape(currentText); // Escapes the HTML including quotations, etc
        $("#hidHTML").val(currentText); // Set the hidden field
    });

    // Intercept the postback
    $("#btnMyPostbackButton").click(function () {
        $("#txtHTML").val(""); // Clear the textarea before POSTing
                               // If you don't clear it, it will give you
                               // the error due to the HTML in the textarea.
        return true; // Post back
    });


});

И разметка:

<asp:HiddenField ID="hidHTML" runat="server" />
<textarea id="txtHTML"></textarea>
<asp:Button ID="btnMyPostbackButton" runat="server" Text="Post Form" />

Это прекрасно работает. Если хакер попытается опубликовать сообщение в обход JavaScript, он просто увидит ошибку. Вы также можете сохранить все эти данные в кодировке в базе данных, затем отключить их (на стороне сервера) и проанализировать и проверить на наличие атак перед отображением в другом месте.

person Jason Shuler    schedule 16.09.2014
comment
Это хорошее решение. Это правильный ручной способ контролировать его самостоятельно и не делать недействительным весь веб-сайт или страницу. - person Fandango68; 18.03.2015
comment
Убедитесь, что вы используете разметку HTML, а не элемент управления ASP.Net (т.е. без runat = server) для текстовой области, затем используйте скрытый элемент управления ASP.Net для скрытого. Это лучшее решение, которое я видел без компромисса. Естественно, вы хотите проанализировать свои данные для XSS, SQL Injection на стороне сервера, но, по крайней мере, вы можете опубликовать HTML - person MC9000; 13.06.2015
comment
escape(...) может занять много времени. В моем случае разметка представляла собой целый XML-файл (2 МБ). Вы можете спросить, почему бы вам просто не использовать <input type="file"... и ... Я с вами согласен :) - person The Red Pea; 12.09.2016

Причина

ASP.NET по умолчанию проверяет все элементы управления вводом на предмет потенциально небезопасного содержимого, которое может привести к межсайтовому скриптингу (XSS) и SQL-инъекции. Таким образом, он запрещает такой контент, вызывая указанное выше исключение. По умолчанию рекомендуется разрешить эту проверку при каждой обратной передаче.

Решение

Во многих случаях вам необходимо отправить HTML-контент на свою страницу через Rich TextBoxes или Rich Text Editors. В этом случае вы можете избежать этого исключения, установив для тега ValidateRequest в директиве @Page значение false.

<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest = "false" %>

Это отключит проверку запросов для страницы, для которой вы установили флаг ValidateRequest в значение false. Если вы хотите отключить это, проверьте все свое веб-приложение; вам нужно будет установить для него значение false в разделе web.config ‹system.web>

<pages validateRequest ="false" />

Для платформ .NET 4.0 или более поздних версий вам также потребуется добавить следующую строку в раздел ‹system.web>, чтобы все вышеперечисленное работало.

<httpRuntime requestValidationMode = "2.0" />

Вот и все. Надеюсь, это поможет вам избавиться от указанной выше проблемы.

Ссылка: Ошибка ASP.Net: от клиента обнаружено потенциально опасное значение Request.Form

person vakeel    schedule 15.06.2015

Другие решения здесь хороши, однако это немного неудобно применять [AllowHtml] к каждому отдельному свойству Model, особенно если у вас более 100 моделей на сайте приличного размера.

Если, как и я, вы хотите отключить эту (ИМХО, довольно бессмысленную) функцию за пределами сайта, вы можете переопределить метод Execute () в своем базовом контроллере (если у вас еще нет базового контроллера, я предлагаю вам сделать его, они могут быть довольно полезно для применения общих функций).

    protected override void Execute(RequestContext requestContext)
    {
        // Disable requestion validation (security) across the whole site
        ValidateRequest = false;
        base.Execute(requestContext);
    }

Просто убедитесь, что вы кодируете HTML все, что перекачивается в представления, поступающие из пользовательского ввода (в любом случае это поведение по умолчанию в ASP.NET MVC 3 с Razor, поэтому, если по какой-то странной причине вы не используете Html.Raw (), вы эта функция не требуется.

person magritte    schedule 16.03.2012

Я тоже получал эту ошибку.

В моем случае пользователь ввел акцентированный символ á в имени роли (относительно поставщика членства в ASP.NET).

Я передаю имя роли методу для предоставления этой роли пользователям, и почтовый запрос $.ajax терпел неудачу ...

Я сделал это, чтобы решить проблему:

Вместо того

data: { roleName: '@Model.RoleName', users: users }

Сделай это

data: { roleName: '@Html.Raw(@Model.RoleName)', users: users }

@Html.Raw сделал свое дело.

Я получал имя роли как HTML-значение roleName="Cadastro b&#225;s". Это значение с HTML-сущностью &#225; было заблокировано ASP.NET MVC. Теперь я получаю значение параметра roleName таким, каким оно должно быть: roleName="Cadastro Básico" и механизм ASP.NET MVC больше не будет блокировать запрос.

person Leniel Maccaferri    schedule 14.08.2012

Отключите проверку страницы, если вам действительно нужны специальные символы, такие как, >,, < и т. Д. Затем убедитесь, что при отображении пользовательского ввода данные закодированы в HTML.

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

См .: http://web.archive.org/web/20080913071637/http://www.procheckup.com:80/PDFs/bypassing-dot-NET-ValidateRequest.pdf

person woany    schedule 17.09.2008
comment
Ссылка не работает. - person Peter Mortensen; 24.06.2017

Вы также можете использовать функцию JavaScript escape (string) для замены специальных символов. Затем на стороне сервера используйте Server. URLDecode (string), чтобы переключить его обратно.

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

person Trisped    schedule 11.02.2012

В итоге я использовал JavaScript перед каждой обратной передачей, чтобы проверять символы, которые вам не нужны, например:

<asp:Button runat="server" ID="saveButton" Text="Save" CssClass="saveButton" OnClientClick="return checkFields()" />

function checkFields() {
    var tbs = new Array();
    tbs = document.getElementsByTagName("input");
    var isValid = true;
    for (i=0; i<tbs.length; i++) {
        if (tbs(i).type == 'text') {
            if (tbs(i).value.indexOf('<') != -1 || tbs(i).value.indexOf('>') != -1) {
                alert('<> symbols not allowed.');
                isValid = false;
            }
        }
    }
    return isValid;
}

Конечно, моя страница - это в основном ввод данных, и очень мало элементов, которые выполняют обратную передачу, но, по крайней мере, их данные сохраняются.

person Ryan    schedule 03.08.2012
comment
Вместо маленьких скобок должны быть большие. Например, `if (tbs [i] .type == 'text') {` вместо `if (tbs (i) .type == 'text') {` - person Shilpa Soni; 12.09.2014

Вы можете использовать что-то вроде:

var nvc = Request.Unvalidated().Form;

Позже nvc["yourKey"] должно работать.

person Ady Levy    schedule 31.05.2013
comment
Спасибо, ваш ответ сэкономил мне много времени - person habib; 27.05.2020

Для тех, кто не использует привязку модели, извлекает каждый параметр из Request.Form, кто уверен, что вводимый текст не причинит вреда, есть другой способ. Не лучшее решение, но оно сработает.

Со стороны клиента закодируйте его как uri, а затем отправьте.
например:

encodeURIComponent($("#MsgBody").val());  

Со стороны сервера примите его и расшифруйте как uri.
например:

string temp = !string.IsNullOrEmpty(HttpContext.Current.Request.Form["MsgBody"]) ?
System.Web.HttpUtility.UrlDecode(HttpContext.Current.Request.Form["MsgBody"]) : 
null;  

or

string temp = !string.IsNullOrEmpty(HttpContext.Current.Request.Form["MsgBody"]) ?
System.Uri.UnescapeDataString(HttpContext.Current.Request.Form["MsgBody"]) : 
null; 

пожалуйста, обратите внимание на различия между UrlDecode и UnescapeDataString

person Wahid Masud    schedule 24.07.2018

Если это только "‹ "и"> "(а не сама двойная кавычка) символы, и вы используете их в контексте, например‹ input value = "this "/›, Вы в безопасности (в то время как для ‹textarea› этого ‹/textarea› вы, конечно, будете уязвимы). Это может упростить вашу ситуацию, но для чего-нибудь используйте одно из других опубликованных решений.

person Paweł Hajdan    schedule 17.09.2008

Если вы просто хотите сказать своим пользователям, что ‹и> не должны использоваться, НО, вы не хотите, чтобы вся форма была обработана / отправлена ​​обратно (и потеряла весь ввод) заранее, не могли бы вы просто вставить валидатор вокруг поля для проверки этих (и, возможно, других потенциально опасных) символов?

person Captain Toad    schedule 17.09.2008
comment
отправьте указанный валидатор, пожалуйста - person mxmissile; 06.02.2018

Ни одно из предложений у меня не сработало. Я все равно не хотел отключать эту функцию для всего веб-сайта, потому что в 99% случаев я не хочу, чтобы мои пользователи размещали HTML в веб-формах. Я только что создал свой собственный метод обхода, поскольку я единственный, кто использует это конкретное приложение. Я конвертирую входные данные в HTML в коде позади и вставляю его в свою базу данных.

person Mike S.    schedule 17.02.2013

Как указано в моем комментарии к Ответ Sel, это наше расширение для настраиваемого валидатора запросов.

public class SkippableRequestValidator : RequestValidator
{
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
    {
        if (collectionKey != null && collectionKey.EndsWith("_NoValidation"))
        {
            validationFailureIndex = 0;
            return true;
        }

        return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
    }
}
person Walden Leverich    schedule 01.05.2014

Вы можете автоматически кодировать поле HTML в настраиваемой привязке модели. Мое решение несколько иное, я помещаю ошибку в ModelState и отображаю сообщение об ошибке рядом с полем. Этот код легко изменить для автоматического кодирования

 public class AppModelBinder : DefaultModelBinder
    {
        protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
        {
            try
            {
                return base.CreateModel(controllerContext, bindingContext, modelType);
            }
            catch (HttpRequestValidationException e)
            {
                HandleHttpRequestValidationException(bindingContext, e);
                return null; // Encode here
            }
        }
        protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext,
            PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
        {
            try
            {
                return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
            }
            catch (HttpRequestValidationException e)
            {
                HandleHttpRequestValidationException(bindingContext, e);
                return null; // Encode here
            }
        }

        protected void HandleHttpRequestValidationException(ModelBindingContext bindingContext, HttpRequestValidationException ex)
        {
            var valueProviderCollection = bindingContext.ValueProvider as ValueProviderCollection;
            if (valueProviderCollection != null)
            {
                ValueProviderResult valueProviderResult = valueProviderCollection.GetValue(bindingContext.ModelName, skipValidation: true);
                bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueProviderResult);
            }

            string errorMessage = string.Format(CultureInfo.CurrentCulture, "{0} contains invalid symbols: <, &",
                     bindingContext.ModelMetadata.DisplayName);

            bindingContext.ModelState.AddModelError(bindingContext.ModelName, errorMessage);
        }
    }

В Application_Start:

ModelBinders.Binders.DefaultBinder = new AppModelBinder();

Обратите внимание, что это работает только для полей формы. Опасное значение не передается в модель контроллера, но сохраняется в ModelState и может быть повторно отображено в форме с сообщением об ошибке.

С опасными символами в URL можно обращаться следующим образом:

private void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    HttpContext httpContext = HttpContext.Current;

    HttpException httpException = exception as HttpException;
    if (httpException != null)
    {
        RouteData routeData = new RouteData();
        routeData.Values.Add("controller", "Error");
        var httpCode = httpException.GetHttpCode();
        switch (httpCode)
        {
            case (int)HttpStatusCode.BadRequest /* 400 */:
                if (httpException.Message.Contains("Request.Path"))
                {
                    httpContext.Response.Clear();
                    RequestContext requestContext = new RequestContext(new HttpContextWrapper(Context), routeData);
                    requestContext.RouteData.Values["action"] ="InvalidUrl";
                    requestContext.RouteData.Values["controller"] ="Error";
                    IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
                    IController controller = factory.CreateController(requestContext, "Error");
                    controller.Execute(requestContext);
                    httpContext.Server.ClearError();
                    Response.StatusCode = (int)HttpStatusCode.BadRequest /* 400 */;
                }
                break;
        }
    }
}

ErrorController:

public class ErrorController : Controller
 {
   public ActionResult InvalidUrl()
   {
      return View();
   }
}   
person Sel    schedule 25.02.2016
comment
Пришел сюда только для того, чтобы опубликовать это. Жаль, что он навсегда останется похороненным на второй странице - это, ИМХО, лучшее решение. - person PJ7; 02.05.2018

в моем случае, используя элемент управления asp: Textbox (Asp.net 4.5), вместо того, чтобы устанавливать всю страницу для validateRequest="false", я использовал

<asp:TextBox runat="server" ID="mainTextBox"
            ValidateRequestMode="Disabled"
 ></asp:TextBox>

в текстовом поле, вызвавшем исключение.

person maozx    schedule 03.12.2018

Вы должны использовать метод Server.HtmlEncode, чтобы защитить свой сайт от опасного ввода.

Подробнее здесь

person bastos.sergio    schedule 17.09.2008
comment
Используйте библиотеку Anti-XSS, чтобы предотвратить эту ошибку ... это неполно. - person halfbit; 22.10.2011
comment
Было бы полезно дать немного больше объяснений, как это сделать. - person Joren Vandamme; 06.03.2019

Решение

Я не люблю отключать проверку сообщений (validateRequest = "false"). С другой стороны, недопустимо, чтобы приложение вылетало из-за того, что невиновный пользователь набрал <x или что-то в этом роде.

Поэтому я написал функцию javascript на стороне клиента (xssCheckValidates), которая выполняет предварительную проверку. Эта функция вызывается при попытке опубликовать данные формы, например:

<form id="form1" runat="server" onsubmit="return xssCheckValidates();">

Функция довольно проста и может быть улучшена, но она выполняет свою работу.

Обратите внимание, что целью этого является не защита системы от взлома, а защита пользователей от плохого опыта. Проверка запроса, выполняемая на сервере, все еще включена, и это (часть) защиты системы (в той степени, в которой она способна это делать).

Причина, по которой я говорю «часть» здесь, заключается в том, что я слышал, что встроенной проверки запросов может быть недостаточно, поэтому для полной защиты могут потребоваться другие дополнительные средства. Но, опять же, функция javascript, которую я здесь представляю, не имеет ничего отношения к защите системы. Это только предназначено для того, чтобы у пользователей не было плохого опыта.

Вы можете попробовать это здесь:

    function xssCheckValidates() {
      var valid = true;
      var inp = document.querySelectorAll(
          "input:not(:disabled):not([readonly]):not([type=hidden])" +
          ",textarea:not(:disabled):not([readonly])");
      for (var i = 0; i < inp.length; i++) {
        if (!inp[i].readOnly) {
          if (inp[i].value.indexOf('<') > -1) {
            valid = false;
            break;
          }
          if (inp[i].value.indexOf('&#') > -1) {
            valid = false;
            break;
          }
        }
      }
      if (valid) {
        return true;
      } else {
        alert('In one or more of the text fields, you have typed\r\nthe character "<" or the character sequence "&#".\r\n\r\nThis is unfortunately not allowed since\r\nit can be used in hacking attempts.\r\n\r\nPlease edit the field and try again.');
        return false;
      }
    }
<form onsubmit="return xssCheckValidates();" >
  Try to type < or &# <br/>
  <input type="text" /><br/>
  <textarea></textarea>
  <input type="submit" value="Send" />
</form>

person Magnus    schedule 03.04.2018
comment
Вы должны предполагать, что любой код, выполняемый на клиенте, будет нарушен. - person user169771; 05.04.2018
comment
@ user169771, прочтите мой ответ еще раз, особенно ту часть, которая начинается с Обратите внимание, что цель этого не состоит в том, чтобы защитить систему от взлома ... - person Magnus; 05.04.2018

Я знаю, что этот вопрос касается публикации формы, но я хотел бы добавить некоторые сведения о людях, которые получили эту ошибку при других обстоятельствах. Это также может произойти в обработчике, используемом для реализации веб-службы.

Предположим, ваш веб-клиент отправляет запросы POST или PUT с помощью ajax и отправляет текст в формате json или xml или необработанные данные (содержимое файла) вашей веб-службе. Поскольку вашей веб-службе не требуется получать какую-либо информацию из заголовка Content-Type, ваш код JavaScript не установил этот заголовок для вашего запроса ajax. Но если вы не установите этот заголовок в запросе POST / PUT ajax, Safari может добавить этот заголовок: «Content-Type: application / x-www-form-urlencoded». Я заметил это в Safari 6 на iPhone, но другие версии Safari / OS или Chrome могут делать то же самое. Таким образом, при получении этого заголовка Content-Type некоторая часть .NET Framework предполагает, что структура данных тела запроса соответствует публикации формы html, в то время как это не так, и возникает исключение HttpRequestValidationException. Первое, что нужно сделать, это, очевидно, всегда устанавливать заголовок Content-Type как угодно, кроме MIME-типа формы в запросе POST / PUT ajax, даже если он бесполезен для вашей веб-службы.

Я также обнаружил эту деталь:
В этих обстоятельствах возникает исключение HttpRequestValidationException, когда ваш код пытается получить доступ к коллекции HttpRequest.Params. Но, что удивительно, это исключение не возникает при обращении к коллекции HttpRequest.ServerVariables. Это показывает, что, хотя эти две коллекции кажутся почти идентичными, одна получает доступ к данным запроса через проверки безопасности, а другая - нет.

person figolu    schedule 04.05.2018

Используйте Server.HtmlEncode("yourtext");

person Voigt    schedule 19.04.2016

Для тех из нас, кто все еще застрял в веб-формах, я нашел следующее решение, которое позволяет отключить проверку только для одного поля! (Я бы не хотел отключать его для всей страницы.)

VB.NET:

Public Class UnvalidatedTextBox
    Inherits TextBox
    Protected Overrides Function LoadPostData(postDataKey As String, postCollection As NameValueCollection) As Boolean
        Return MyBase.LoadPostData(postDataKey, System.Web.HttpContext.Current.Request.Unvalidated.Form)
    End Function
End Class

C#:

public class UnvalidatedTextBox : TextBox
{
    protected override bool LoadPostData(string postDataKey, NameValueCollection postCollection)
    {
        return base.LoadPostData(postDataKey, System.Web.HttpContext.Current.Request.Unvalidated.Form);
    }
}

Теперь просто используйте <prefix:UnvalidatedTextBox id="test" runat="server" /> вместо <asp:TextBox, и он должен разрешать все символы (это идеально подходит для полей пароля!)

person Peter    schedule 16.01.2017

И последнее, но не менее важное: обратите внимание, что элементы управления привязкой данных ASP.NET автоматически кодируют значения во время привязки данных. Это изменяет поведение по умолчанию всех элементов управления ASP.NET (TextBox, Label и т. Д.), Содержащихся в ItemTemplate. Следующий пример демонстрирует (для ValidateRequest установлено значение false):

aspx

<%@ Page Language="C#" ValidateRequest="false" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication17._Default" %> <html> <body>
    <form runat="server">
        <asp:FormView ID="FormView1" runat="server" ItemType="WebApplication17.S" SelectMethod="FormView1_GetItem">
            <ItemTemplate>
                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
                <asp:Label ID="Label1" runat="server" Text="<%#: Item.Text %>"></asp:Label>
                <asp:TextBox ID="TextBox2" runat="server" Text="<%#: Item.Text %>"></asp:TextBox>
            </ItemTemplate>
        </asp:FormView>
    </form> 

код позади

public partial class _Default : Page
{
    S s = new S();

    protected void Button1_Click(object sender, EventArgs e)
    {
        s.Text = ((TextBox)FormView1.FindControl("TextBox1")).Text;
        FormView1.DataBind();
    }

    public S FormView1_GetItem(int? id)
    {
        return s;
    }
}

public class S
{
    public string Text { get; set; }
}
  1. Значение отправки обращения: &#39;

Label1.Text значение: &#39;

TextBox2.Text значение: &amp;#39;

  1. Значение отправки обращения: <script>alert('attack!');</script>

Label1.Text значение: <script>alert('attack!');</script>

TextBox2.Text значение: &lt;script&gt;alert(&#39;attack!&#39;);&lt;/script&gt;

person dpant    schedule 27.01.2018

Я вижу, об этом много написано ... и я не видел, чтобы об этом упоминалось. Это было доступно с .NET Framework 4.5.

Параметр ValidateRequestMode для элемента управления отличный вариант. Таким образом, другие элементы управления на странице по-прежнему защищены. Никаких изменений web.config не требуется.

 protected void Page_Load(object sender, EventArgs e)
 {
     txtMachKey.ValidateRequestMode = ValidateRequestMode.Disabled;
 }
person Chris Catignani    schedule 30.03.2018
comment
@PruTahan .... а вам нужно было комментировать каждый пост, потому что? Сообщение об ошибке OP вызвано одной из множества различных причин. - person Chris Catignani; 09.01.2019

В .Net 4.0 и новее, что является обычным случаем, поместите следующую настройку в system.web

<system.web>
     <httpRuntime requestValidationMode="2.0" />
person Kiran Chaudhari    schedule 15.03.2018

Как решить эту проблему для AjaxExtControls в ASP.NET 4.6.2:

У нас была такая же проблема с редактором форматированного текста AjaxExtControls. Эта проблема возникла сразу после обновления .NET 2.0 до .NET 4.5. Я просмотрел все ответы SOF, но не смог найти решения, которое не нарушало бы безопасность, обеспечиваемую .NET 4.5.

Исправление 1 (не рекомендуется, так как оно может ухудшить безопасность приложения): я протестировал после изменения этого атрибута в requestValidationMode = "2.0, и оно сработало, но меня беспокоили функции безопасности. Так что это исправление похоже на снижение безопасности всего приложения.

Исправление 2 (рекомендуется): поскольку эта проблема возникала только с одним из AjaxExtControl, я, наконец, смог решить эту проблему, используя простой код ниже:

editorID.value = editorID.value.replace(/>/g, "&gt;");
editorID.value = editorID.value.replace(/</g, "&lt;");

Этот код выполняется на стороне клиента (javascript) перед отправкой запроса на сервер. Обратите внимание, что editorID - это не идентификатор, который у нас есть на наших страницах html / aspx, а идентификатор редактора форматированного текста, который AjaxExtControl внутренне использует.

person Sanjeev Singh    schedule 06.05.2020

У меня есть приложение веб-форм, в котором возникла эта проблема с полем комментариев текстового поля, куда пользователи иногда вставляли текст электронной почты, а символы ‹и› из информации заголовка электронной почты вкрадывались туда и вызывали это исключение.

Я рассмотрел проблему с другой стороны ... Я уже использовал Ajax Control Toolkit, поэтому я смог использовать FilteredTextBoxExtender, чтобы предотвратить ввод этих двух символов в текстовое поле. Пользователь, копирующий текст, получит то, что они ожидали, за вычетом этих символов.

<asp:TextBox ID="CommentsTextBox" runat="server" TextMode="MultiLine"></asp:TextBox>
<ajaxToolkit:FilteredTextBoxExtender ID="ftbe" runat="server" TargetControlID="CommentsTextBox" filterMode="InvalidChars" InvalidChars="<>" />
person syntap    schedule 08.04.2021

Попробуйте с

Server.Encode

а также

Server.HtmlDecode при отправке и получении.

person Devendra Patel    schedule 31.03.2015
comment
Вы даже не можете зайти так далеко (то есть вы не можете отправить ответ, поэтому ничего, что вы делаете в коде программной части, не будет работать) с проверкой на вопросе пользователя. - person MC9000; 13.06.2015