2013-12-03 2 views
1

Прежде всего, я знаю, что есть множество вопросов, подобных моим, но я не нашел решение, которое удовлетворило бы меня ...Как избежать потенциально опасного значения Request.Form?

Таким образом, я получаю вышеуказанное исключение в этом коде:

var returnUrl = Request.Params["returnUrl"] ?? Request.RawUrl; 

После того, как я отправил сообщение на свой веб-сайт, mvc начал готовить страницу ответа, и он вылетает по вышеуказанному коду. Теперь обе эти переменные не содержат кода, вызывающего это исключение. Как-то MVC обнаруживает, что я использую объекты Request и выдает ошибку, не глядя, что я делаю. Я не хочу отключать эти проверки безопасности, но я не знаю, что еще я могу сделать?

+0

Итак, вы ожидаете, что конкретный запрос не приведет к проверке? Или вы ожидаете, что валидация произойдет намного раньше при обработке запросов? –

+0

Можете ли вы привести пример того, что находится в returnUrl? –

+0

@AlexeiLevenkov: Я бы хотел, чтобы проверка выполнялась как обычно, но ничего не выбрасывала ** в этой конкретной строке кода **. Зачем? Потому что 'Request.Params [" returnUrl "]' равно null, а 'Request.RawUrl' -'/Forums/AddPost/12311', поэтому для ошибки нечего делать. Конечно, у Request.Form есть опасный код, но он не используется в строке кода, которая вызывает эту ошибку. Я думаю, что это какая-то ошибка или что-то здесь ... – ojek

ответ

1

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

4

Имеет ту же проблему и только что нашел решение. Когда вы получаете доступ к опубликованным значениям от Request, значения повторно проверяются и по какой-то причине [AllowHtml] игнорируется при данной проверке (возможно, ошибка, протестированная в MVC 5). После небольшого поиска, я наткнулся на:

http://msdn.microsoft.com/en-us/library/hh882339(v=vs.110).aspx

Вниз страницы немного, в разделе «Отключение запроса Validation в ASP.NET MVC», он упоминает Request.Unvalidated. Это свойство возвращает объект запроса, минуя проверку, так что вы можете получить конкретный параметр без активации проверки.

Таким образом, вместо использования Request.Params["returnUrl"], используйте Request.Unvalidated["returnUrl"].

+0

Я поддерживаю вас, хотя Request.Unvalidated.Params ["returnUrl"] не компилируется для меня. Альтернативный синтаксис работал Request.Unvalidated ["returnUrl"], хотя звучит так, будто он будет проходить через различные источники для параметра. –

+0

Похоже, я забыл добавить скобки после 'Unvalidated'. См. Обновленный код. –

+0

Обратите внимание, что если у вас есть несколько параметров, вы должны вызвать Request.Unvalidated для каждого параметра (даже если есть только один небезопасный параметр). Проверка безопасности выполняется по всем значениям коллекции, как только вы вызываете getter Request.Params. –

Смежные вопросы