Publicación cruzada de esto como referencia consolidada de la versión beta de SO Documentation que se desconecta.
Problema
La secuencia de comandos entre sitios es la ejecución involuntaria de código remoto por parte de un cliente web. Cualquier aplicación web puede exponerse a XSS si recibe información de un usuario y la envía directamente a una página web. Si la entrada incluye HTML o JavaScript, el código remoto se puede ejecutar cuando el cliente web presenta este contenido.
Por ejemplo, si un lado de terceros contiene un archivo JavaScript:
// http://example.com/runme.js
document.write("I'm running");
Y una aplicación PHP genera directamente una cadena que se le pasa:
<?php
echo '<div>' . $_GET['input'] . '</div>';
Si un parámetro GET no verificado contiene, <script src="http://example.com/runme.js"></script>
entonces la salida del script PHP será:
<div><script src="http://example.com/runme.js"></script></div>
Se ejecutará el JavaScript de terceros y el usuario verá "Estoy ejecutando" en la página web.
Solución
Como regla general, nunca confíe en la información proveniente de un cliente. Cada valor GET, POST y cookie puede ser cualquier cosa y, por lo tanto, debe validarse. Al generar cualquiera de estos valores, escape de ellos para que no se evalúen de manera inesperada.
Tenga en cuenta que incluso en las aplicaciones más simples, los datos se pueden mover y será difícil hacer un seguimiento de todas las fuentes. Por lo tanto, es una buena práctica escapar siempre de la salida.
PHP proporciona algunas formas de escapar de la salida según el contexto.
Funciones de filtro
Los PHP Funciones de filtro permiten que los datos de entrada al script php para ser desinfectado o validado en muchos sentidos . Son útiles al guardar o generar la entrada del cliente.
Codificación HTML
htmlspecialchars
convertirá los "caracteres especiales HTML" en sus codificaciones HTML, lo que significa que no se procesarán como HTML estándar. Para arreglar nuestro ejemplo anterior usando este método:
<?php
echo '<div>' . htmlspecialchars($_GET['input']) . '</div>';
// or
echo '<div>' . filter_input(INPUT_GET, 'input', FILTER_SANITIZE_SPECIAL_CHARS) . '</div>';
Daría salida:
<div><script src="http://example.com/runme.js"></script></div>
Todo lo que esté dentro de la <div>
etiqueta no será interpretado como una etiqueta JavaScript por el navegador, sino como un simple nodo de texto. El usuario verá con seguridad:
<script src="http://example.com/runme.js"></script>
Codificación de URL
Al generar una URL generada dinámicamente, PHP proporciona la urlencode
función para generar de manera segura URL válidas. Entonces, por ejemplo, si un usuario puede ingresar datos que se convierten en parte de otro parámetro GET:
<?php
$input = urlencode($_GET['input']);
// or
$input = filter_input(INPUT_GET, 'input', FILTER_SANITIZE_URL);
echo '<a href="http://example.com/page?input="' . $input . '">Link</a>';
Cualquier entrada maliciosa se convertirá en un parámetro de URL codificado.
Uso de bibliotecas externas especializadas o listas OWASP AntiSamy
Algunas veces querrá enviar HTML u otro tipo de entradas de código. Deberá mantener una lista de palabras autorizadas (lista blanca) y no autorizadas (lista negra).
Puede descargar listas estándar disponibles en el sitio web de OWASP AntiSamy . Cada lista es adecuada para un tipo específico de interacción (ebay api, tinyMCE, etc.). Y es de código abierto.
Existen bibliotecas para filtrar HTML y evitar ataques XSS para el caso general y que funcionan al menos tan bien como las listas de AntiSamy con un uso muy fácil. Por ejemplo, tienes HTML Purifier