2012-06-04 15 views
6

He leído un montón de publicaciones en SO con respecto a XSS y cómo tratar. Generalmente, el consenso es una lista blanca sobre la lista negra y evita el uso de expresiones regulares (demasiadas variantes para tratar).TinyMCE, AntiXSS, MVC3 y GetSafeHtmlFragment

Estoy trabajando en una aplicación ASP.Net MVC3. Necesito poder mostrar HTML desde la entrada del usuario (por ejemplo, < strong>, < ul>, < li>, etc.) pero no quiero ningún riesgo de XSS.

Estoy usando el paquete AntiXSS a través de Nuget. En mi modelo, tengo

[AllowHtml] 
public string UserDetails{ get; set; } 

En mi opinión, tengo TinyMCE enganchado en el área de texto.

En mi controlador, me sale el mensaje desde la vista y desinfectar: ​​

using Microsoft.Security.Application; 
... 
string SanitizedDetails = Sanitizer.GetSafeHtmlFragment(model.UserDetails); 

Mi pregunta: ¿Hice lo correcto? ¿Estoy protegido de la mayoría de los problemas de XSS o estoy ladrando el árbol equivocado?

Respuesta

4

Estás contra algunas formas. Permitir html es una operación peligrosa, por lo que intenta mitigarlo lo mejor posible. Tu enfoque es bastante bueno aquí.

Hay otras opciones para ayudar, pero desafortunadamente no todo está listo para la producción. Existen encabezados de política de seguridad de contenido parcialmente admitidos por varios navegadores. Ex: http://www.w3.org/TR/CSP/

Así que lo que tenemos es decente, pero se puede mejorar esto un poco si quiere aventurarse en la política de seguridad de contenido (por ejemplo)

voy más un buen número de ataques XSS aquí si estás interesado. http://www.pluralsight-training.net/microsoft/Courses/TableOfContents?courseName=hack-proofing-dotnet-app

Es posible que desee incluir un adicional desinfectar antes de su representación (y antes de guardar) en caso de otro ataque (inyección de SQL, por ejemplo) se ha insertado código XSS en su html.

0

Cuando usamos Sanitizer.GetSafeHtmlFragment(model.UserDetails); con la ayuda de la Lista blanca, no permitirá que se ejecuten etiquetas a través de ella. Por ejemplo, cuando

model.UserDetails = "Testdata `<script>alert('Malicious Code');</script>`" 

Es un Código de inyección, el método SafeHtmlFragment no permite la etiqueta <script> a ejecutar.

model.UserDetails = "Testdata `<a href="www.google.com">Google <a/>`" 

Es un código seguro donde debe devolver un texto y el hipervínculo de Google para navegar a google.com.

Cuando el model.UseDetails solo devuelve Testdata como salida.