2013-11-25 3 views
1

Мы ServiceStack запрос:ServiceStack - как написать атрибут AllowHtml?

MyRequest{ 
    public string Name {get;set;} 
} 

Мне нужно запретить все HTML во всех запросах по умолчанию, и разрешить только HTML, если у меня есть [AllowHtml] атрибут. Как в MVC.

MyRequest{ 
    [AllowHtml] 
    public string Name {get;set;} 
} 

Возможно ли это в ServiceStack?

ответ

1

Как мы сделали, что: 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, "<.*?>"); //проверяем любые закрытые теги 
    } 
Смежные вопросы