Пролог. Я прочитал много вопросов об исправлении ошибок «потенциально опасный запрос»:
Среди многих других.Я знаю, как исправить это несколькими различными способами, однако я не хочу отключать проверку запросов.
Я хотел бы добавить проверки формы во все свойства модели представления строки для всего сайта для защиты от исключения «потенциально опасный запрос», поскольку создание исключения не является идеальным, если пользователь может исправить свой ввод.Я только мог придумать два разных решения:
Добавить валидатор регулярных выражений для каждого свойства модели представления, которое принимает тип данных string
, который выполняется в браузере.Это предотвратит отправку форм, но для нашего приложения много трудного кодирования
Каким-то волшебным образом добавьте валидатор, который выполняется при каждом запросе, который запускается во всех свойствах модели представления строки, которыевыполняет эту проверку и дает пользователю более дружелюбное сообщение, чем Желтый Экран Рока (tm).
Сообщение проверки, которое должно отображаться в поле формы, независимо от решения, должно бытьчто-то вроде:
Поле X содержит потенциально опасные символы.Либо удалите все символы «<», либо убедитесь, что перед ними стоит пробел или знак пунктуации. </p>
Или что-то на это повлияет.По сути, я хочу получить сообщение о проверке, которое поможет пользователю разрешить ситуацию, а не взорвать все приложение до небес, что приведет к потере всей его работы при вводе данных в форму.
Я придумалрешение, которое включает добавление пользовательского связывателя модели для строковых свойств, которое получает значение свойства без запуска проверок, а затем проверяет его с помощью регулярного выражения.Совпадение с регулярным выражением приводит к тому, что к этому свойству добавляется новая ошибка состояния модели.
public class MaliciousStringInputModelBinder : IModelBinder
{
private static readonly Regex maliciousStringPattern = new Regex(@"<[a-zA-Z0-9]");
private const string validationMessageFormat = "The {0} field contains potentially dangerous characters. Either remove the '<' characters, or ensure a space or puncuation character immediately follows them.";
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
// Call extension method to safely get model value without
// triggering any validations
var valueResult = controllerContext.GetValueFromProvider(bindingContext);
if (valueResult == null || valueResult.AttemptedValue == null)
{
return null;
}
else if (valueResult.AttemptedValue == string.Empty)
{
return string.Empty;
}
else if (maliciousStringPattern.IsMatch(valueResult.AttemptedValue))
{
bindingContext.ModelState.AddModelError(bindingContext.ModelName, string.Format(validationMessageFormat, bindingContext.ModelMetadata.DisplayName));
}
bindingContext.ModelState.SetModelValue(bindingContext.ModelName, valueResult);
return valueResult.AttemptedValue;
}
}
Это работает, но похоже на взлом.Я не связываю свойство модели, я проверяю его.
Я искал фильтры действий ASP.NET MVC, но снова я прыгаю через лотов обручейбез четкого решения.
Как добавить универсальную проверку формы ко всем свойствам модели строкового представления в масштабе всего сайта в ASP.NET MVC, чтобы показывать пользователям сообщение проверки вместо генерирования исключения?