Как мы сделали, что: 1. Добавить плагин для проверки HTML
public class SecurityValidationFeature : IPlugin
{
private readonly ISecurityValidator[] _validators;
public SecurityValidationFeature(ISecurityValidator[] validators)
{
_validators = validators;
}
2. Интерфейс для DTO с помощью метода:
public virtual Dictionary<string, string> StringFieldsAsEnum
{
get
{
return new Dictionary<string, FieldValue>()
{
{"Name", new FieldValue(this.Name, AllowHtml)},
{"Fio", new FieldValue(this.Fio, AllowHtml)},
{"Email", new FieldValue(this.Email, AllowHtml)},
{"Post", new FieldValue(this.Post, AllowHtml)}
};
}
}
3. И, наконец, проверить в валидатор:
public void Validate(Dictionary<string, FieldValue> fields)
{
if (fields == null || fields.Count == 0)
return;
Dictionary<string, string> failed = new Dictionary<string, string>();
foreach (var field in fields)
{
if (string.IsNullOrEmpty(field.Value.Value))
continue;
if (IsXssInjectible(field.Value))
{
failed.Add(field.Key, field.Value.Value);
}
}
if (failed.Count > 0)
throw new XssException(failed);
}
private bool IsXssInjectible(Field field)
{
return !field.AllowHtml && HasHtmlTags(field.Value);
}
private bool HasHtmlTags(string input)
{
return Regex.IsMatch(input, "<.*?>"); //проверяем любые закрытые теги
}