2011-09-02 20 views
6

Esto se ha preguntado antes, pero necesito una claridad del 100% sobre este tema, ya que es muy importante para mí hacerlo bien.Pregunta/aclaración de PHP XSS

Situación: un sistema de mensajes en un sitio web. El usuario ingresa un mensaje en un cuadro de texto, envía el formulario y se ingresa a la base de datos. Esta información puede ser llamada desde la base de datos y mostrada dentro de las etiquetas <span> a otro usuario.

¿Qué procedimientos de seguridad debo tomar para evitar que estos datos sean maliciosos? Ya uso mysql_real_escape_string para detener cualquier inyección y strip_tags parece útil, pero he escuchado muchos otros nombres mencionados. ¿Qué debo usar para proteger estos datos, ya que solo se muestran en las etiquetas <span>?

Gracias.

+0

posible duplicado de [PHP: ¿Cómo evitar totalmente los ataques XSS?] (Http://stackoverflow.com/questions/5934063/php-how-to-totally-prevent-xss-ataques) –

+0

Solo para aclarar, Estoy marcando esto como un duplicado no porque sea una mala pregunta (¡no lo es!): todos deberían ser tan diligentes –

+0

Lo esencial aquí es desinfectar siempre cualquier dato proporcionado por el usuario sin importar cuán insignificante sea. – Jrod

Respuesta

3

La idea errónea es que quiere escapar de la entrada, lo cual es incorrecto. Debe filtrar la salida (y la base de datos también es una salida).

Significa que cuando se envía el formulario, usa mysql_real_escape_string() para enviar (salida) datos a la base de datos, y usa htmlspecialchars() para mostrar el contenido en la pantalla. El mismo principio se aplica a las expresiones regulares, donde usaría preg_quote(), y así sucesivamente.

No importa de dónde provienen los datos, debe escaparse en el contexto de donde lo está enviando.

Para evitar ataques XSS, debe usar htmlspecialchars()/htmlentities(). mysql_real_escape_string no tiene nada que ver con XSS (pero aún tiene que usarlo cuando está enviando datos a la base de datos).

+0

. Sabía que mysql_real_escape_string era un poco irrelevante para este tema, pero lo mencioné para evitar que alguien dijera "¡tú también tienes que hacer eso!" :) Cuando pones una barra entre los caracteres especiales y las actividades, ¿estás diciendo usar ambos o usar uno u otro? ¿cual es mejor? también, ¿para qué es la preg_quote()? No estoy 100% seguro de exactamente a qué te refieres cuando dices cuando lo usas dentro de una expresión regular (¡aunque busqué en Google la definición!: D) – James

+2

James, menciona 'preg_quote' en un sentido que» usa el herramienta correcta para el trabajo correcto «=» usa la función adecuada y recomendada para escaparse de entrada para ciertos dominios/contextos (htmlspecialchars para html, mysqli_real_escape_string para mysql dbs, sentencias preparadas para prácticamente cualquier db, preg_quote para expresiones regulares compatibles con perl, escapeshellarg/escapeshellcmd para comandos de shell, etc.) « – knittl

+0

+1 para la distinción entre entrada y salida. Si no se supone que es HTML, no lo valide/filtre como tal (usando 'strip_tags()'). –

3

Use htmlspecialchars al imprimir en una página HTML. Mostrará los datos de la misma manera que el usuario lo ingresó (para que los usuarios puedan usar algo como <3 en sus mensajes sin eliminar el resto)

+0

y esto solo protegerá contra todos los tipos de XSS considerando que solo estoy colocando el contenido dentro de las etiquetas '' y no dentro de los objetos html? Estoy seguro de que leí en otro lado que la gente decía que esto era viejo e inútil. – James

+0

@James: 'htmlentities' es una mejor alternativa si está disponible en su sistema, pero ambos funcionarán bien. –

+0

James, esto es totalmente seguro cuando saca texto dentro de ''. No es viejo e inútil, es recomendable. ['htmlspecialchars'] (http://php.net/htmlspecialchars) para el resultado y [declaraciones preparadas] (http://php.net/mysqli_prepare)/[' mysqli_real_escape_string'] (http://php.net/mysqli_real_escape_string) – knittl

0

Consulte la Hoja de referencia de prevención de OWASP XSS. Explicará cómo evitar XSS para diferentes contextos. Htmlentities debería hacer el trabajo cuando entre etiquetas.