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

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

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

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

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

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

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

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

Есть ли способ, которым я могу сделать это из обработчика?

17.09.2008 10:58:14
Обратите внимание, что вы можете получить эту ошибку, если у вас также есть имена сущностей HTML (& amp;) или номера сущностей (& # 39;).
Drew Noakes 14.10.2010 02:50:02
Ну, так как это мой вопрос, я чувствую, что могу определить, в чем суть: срывать весь процесс приложения и возвращать общее сообщение об ошибке, потому что кто-то напечатал «<», это излишне. Тем более, что вы знаете, что большинство людей просто «validateRequest = false», чтобы избавиться от него, тем самым вновь открывая уязвимость
Radu094 18.09.2014 17:23:49
@DrewNoakes: имена объектов (& amp;), по-моему, не являются проблемой в соответствии с моими тестами (протестированными в .Net 4.0), хотя номера объектов (& # 39;) не проходят проверку (как вы сказали). Если вы разберете метод System.Web.CrossSiteScriptingValidation.IsDangerousString с помощью .Net Reflector, вы увидите, что код специально ищет html-теги (начиная с <) и номера сущностей (начиная с & #)
Gyum Fox 6.05.2015 15:52:04
Создайте новый сайт в VS2014, используя проект MVC по умолчанию, и запустите его. Нажмите на ссылку регистрации, добавьте любое электронное письмо и используйте «<P455-0r [!» как пароль. Та же ошибка из коробки, не пытаясь сделать что-либо вредоносное, поле пароля не будет отображаться, поэтому это не будет атака XSS, но единственный способ исправить это - полностью удалить проверку с помощью ValidateInput (false) ? Предложение AllowHtml не работает в этой ситуации, но все равно взорвалось с той же ошибкой. От клиента было обнаружено потенциально опасное значение Request.Form (Пароль = "<P455-0r [!").
stephenbayer 26.05.2015 22:34:11
TL; DR положил <httpRuntime requestValidationMode="2.0" />в web.config
user3638471 2.11.2016 19:15:55
30 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

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

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

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

1076
23.06.2017 22:39:33
Для тех, кто приходит поздно: validateRequest = "false" входит в директиву Page (первая строка вашего файла .aspx)
MGOwen 20.10.2010 05:28:34
Совет: вставьте <httpRuntime requestValidationMode="2.0" />тег местоположения, чтобы избежать потери полезной защиты, обеспечиваемой проверкой с остальной части вашего сайта.
Brian 17.05.2011 14:05:29
В MVC3 это находится [AllowHtml]на свойстве модели.
Jeremy Holovacs 9.09.2011 19:30:08
Для того, чтобы отключить его глобально для MVC 3 также необходимо GlobalFilters.Filters.Add(new ValidateInputAttribute(false));в Application_Start().
Alex 18.07.2012 11:14:03
@MGOwen вы также можете добавить директиву страницы в web.config через <pages validateRequest="false" />in <system.web />. При этом свойство будет применено ко всем страницам.
oliver-clare 31.07.2012 09:56:20

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

48
20.09.2018 08:02:40

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

Больше информации здесь

3
17.09.2008 11:21:33
Используйте библиотеку Anti-XSS, чтобы предотвратить эту ошибку ... это неполно.
goodguys_activate 21.10.2011 22:51:08
Дать немного больше объяснений о том, как это сделать, может быть полезно.
Joren Vandamme 6.03.2019 08:38:08

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

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

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

13
23.06.2017 22:42:21

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

4
17.09.2008 11:28:22

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

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

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

9
16.10.2018 18:53:56
Ссылка не работает.
Peter Mortensen 23.06.2017 22:46:27

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

4
17.09.2008 11:41:07
пост сказал "валидатор" пожалуйста
mxmissile 6.02.2018 14:54:26

Помните, что некоторые элементы управления .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>вывод на свою страницу и последующее выполнение.

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

34
23.06.2017 22:49:35

Если вы не хотите отключать 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);")
23
23.06.2017 22:53:54
Это по-прежнему оставляет приложение уязвимым от готовых запросов POST. У обычного пользователя будут проблемы с вводом символов, таких как, или: кавычки, но у обычного хакера не возникнет проблем с отправкой искаженных данных на сервер. Я бы заговорил об этом.
Radu094 26.10.2009 22:21:06
@ Radu094: это решение позволяет вам сохранить ValidateRequest = true, что означает, что хакеры все еще будут поражать эту стену. Голосуйте ВВЕРХ, так как это делает вас менее уязвимым, чем отключение ValidateRequest.
jbehren 17.08.2011 19:10:28

Существует другое решение этой ошибки, если вы используете 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
502
19.02.2018 13:18:45
проблема может возникнуть, когда это необходимо на одной странице всего приложения
Steven Spielberg 18.12.2010 06:03:19
Вы также можете добавить атрибут [ValidateInput (false)] на уровне класса. Если вы добавите его в базовый класс контроллера, он будет применяться ко всем действиям метода контроллера.
Shan Plourde 29.05.2011 13:12:36
@ Zack Спасибо за решение. С другой стороны, мне интересно, если [AllowHtml]это лучше, чем ValidateInput(false), потому что [AllowHtml]определяется сразу для свойства, то есть поля редактора, и всякий раз, когда оно используется, нет необходимости использовать его для нескольких действий. Что ты предлагаешь?
Jack 21.07.2015 23:44:38
@ Зак Петерсон Безопасно ли использовать? Нет проблем с безопасностью?
shrey Pav 30.10.2017 07:21:19

Вы можете поймать эту ошибку в 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

42
13.10.2009 22:37:18

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

<httpRuntime requestValidationMode="2.0" />

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

requestValidationMode="2.0"

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

validateRequest="false"
211
23.06.2017 22:56:08
Внутри <system.web>тегов.
Hosam Aly 4.11.2010 11:26:28
Я поместил это в файл web.config, но все еще с ошибкой «Потенциально опасное значение Request.Form»
Filip 12.12.2010 15:40:35
Похоже, <httpRuntime requestValidationMode = "2.0" /> работает только тогда, когда на машине установлена ​​платформа 2.0. Что если 2.0 framework вообще не установлен, а установлен только 4.0?
Samuel 20.07.2011 18:18:22
Это полностью сработало для меня. Ни один из шагов в других ответах не был необходим (включая validateRequest = "false")!
tom redfern 2.10.2012 10:53:17

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

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

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

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

71
23.06.2017 22:58:39
К сожалению, похоже, что функция исключения была удалена из MVC 3 RTW :(
Matt Greer 23.03.2011 16:18:10
Также он не был включен в MVC 4
wilsjd 27.06.2013 19:41:19
Используйте [AllowHtml]свойства модели вместо [ValidateInput]действия для достижения того же конечного результата.
Mrchief 25.03.2014 17:07:25
@Christof Обратите внимание, что мой ответ 5 лет. Я давно не сталкивался с этой проблемой, так что, возможно, есть гораздо лучшие способы борьбы с ней. Что касается этих двух вариантов, я думаю, что это зависит от вашей ситуации. Может быть, вы выставляете эту модель более чем одним действием, а в некоторых местах HTML разрешен или нет. В таком случае [AllowHtml]не вариант. Я рекомендую проверить эту статью: weblogs.asp.net/imranbaloch/… , но она тоже несколько устарела и может устареть.
gligoran 22.07.2015 16:13:34
Есть еще способ исключить определенные параметры метода из проверки, посмотрите мой ответ здесь: stackoverflow.com/a/50796666/56621
Alex 14.11.2018 22:07:03

В 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) {
    ...
}
51
23.06.2017 22:59:32
Для меня validateRequest="false"не было необходимости, толькоrequestValidationMode="2.0"
tom redfern 2.10.2012 10:54:05
requestValidationMode = "2.0" по-прежнему генерирует ошибку с HTML-кодированными данными. Никакого решения, кроме как все кодировать с помощью base64, а затем отправить его вместе.
MC9000 13.06.2015 07:35:49

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

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

[AllowHtml]
public string Description { get; set; }
415
17.04.2018 08:17:49
Гораздо лучше сделать это декларативно, чем в контроллере!
Andiih 9.03.2012 09:03:35
Единственно правильный ответ! Отключение проверки действия контроллера является хакерским. И для отключения проверки на уровне приложения, разработчики должны быть повешены!
trailmax 30.01.2014 14:08:47
Это исчезло в MVC 4?
granadaCoder 24.07.2015 15:08:36
В чем разница между ValidateInput(false)и AllowHtml? В чем преимущество одного над другим? Когда бы я хотел использовать AllowHtmlвместо ValidateInput(false)? Когда бы я хотел использовать ValidateInput(false)более AllowHtml? Когда бы я хотел использовать оба? Имеет ли смысл использовать оба?
Ian Boyd 29.07.2016 13:55:31
ValidateInput используется для метода, AllowHtml - для свойства модели, поэтому вы разрешаете использовать только тот, который, как вы ожидаете, html - не все
Anthony Johnston 10.08.2016 15:07:53

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

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

Я не знаю, есть ли минусы, но для меня это сработало потрясающе.

21
23.06.2017 23:00:50
Работает для веб-форм c # или VB
TheAlbear 22.10.2014 13:34:27

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

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

7
1.09.2012 01:24:02

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

Пример:

<configuration>
  <system.web>
   <httpRuntime requestValidationMode="2.0" />
  </system.web>
  <pages validateRequest="false">
  </pages>
</configuration>
29
14.03.2012 22:20:43
Для меня validateRequest = "false" не был необходим, только requestValidationMode = "2.0"
tom redfern 2.10.2012 10:54:25
Раздел "pages" должен находиться в разделе "system.web".
Carter Medlin 27.11.2012 17:13:46
Опасный ответ, еще раз.
MC9000 13.06.2015 07:36:31
Мне нужны были оба. Спасибо
Jack 23.02.2016 02:52:18

Другие решения здесь хороши, однако, задним ходом немного неудобно применять [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 (), вы не должен требовать эту функцию.

10
23.06.2017 23:03:56

В 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();
    }
}
13
25.02.2016 20:05:52

Я заканчивал тем, что использовал 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;
}

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

7
30.01.2016 08:40:19
Там должны быть большие скобки вместо маленьких скобок. Как `if (tbs [i] .type == 'text') {` вместо `if (tbs (i) .type == 'text') {`
Shilpa Soni 12.09.2014 05:18:54

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

В моем случае пользователь ввел акцентированный символ áв имени роли (в отношении поставщика членства 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 больше не будет блокировать запрос.

9
14.08.2012 15:27:07

В 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, потому что на уровне сайта вы можете видеть, какие страницы допускают разметку в качестве входных данных.

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

111
30.01.2016 08:41:30
Более подробная информация о requestValidationMode = 2 | 4 здесь: msdn.microsoft.com/en-us/library/…
GlennG 13.02.2015 08:30:58
К сожалению, это не будет работать с ASP.net 2.0 как есть. Удалите строку httpRuntime, и она будет работать.
Fandango68 11.03.2015 05:48:44
Я добавил предупреждение, напоминающее людям, что нужно вручную проверять ввод, когда проверка отключена.
Carter Medlin 17.06.2015 00:35:01

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

4
17.02.2013 19:40:01

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

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

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

39
25.04.2013 21:13:24
Применимо только для ASP.NET 4.5 (и, по-видимому, что будет после него). Pre 4.5 не поддерживает это.
Beska 4.11.2014 20:00:46
Я хотел бы столкнуться с этим. Я использую .NET 4.5, и это именно то, что мне нужно, так как я не использую MVC и не могу изменить web.config.
Chris Gillum 18.11.2014 19:26:59
Да, но что, если вы используете .Net 2? У некоторых из нас нет выбора
Fandango68 18.03.2015 04:12:15
это получает параметры POST или GET?
max4ever 15.04.2015 09:58:01
Вы говорите, что это предотвращает исключение, которое уже было выброшено? Или .net 4.5 задерживает исключение и проверку до тех пор, пока данные фактически не будут считаны из Request?
ebyrob 8.03.2017 14:49:52

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

var nvc = Request.Unvalidated().Form;

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

4
30.01.2016 08:42:47

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

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;
    }
}
19
30.01.2016 08:43:45
Ницца! Не было известно о возможности заменить запросчик проверки. Вместо того, чтобы просто сказать «хорошо», как вы, я расширил эту идею, чтобы не проверять поля, заканчивающиеся на «_NoValidation» в качестве их имени. Код ниже.
Walden Leverich 1.05.2014 20:01:38
Уолден Леверих, для этого смотрите атрибуцию [AllowHtml]
Sel 28.01.2015 09:10:16
Сел, да в среде MVC, которая будет работать. Но в приложении webforms у меня нет модели, чтобы сделать это. :-)
Walden Leverich 29.01.2015 23:24:13

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

[ValidateInput (ложь)]

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

43
25.04.2016 06:52:19
Похоже, это не работает в случае, если он попадает в метод контроллера через настроенный маршрут.
PandaWood 24.03.2016 00:39:11
На самом деле, техническое объяснение состоит в том, что это работает только тогда, когда оскорбительный символ находится в «строке запроса» ... если он находится в пути запроса, атрибут проверки не работает
PandaWood 24.03.2016 02:08:03

Как указано в моем комментарии к ответу Сел , это наше расширение для валидатора пользовательских запросов.

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);
    }
}
2
23.05.2017 12:18:27

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

  • Сделайте текстовое поле HTML-элементом (например, textarea) вместо ASP-элемента.
  • Добавьте скрытое поле.
  • Добавьте следующую функцию JavaScript в свой заголовок.

    function boo () {targetText = document.getElementById ("HiddenField1"); sourceText = document.getElementById ("userbox"); 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, он просто увидит ошибку. Вы также можете сохранить все эти данные, закодированные в базе данных, затем удалить их (на стороне сервера), проанализировать и проверить на наличие атак, прежде чем отображать их в другом месте.

10
30.01.2016 08:50:49
Это хорошее решение. Это правильный ручной способ управлять им самостоятельно, а не аннулировать весь сайт или страницу
Fandango68 18.03.2015 04:16:32
Убедитесь, что для текстовой области используется разметка HTML, а не элемент управления ASP.Net (т.е. нет runat = "server"), а затем используйте скрытый элемент управления ASP.Net для скрытого. Это лучшее решение, которое я видел без компромиссов. Естественно, вы хотите проанализировать свои данные для XSS, SQL-инъекции на стороне сервера, но по крайней мере вы можете опубликовать HTML
MC9000 13.06.2015 07:50:43
escape(...)может занять много времени. В моем случае разметка представляла собой целый (2 МБ) XML-файл. Вы можете спросить: «Почему бы тебе просто не использовать <input type="file"...и ... я согласен с тобой :)
The Red Pea 12.09.2016 18:18:24