ASP.NET MVC: проверка аннотирования данных достаточно?

Рапа @Brad

я обычно не переключался бы между ними, если не была востребованная функция, которая пропускала

, что неопровержимые доводы должны использовать msbuild? есть ли недостатки?

До сих пор я получаю довольно хорошее, "не не беспокойтесь" из Вашего ответа.

27
задан Johnny Oshika 13 October 2009 в 20:18
поделиться

4 ответа

Я думаю, чтобы быть бдительными в отношении безопасности, вы должны сделать проверку сервера приоритетом и убедиться, что это всегда ваш запасной вариант. Проверка вашего сервера должна работать без проверки клиента. Проверка клиента больше для UX, и хотя это имеет первостепенное значение для вашего дизайна, она вторична по отношению к безопасности. Имея это в виду, вы обнаружите, что повторяете свою проверку. Часто цель состоит в том, чтобы спроектировать ваше приложение так, чтобы проверка сервера и клиента могла быть интегрирована в максимально возможной степени, чтобы сократить объем работы, необходимой для проверки на сервере и клиенте. Но будьте уверены, вы должны сделать и то, и другое.

Если обход проверки клиента (посредством манипуляции с DOM) позволяет избежать проверки сервера (на что, похоже, вы указываете), то проверка вашего сервера для этого экземпляра может не использоваться надлежащим образом. Вы должны снова вызвать проверку своего сервера в действии контроллера или на уровне службы. Сценарий, который вы описываете, не должен мешать проверке вашего сервера.

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

18
ответ дан 28 November 2019 в 05:42
поделиться

Я соединил xVal с DataAnnotations и написал свой собственный фильтр действий, который проверяет любые параметры типа Entity для целей проверки. Поэтому, если какое-то поле отсутствует в обратной передаче, этот валидатор заполнит словарь ModelState, следовательно, модель будет недействительной.

Предварительные требования:

  • Все мои объекты сущности / модели реализуют интерфейс IObjectValidator , который объявляет Validate () метод.
  • мой класс атрибутов называется ValidateBusinessObjectAttribute
  • xVal validation library

Код фильтра действий:

public void OnActionExecuting(ActionExecutingContext filterContext)
{
    IEnumerable<KeyValuePair<string, object>> parameters = filterContext.ActionParameters.Where<KeyValuePair<string, object>>(p => p.Value.GetType().Equals(this.ObjectType ?? p.Value.GetType()) && p.Value is IObjectValidator);
    foreach (KeyValuePair<string, object> param in parameters)
    {
        object value;
        if ((value = param.Value) != null)
        {
            IEnumerable<ErrorInfo> errors = ((IObjectValidator)value).Validate();
            if (errors.Any())
            {
                new RulesException(errors).AddModelStateErrors(filterContext.Controller.ViewData.ModelState, param.Key);
            }
        }
    }
}

Действие моего контроллера определяется следующим образом:

[ValidateBusinessObject]
public ActionResult Register(User user, Company company, RegistrationData registrationData)
{
    if (!this.ModelState.IsValid)
    {
        return View();
    }
    ...
}
7
ответ дан 28 November 2019 в 05:42
поделиться

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

Однако вы можете настроить модель DataAnnotation самостоятельно, чтобы гарантировать, что свойства с [Required] ДОЛЖНЫ быть опубликованы. (код будет позже сегодня).

ОБНОВЛЕНИЕ Получите источник для DataAnnotations Model Binder и найдите эту строку в DataAnnotationsModelBinder.cs

// Only bind properties that are part of the request
if (bindingContext.ValueProvider.DoesAnyKeyHavePrefix(fullPropertyKey)) {

Измените ее на

// Only bind properties that are part of the request
bool contextHasKey = bindingContext.ValueProvider.DoesAnyKeyHavePrefix(fullPropertyKey);
bool isRequired = GetValidationAttributes(propertyDescriptor).OfType<RequiredAttribute>().Count() > 0;
if (contextHasKey || (!contextHasKey && isRequired)) {
2
ответ дан 28 November 2019 в 05:42
поделиться

Я написал свой собственный ValidationService для MVC 1.0, скопировав шаблоны из DataAnnotationsRuleProvider от xVal и DataAnnotationsModelBinder от Microsoft (и из комментариев Martijn). Интерфейс службы приведен ниже:

public interface IValidationService
{
    void Validate(object instance);

    IEnumerable<ErrorInfo> GetErrors(object instance);
}

public abstract class BaseValidationService : IValidationService
{
    public void Validate(object instance)
    {
        var errors = GetErrors(instance);

        if (errors.Any())
            throw new RulesException(errors);
    }

    public abstract IEnumerable<ErrorInfo> GetErrors(object instance);
}

Служба представляет собой средство выполнения проверки, которое просматривает дерево свойств экземпляра объекта, которое он получает, и фактически выполняет атрибуты проверки, которые он находит для каждого свойства, создавая список объектов ErrorInfo, когда атрибуты недопустимы. . (Я бы опубликовал весь исходный код, но он был написан для клиента, и я еще не знаю, уполномочен ли я это делать.)

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

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

    2
    ответ дан 28 November 2019 в 05:42
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: