Мне нужно отфильтровать все строки в моем проекте, чтобы предотвратить атаки XSS. Я решил сделать это, используя глобальное связующее. Ниже приводится модель регистрации связующий код:vNext Model Binder, который фильтрует строки
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddMvcOptions(options =>
{
options.ModelBinders.Add(new AntiXSSModelBinder());
});
}
Требование состоит в фильтрации как простые строки параметров и строк, что внутри сложного типа (любой уровень вложенности):
public async Task<IActionResult> GetShippingAddress(string id)
public async Task<IActionResult> AddUpdateShippingMethod(AddUpdateShippingMethodModel model)
// AddUpdateShippingMethodModel has Text property of string type
Пример метода фильтрации :
public class AntiXSSModelBinder : IModelBinder
{
public Task<ModelBindingResult> BindModelAsync(ModelBindingContext bindingContext)
{
// ...
}
private string FilterPotentiallyXSSEntries(string value)
{
return value.Replace("<", "").Replace(">", "").Replace("script", "");
}
}
Нет хорошей документации по теме ModelBinder, поэтому любая помощь будет оценена по достоинству.
Я чувствую, что вы делаете это назад. Общей передовой практикой является кодирование в точке вывода, будь то просмотр, сериализатор XML, сериализатор JSON или что-то еще. Вместо этого вы блокируете свои данные в HTML, ваш фильтр неэффективен в зависимости от того, где заканчиваются ваши данные, и что еще хуже, когда вы используете бритву, вы рискуете двойным кодированием, если вы решили кодировать объекты, а не заменять пространство. – blowdart