1

Мне нужно отфильтровать все строки в моем проекте, чтобы предотвратить атаки 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, поэтому любая помощь будет оценена по достоинству.

+0

Я чувствую, что вы делаете это назад. Общей передовой практикой является кодирование в точке вывода, будь то просмотр, сериализатор XML, сериализатор JSON или что-то еще. Вместо этого вы блокируете свои данные в HTML, ваш фильтр неэффективен в зависимости от того, где заканчиваются ваши данные, и что еще хуже, когда вы используете бритву, вы рискуете двойным кодированием, если вы решили кодировать объекты, а не заменять пространство. – blowdart

ответ

0
public class AntiXSSModelBinder : IModelBinder 
{ 
    public Task<ModelBindingResult> BindModelAsync(ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelMetadata.IsComplexType) 
     { 
      // this type cannot be converted 
      return ModelBindingResult.NoResultAsync; 
     } 

     var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     if (valueProviderResult == ValueProviderResult.None) 
     { 
      // no entry 
      return ModelBindingResult.NoResultAsync; 
     } 

     var model = valueProviderResult.ConvertTo(bindingContext.ModelType); 

     if (bindingContext.ModelType == typeof(string)) 
     { 
      var modelAsString = model as string; 

      if (model != null) 
      { 
       return ModelBindingResult.SuccessAsync(bindingContext.ModelName, FilterPotentiallyXSSEntries(modelAsString)); 
      } 
     } 

     return ModelBindingResult.NoResultAsync; 
    } 

    private static string FilterPotentiallyXSSEntries(string value) 
    { 
     return value.Replace("<", "").Replace(">", "").Replace("script", ""); 
    } 
} 

Работы для всех уровней гнездования.

 Смежные вопросы

  • Нет связанных вопросов^_^