Разрешить HTML и пользовательские IValueProviders в MVC3 - PullRequest
1 голос
/ 04 августа 2011

У меня есть пользовательский IValueProvider, который я написал для обработки значений json.Он зарегистрирован в globa.asax через

ValueProviderFactories.Factories.Insert(0, new JsonValueProviderFactory());

Он работает нормально, но мне только недавно потребовалось опубликовать модель обратно, содержащую HTML.По умолчанию это порождает старое

A potentially dangerous Request.Form value was detected from the client

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

Вот соответствующий код:

public class JsonValueProvider : IValueProvider, IValueDeserializer
{
    private ControllerContext context;

    public JsonValueProvider(ControllerContext controllerContext)
    {
        this.context = controllerContext;
    }

    public bool ContainsPrefix(string prefix)
    {
        return context.HttpContext.Request.Form.AllKeys.FirstOrDefault(i => i.StartsWith(prefix)) != null; //<!------- The error is thrown here
    }
    .....

Ответы [ 2 ]

1 голос
/ 27 октября 2012

Вы не можете использовать проверенные данные запроса (например, Request.Form, Request.QueryString) внутри своего провайдера пользовательских значений, если вам нужно обрабатывать «потенциально опасные» данные.

Вместо этого вы должны использовать методы или свойства, такие как Request.Unvalidated, HttpContext.Request.Unvalidated() или HttpContext.Request.InputStream.

Если вы внедрите IUnvalidatedValueProvider в свой пользовательский ValueProvider, то он также может прекрасно работать с DefaultModelBinder / AllowHtml.

IUnvalidatedValueProvider имеет перегруженный метод GetValue, чтобы сообщить провайдеру, следует ли пропустить проверку (что в конечном итоге устанавливается AllowHtml).

    public interface IUnvalidatedValueProvider : IValueProvider
    {
        ValueProviderResult GetValue(string key, bool skipValidation);
    }

В вашей реализации, если skipValidation истинно, вы должны получить данные неподтвержденного запроса. Очевидно, что в пределах вашего ContainsPrefix вы не можете получить доступ к проверенным данным (например, Request.Form).

Сказав, что, возможно, проще всего унаследовать от NameValueCollectionValueProvider, который уже "не подтвержден". Большинство встроенных поставщиков значений наследуются от него. Я связался с исходным кодом MVC ... посмотрите, как реализованы подтипы.

0 голосов
/ 04 августа 2011

Разрешить HTML работает только для модели связующего IIRC.Вы можете получить неподтвержденные формы и строки запроса, используя ValidationUtility из Microsoft.Web.Infrastructure.DynamicValidationHelper, но имейте в виду, что не будут проверены все значения, не только значения с AllowHtml!

Func<NameValueCollection> formGetter;
Func<NameValueCollection> queryStringGetter;

ValidationUtility.GetUnvalidatedCollections(HttpContext.Current, out formGetter, out queryStringGetter);

var form = formGetter();
var queryString = queryStringGetter();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...