Может ли параметр ValidateRequest страницы быть переопределен? - PullRequest
30 голосов
/ 28 января 2009

У меня есть форма ASP.NET MVC, которая может (обычно делает) отправить ответ, который вызвал бы ошибку «Обнаружено потенциально опасное значение Request.Form от клиента».

Чтобы попытаться обойти это, я поместил ValidateRequest = "false" в директиву страницы.

Единственная проблема: я все еще получаю ошибку!

Теперь все было хорошо, пока я не обновил этим утром ASP.NET MVC RC, и (согласно readme), поместил следующее в web.config Views:

<pages validateRequest="false" 
       pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
       pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
       userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
    <controls>
        <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
    </controls>
</pages>

Итак, validateRequest должен быть ложным для всех страниц, верно? Чего мне не хватает?

Ответы [ 4 ]

62 голосов
/ 28 января 2009

В MVC проверка выполняется на уровне контроллера, а не на уровне страницы. Чтобы понять, почему это так, представьте, что во время выполнения действия контроллера мы не знаем, какое представление будет выбрано для рендеринга. (На самом деле действие контроллера может вообще не отображать представление! Вместо этого оно может открыть запрос на загрузку файла на клиенте.) Кроме того, если пользователь отправляет вредоносные данные на сервер, к моменту отображения представления слишком поздно что-либо предпринимать по этому поводу. Контроллер уже совершил опасный ввод в базу данных.

Вместо этого, пожалуйста, украсьте контроллер или действие атрибутом [ValidateInput (false)]. Это заставит нас отменить проверку запроса для этого контроллера или действия.

17 голосов
/ 20 августа 2010

Необходимо украсить контроллер или действие атрибутом [ValidateInput (false)] и добавить requestValidationMode = "2.0" в файл web.config: Пример:

Контроллер:

    [ValidateInput(false)]
    public class MensajesController : Controller
    {
        //or in an action
        [ValidateInput(false)]
        [HttpPost]
        public ActionResult Create(FormCollection collection)
        {
        }
    }

Файл конфигурации:

    <configuration>
        <system.web>
           <httpRuntime requestValidationMode="2.0"/>
        </system.web>
    </configuration>
2 голосов
/ 12 февраля 2011

У меня была похожая проблема с использованием ASP.NET MVC 3 с .NET 4.0 и Windows Azure Access Control Service v2, где я мог получить ошибку:

System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (wresult="<t:RequestSecurityTo...").

и нашел лучшее решение, чем отключение проверки, - реализовать пользовательский RequestValidator, как описано в этой статье:

http://social.technet.microsoft.com/wiki/contents/articles/windows-identity-foundation-wif-a-potentially-dangerous-request-form-value-was-detected-from-the-client-wresult-quot-lt-t-requestsecurityto-quot.aspx

public class SampleRequestValidator : RequestValidator
{
    protected override bool IsValidRequestString( HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex )
    {
        validationFailureIndex = 0;
        if ( requestValidationSource == RequestValidationSource.Form && collectionKey.Equals( WSFederationConstants.Parameters.Result, StringComparison.Ordinal ) )
        {
            SignInResponseMessage message = WSFederationMessage.CreateFromFormPost( context.Request ) as SignInResponseMessage;
            if ( message != null )
            {
                return true;
            }
        }
        return base.IsValidRequestString( context, value, requestValidationSource, collectionKey, out validationFailureIndex );
    }
}

Единственная причина, по которой я смотрел дальше, чем отключение проверки, заключалась в том, что я видел, как это работало без отключения проверки, следуя этому руководству в учебном комплекте по платформе Windows Azure:

http://msdn.microsoft.com/en-us/WAZPlatformTrainingCourse_IntroToACSLabsV2

В любом случае, надеюсь, это кому-нибудь пригодится и может обеспечить более детальный подход к решению этой проблемы в будущем. Следует отметить, что requestValidationMode = "2.0" не требуется, если вы реализуете пользовательский RequestValidator.

2 голосов
/ 22 августа 2009

У нас есть базовый контроллер, от которого наследуются наши контроллеры, что позволяет нам глобально отключить внутреннюю проверку ASP.NET-запросов:

    protected override void Initialize(RequestContext requestContext)
    {
        // no client input will be checked on any controllers
        ValidateRequest = false;
        base.Initialize(requestContext);
    }

Просто убедитесь, что вы подтвердили все входные данные с клиента!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...