ValidateRequest = «false» не работает в Asp.Net 4

156

У меня есть форма, в которой я использую ckeditor. Эта форма отлично работала в Asp.Net 2.0 и 3.5, но теперь она не работает в Asp.Net 4+. У меня есть ValidateRequest = "ложная" директива. Какие-либо предложения?

HasanG
источник
Есть небольшая статья о том, как правильно отображать элементы управления проверкой, если кому-то это интересно: Проверка ошибок в .NET 4
Ян
Может кто-нибудь, пожалуйста, дайте мне знать, каковы недостатки использования ValidationRequest = false?
fc123

Ответы:

194

Нашел решение на странице ошибок. Просто нужно добавить requestValidationMode = "2.0"

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

Информация MSDN: свойство HttpRuntimeSection.RequestValidationMode

HasanG
источник
1
это круто, но кто-нибудь знает способ установить это на страницу? Также, как мне поместить это в web.config, чтобы он все еще работал с .NET 2?
МК.
1
@MK: Я не думаю, что для этой настройки есть директива страницы. Вы не можете заставить его работать на .net 2. Я не думаю, что это будет необходимо. Потому что вы можете просто создать веб-приложение, ориентированное только на одну версию фреймворка. Просто скопируйте эту строку в .net 4 web.config, которая в этом нуждается ...
HasanG
2
Но что изменилось в валидации для .net 4? Есть ли способ сделать это без изменения режима проверки?
Хитрый
4
@Sly: Вы можете найти ответ здесь: asp.net/learn/whitepapers/aspnet4/…
HasanG
Может кто-нибудь, пожалуйста, дайте мне знать, почему в asp.net 4.0 приложение с использованием requestValidationMode = "2.0" является хорошей идеей?
fc123
102

Есть способ повернуть проверку обратно на 2.0 для одной страницы. Просто добавьте следующий код в ваш web.config:

<configuration>
    <location path="XX/YY">
        <system.web>
            <httpRuntime requestValidationMode="2.0" />
        </system.web>
    </location>

    ...
    the rest of your configuration
    ...

</configuration>
Бен Хоффман
источник
Расположение - это любой путь, и оно основано на любом узле ниже папки, указанной в дереве.
DFTR
7
Это лучшее решение, чем принятый ответ, потому что оно не является широким для приложения, а достаточно узким для конкретной области, которую вы определяете в пути местоположения
Чарльз Уэсли,
5
Объявление <location ..>, указанное выше, должно быть помещено внутри объявления <configuration>, но больше не должно быть вложенным.
rbassett
1
Настройка для каждой страницы не работает для проектов, нацеленных на .NET 4.6.1.
Деннис Т - Восстановить Монику--
56

Я знаю, что это старый вопрос, но если вы столкнулись с этой проблемой в MVC 3, то вы можете украсить свой ActionMethodс [ValidateInput(false)]и просто отключить проверку запроса для одного ActionMethod, что удобно. И вам не нужно вносить какие-либо изменения в web.configфайл, так что вы все равно можете использовать проверку запросов .NET 4 везде.

например

[ValidateInput(false)]
public ActionMethod Edit(int id, string value)
{
    // Do your own checking of value since it could contain XSS stuff!
    return View();
}
Том Чантлер
источник
1
@RossCooper это только для asp.net MVC
mxmissile
28

Это работает без изменения режима проверки.

Вы должны использовать System.Web.Helpers.Validation.Unvalidatedпомощника из System.Web.WebPages.dll. Он собирается вернуть UnvalidatedRequestValuesобъект, который позволяет получить доступ к форме и QueryString без проверки.

Например,

var queryValue = Server.UrlDecode(Request.Unvalidated("MyQueryKey"));

У меня работает для MVC3 и .NET 4.

убийца
источник
1
Можете ли вы привести пример того, как получить queryString с помощью этого метода? Я продолжаю получать сообщение «Непроверенный не является членом ...» всех объектов, к которым я пытаюсь его добавить. Я думаю, что я мог пропустить включение
CodedMonkey
3
var queryValue = Server.UrlDecode (Request.Unvalidated ("MyQueryKey"));
sfuqua
1
Это определенно должен быть принятый ответ. Поддерживает безопасность и чрезвычайно гибок, так как вы можете использовать его на выборочной основе.
cmartin
Для веб-форм вы должны заменить запись в коллекции QueryString, чтобы избежать ошибки проверки. См . Потенциально опасное значение Request.QueryString, которое было обнаружено клиентом при отправке разметки html из jquery post-вызова на страницу asp.net
Майкл
15

Обратите внимание, что другой подход - придерживаться поведения валидации 4.0, но определить свой собственный класс, который наследуется от RequestValidatorset:

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

(где YourNamespace.YourValidatorхорошо, вы должны быть в состоянии угадать ...)

Таким образом вы сохраняете преимущества поведения 4.0s (в частности, то, что проверка происходит раньше при обработке), и в то же время разрешаете запросы, которые необходимо пропустить.

Джон Ханна
источник
7
Это хорошо знать. Но я все еще думаю, что вся функция проверки запросов ASP.Net ошибочна. Сам вход не проблема, это то, что вы делаете с ним. Вполне допустимо принимать код SQL, HTML или JavaScript в качестве входных данных для вашего приложения, если вы правильно его кодируете / экранируете, прежде чем выводить или сохранять в своей базе данных.
Джордан Ригер
2
@JordanRieger Я частично согласен. OOTB, по крайней мере, у него есть преимущество по умолчанию для обеспечения безопасности (не продумывайте вещи, и вы получаете ошибки, а не 0wned), но это немного неприятно, и поведение до версии 4.0 очень "все или ничего". Что-то в способности иметь слой проверки, который используется перед любой другой обработкой, как с пользовательским requestValidationType, но большая часть проверки должна быть более тесно связана с другой обработкой. В целом, я думаю, что это больше защищает людей с вредными привычками от некоторых (но не всех) распадов, чем поощряет хорошие привычки.
Джон Ханна