2011-07-10 20 views
6

Estoy a prueba de xss mi sitio web para los ataques de Javascript y xss. Está escrito en Webforms de ASP.NET.Prevención de ataques Javascript y XSS

La parte principal que me gustaría probar es un control de usuario que tenga un cuadro de texto (tinyMCE adjunto).

Los usuarios pueden enviar historias al sitio escribiendo en este cuadro de texto. Tuve que establecer validateRequest en falso porque quiero obtener las historias de los usuarios en HMTL (tinyMCE).

¿Cómo debo evitar los ataques javascript-xss? Como las historias de los usuarios son textos HMTL, no puedo usar Server.HtmlEncode en sus historias. En general, ¿cuál es la forma más segura de recibir contenido HTML del usuario, guardarlo y luego mostrarlo a los usuarios?

Si un usuario coloca código malicioso en el cuadro de texto y lo envía, ¿existe la posibilidad de que esto pueda dañar a otras personas que ven ese texto?
Gracias.

+2

buena pregunta. No creo que una respuesta justifique la pregunta. en una nota al margen no relacionada, su captcha está desactualizado (actualizado hace más de dos años). por favor intente con google [recaptcha] (http://www.google.com/recaptcha). – naveen

+0

No estaría de más prevenir también los ataques de inyección SQL. – Tim

+1

@Tim: cuidado de EF – Kamyar

Respuesta

4

Si no limpia lo que el usuario coloca en el cuadro de texto y lo envía, entonces sí, existe la posibilidad de que se haga daño.

Es posible que desee comprobar el Microsoft Anti-Cross Site Scripting Library, ya que está diseñado para ayudar a los desarrolladores a prevenir estos ataques.

También vale la pena echar un vistazo a es de OWASP Cross-site Scripting (XSS)

Es posible que desee ver en HttpUtility.HtmlEncode y HttpUtility.HtmlDecode también. Acabo de escribir una prueba rápida, y parece que se podría tratar su preocupación en el comentario más abajo (sobre cómo mostrar los datos a otros usuarios en el formato correcto):

string htmlString = "<b>This is a test string</b><script>alert(\"alert!\")</script> and some other text with markup <ol><li>1234235</li></ol>"; 

string encodedString = HttpUtility.HtmlEncode(htmlString); 
// result = &lt;b&gt;This is a test string&lt;/b&gt;&lt;script&gt;alert(&quot;alert!&quot;)&lt;/script&gt; and some other text with markup &lt;ol&gt;&lt;li&gt;1234235&lt;/li&gt;&lt;/ol&gt; 

string decodedString = HttpUtility.HtmlDecode(encodedString); 
// result = <b>This is a test string</b><script>alert("alert!")</script> and some other text with markup <ol><li>1234235</li></ol> 

controles ASP.NET y HTMLEncode Iba a publicar la información que tenía de mi clase, pero encontré un enlace que enumera exactamente lo mismo (para 1.1 y 2.0), así que publicaré el enlace para una referencia más fácil. Probablemente pueda obtener más información sobre un control específico que no figura en la lista (o las versiones 3.0/3.5/4.0 si han cambiado) al buscar en MSDN, pero esto debería servirle como guía de inicio rápido para usted, al menos. Avíseme si necesita más información y veré qué puedo encontrar.

ASP.NET Controls Default HTML Encoding

He aquí una lista más completa de uno de los blogs de MSDN: Which ASP.NET Controls Automatically Encodes?

+0

Gracias. Pero entonces, ¿cómo puedo mostrar los datos a otros usuarios en un formato correcto? ¡En realidad, establecer validateRequest en false me ha preocupado un poco! – Kamyar

+3

Configuración validateRequest como false en la página *** *** debe usted se preocupe si usted no está haciendo cualquier otra validación :) Usted tiene que mirar a los métodos de codificación/decodificación disponibles en .NET. Estoy 99% seguro de que hay una manera de hacerlo, pero tendré que verificar algunos documentos y están en el trabajo. – Tim

+0

Gracias. Estaría muy contento si actualiza su respuesta cada vez que tiene tiempo para ver sus documentos. – Kamyar

3

Me gustaría ir con su almacenamiento codificado en la base de datos, a continuación, cuando se muestra decodificarlo y reemplazar sólo el < con &lt; si di que necesitas preservar otras cosas.

Por lo que yo sé, si sustituye la < XSS no es realmente posible, ya que cualquier código JS debe estar dentro <script> etiquetas para ser ejecutados y mediante la sustitución, obtendrá esta en el código HTML: &lt;script> y la el usuario verá <script> en la pantalla ya que el navegador analizará la entidad &lt;.

Dicho esto, si permite que los usuarios publiquen HTML "sin procesar", p.<b>this section is bolded</b> entonces usted tendrá que crear "lista blanca" de etiquetas permitidas luego vuelva a colocar manualmente el &lt; con el código HTML adecuado, por ejemplo:

string[] allowedTags = new string[] { "a", "b", "img" }; 
foreach (allowedTag in allowedTags) 
    output = output.Replace("&lt;" + allowedTag, "<" + allowedTag); 
+1

Hmm. suena razonable. reemplazando todas las Kamyar

+0

& # 0060 y & # 000000000000000060 también funciona ... ¿cómo lo evitarías? –

+0

@ Marcos '& # 0060' es el mismo como' '< - inofensivos hasta decodificado por lo que va con la forma en la lista blanca aún está a salvo en la medida de lo que puedo decir. –

1

¿Ha visto el OWASP guide on this

La mejor manera sería tener una lista blanca de etiquetas permitidas en lugar de tratar de encontrar una forma de evitar todas las etiquetas de script.

Una solución sobre cómo hacer esto está aquí How do I filter all HTML tags except a certain whitelist? Pero también debe tener en cuenta que las personas pueden tener un enlace a un script externo a través de una etiqueta de imagen con una URL a su propio servidor. Véanse los ejemplos aquí http://ha.ckers.org/xss.html de los diferentes tipos de ataques que necesita para defenderse de

Cuestiones relacionadas