Напишем привязчик к модели для удаления пробельных символов слева и справа и защиты от xss атак (asp.net mvc)

В asp.net mvc привязчик к модели сразу ругается и бросает исключение, если встречает html теги и html атрибуты в переданных строках. Но если указать атрибут AllowHtml, то привязчик по умолчанию, разрешает все html теги и html атрибуты. А это не безопасно, и злоумышленник может внедрить опасный код на сайт.

Так же если передать строки с пробелами слева и справа, то эти пробелы могут записаться в бд, чего не всегда хочется.

Исправим эти недочеты, используя класс, написанный в заметке Защищаемся от xss :

public class AntyXssAndRemoveSpacesModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var holderType = bindingContext.ModelMetadata.ContainerType;
        if (holderType == null)
            return base.BindModel(controllerContext, bindingContext);

        var propertyType = holderType.GetProperty(bindingContext.ModelMetadata.PropertyName);
        var attributes = propertyType.GetCustomAttributes(true);
        bool hasAttribute = attributes
            .OfType<AllowHtmlAttribute>()
            .Any();

        var provider = bindingContext.ValueProvider;
        ValueProviderResult result;

        if (!hasAttribute)
        {
            result = provider.GetValue(bindingContext.ModelName);
        }
        else
        {
            try
            {
                result = provider.GetValue(bindingContext.ModelName);
            }
            catch (HttpRequestValidationException)
            {
                result = ((IUnvalidatedValueProvider)provider).GetValue(bindingContext.ModelName, skipValidation: true);
            }
        }

        string value = result.AttemptedValue.Trim();
        if (string.IsNullOrEmpty(value))
            return null;
        value = HtmlSanitizer.RemoveInvalidHtmlTags(value).Trim();
        if (string.IsNullOrEmpty(value))
            return null;
        return value;
    }
}

Затем пропишем в Global.cs

ModelBinders.Binders.Add(typeof(string), new AntyXssAndRemoveSpacesModelBinder());

Ссылки:

По теме:
Выполняем get запрос по расписанию c#

Напишем простенькую программу, которая будет выполнять get запрос по истечению определенного интервала времени. class Program { private static Timer _timer; Read more

Выполняем действие по расписанию (asp.net, c#)

Раньше я писал программку, которая выполняла get запрос по расписанию, но так же можно написать обычный HttpModule, который будет делать Read more

Выбираем технологии и инструменты для разработки веб приложений

1 Выбор и настройка инструментов для разработки фронтенда (только самые важные): 1.1 Twitter bootstrap — фреймворк позволяет писать качественную верстку Read more

Делаем водяной знак на картинке (c#, .net)

Нанесем несколько раз картинку watermark на другую картинку. public void DrawWatermark(string watermarkImagePath, System.Drawing.Image image) { using (System.Drawing.Image watermarkImage = System.Drawing.Image.FromFile(watermarkImagePath)) Read more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *