Свойства свойств Html AntiXss

Некоторые из моих свойств модели отмечены атрибутом AllowHtml. Есть ли способ автоматически применить к этим полям защиту AntiXss (например, только разрешенные теги)?

Ответ 1

Нет автоматического пути. Самое близкое, что вы можете сделать, это получить пакет AntiXss Nuget. Затем вы можете использовать его, как показано ниже в вашем контроллере:

  Microsoft.Security.Application.Sanitizer.GetSafeHtml("YourHtml");

ИЛИ

  Microsoft.Security.Application.Encoder.HtmlEncode("YourHtml");

Если вы используете, вы можете декодировать его с помощью

  Server.HtmlDecode("HtmlEncodedString");

Надеюсь, что это поможет.

Ответ 2

Во-первых, afaik, для этого нет ничего. Но MVC позволяет легко делать такие вещи с помощью пользовательских ModelBinders, вы можете определить свой

public class CustomAntiXssAttribute : Attribute { }

и украсьте свои свойства им (и даже наследуйте от AllowHtmlAttribute, если хотите). Затем с помощью модельного связующего вы можете добавить свою специальную защиту от anti-xss:

    public class CutstomModelBinder : DefaultModelBinder
    {
        protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor)
        {
            if (propertyDescriptor.Attributes.OfType<CustomAntiXssAttribute>().Any())
            {
                var valueResult = bindingContext.ValueProvider.GetValue(propertyDescriptor.Name);
                var filteredValue = SOME_CUSTOM_FILTER_FUNCTION_HERE(valueResult.AttemptedValue);
                propertyDescriptor.SetValue(bindingContext.Model, filteredValue);
            }
            else // revert to the default behavior.
            {
                base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
            }
        }
    }

Затем внутри этого SOME_CUSTOM_FILTER_FUNCTION_HERE вы можете использовать то, что предложил @Yogiraj, или использовать Regexp, или даже применять фильтрацию на основе HtmlAgilityPack.

P.S. Не забудьте добавить ModelBinders.Binders.DefaultBinder = new CutstomModelBinder(); в Application_Start (я забыл:))

Ответ 3

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

Например,

public class MyViewModel
{
    [DataType(DataType.MultilineText)]
    [RegularExpression(@"^[^\<\>]*$", ErrorMessage = "May not contain <,>")]
    public string Text { get; set; }
}

Ссылка: регулярное выражение регулярного выражения, и > символы как < > , что приводит к отказу проверки jQuery

Ответ 4

Неподтвержденный код,

public class ADefaultModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext.ModelMetadata.RequestValidationEnabled)
        {
            var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue;
            value = value.Replace("&", "");// replace existing & from the value
            var encodedValue = Microsoft.Security.Application.Encoder.HtmlEncode(value);
            bindingContext.ModelMetadata.RequestValidationEnabled = encodedValue.Contains("&"); // Whether AntiXss encoded a char to &..
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}
public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        ModelBinders.Binders.DefaultBinder = new ADefaultModelBinder();