2012-11-18 5 views

risposta

4

Non c'è modo automatico. Il più vicino che puoi fare è ottenere il pacchetto AntiXss Nuget. Quindi è possibile utilizzarlo come di seguito nel controller:

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

O

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

Se si utilizza è possibile decodificare usando

Server.HtmlDecode("HtmlEncodedString"); 

Spero che questo aiuti.

10

In primo luogo, afaik, niente è incorporato per questo. Ma MVC permette di fare queste cose in modo semplice via ModelBinders personalizzati, è possibile definire il vostro

public class CustomAntiXssAttribute : Attribute { } 

e decorare le vostre proprietà con esso (e anche ereditare da AllowHtmlAttribute se lo si desidera). Poi, con un modello di legante si potrebbe aggiungere la tua protezione specifica 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); 
      } 
     } 
    } 

Poi dentro che SOME_CUSTOM_FILTER_FUNCTION_HERE si potrebbe usare quello @Yogiraj suggerito, o utilizzare un Regexp, o anche applicare il filtro basato-HtmlAgilityPack.

P.S. Non dimenticate di aggiungere ModelBinders.Binders.DefaultBinder = new CutstomModelBinder(); a Application_Start (ho dimenticato :))

+3

NON può ereditare da ALLOWHTMLATTRIBUTE "E 'una classe chiusa" – VJAI

0

codice non testato,

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(); 
1

vorrei andare per la sostituzione di quelli AllowHtml attributi con RegularExpression convalide dei dati di annotazione. Il vantaggio è che in questo modo è possibile intercettare l'errore e mostrare all'utente ciò che è andato storto mentre il precedente genera l'errore a livello globale.

Per es.

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

Rif: RegularExpression validator encoding regex < & > symbols as &lt; &gt;, causing jQuery validation to fail