Некоторые из моих свойств модели отмечены атрибутом AllowHtml. Есть ли способ автоматически применить к этим полям защиту AntiXss (например, только разрешенные теги)?
Свойства свойств Html 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; }
}
Ответ 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();