Jan 29

HTML Purifier es una librería para filtrar HTML escrita en PHP que permite eliminar el código malicioso (XSS) a la vez que comprueba que el HTML valide contra el estándar correspondiente.

Una de las principales diferencias de HTML Purifier comparada con otras librerías de filtrado HTML es que descompone por completo el HTML y verifica que cada uno de los elementos se encuentre dentro de una whitelist de elementos permitidos en lugar de limitarse a buscar elementos prohibidos en una blacklist (normalmente desfasada). A la vez que elimina el código no deseado también hace algo poco común en librerías de este tipo, valida que el HTML cumpla el estándar correspondiente y si no lo cumple realiza las modificaciones necesarias para corregirlo.

Puedes usar HTML Purifier tanto para filtrar datos de entrada, en el caso de que sea posible recibir código HTML, como el HTML de salida de tu aplicación. Lo más frecuente es usarla para filtrar datos de entrada como comentarios, emails, el resultado de algunos editores WYSIWYG, etc.

Se ha de tener presente que dado su funcionamiento interno es una librería muy potente pero pesada y lenta, no es para nada recomendable filtrar la salida de tu aplicación cada vez que generas código HTML. Mucho mejor filtrar la entrada y asegurar que el contenido de tu sistema está limpio. En todo caso para filtrar la salida se convierte en algo obligatorio trabajar con algún sistema de cache (generar páginas estáticas, un reverse proxy, en BD capturando el output-buffer, etc.)

A continuación explico brevemente su instalación y uso.

Instalación

[1] Descargar el archivo htmlpurifier-3.0.0.tar.gz y descomprimirlo en el servidor. No es necesario que esté accesible para los usuarios, puedes colocarlo fuera del DocumentRoot. Ten en cuenta que la última versión (la 3.0) sólo es compatible con PHP5.

[2] Poner los permisos adecuados a los directorios que HTML Purifier usará para cachear algunos archivos. Los directorios en cuestión son DefinitionCache/Serializer y todos sus subdirectorios. Si tenemos acceso por shell al servidor lo solucionamos con un:

chmod -R 0777 HTMLPurifier/DefinitionCache/Serializer

Utiliza 0777 o 0775 según convenga, el objetivo es permitir al servidor web escribir en estos directorios.

[3] Es necesario tener instalada la extensión iconv si quieres trabajar con un enconding distinto de UTF-8 y si quieres una salida más bonita del HTML también es necesaria la extensión tidy.

[4] Para mayor comodidad puedes incluir el directorio de la HTML Purifier en tu include_path a pesar de que es recomendable sólo hacer require() cuando vayas a usarla, es una librería bastante grande.

Usando la librería

[php] $dirty_html = ‘prueba’;
require_once ‘/directorio_de_htmlpurifier/library/HTMLPurifier.auto.php’;
//require_once ‘HTMLPurifier.php’;
$config = HTMLPurifier_Config::createDefault();
$config->set(‘Core’, ‘Encoding’, ‘ISO-8859-1’);
$config->set(‘HTML’, ‘Doctype’, ‘HTML 4.01 Transitional’);
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);
echo $clean_html; [/php]

En el ejemplo se incluye el archivo HTMLPurifier.auto.php indicando la ruta completa, si has añadido el directorio de la librería en tu include_path puedes incluir HTMLPurifier.php directamente (usa la línea comentada).

En este ejemplo simple se está configurando HTML Purifier para que trabaje con ‘HTML 4.01 Transitional’ codificado en ‘ISO-8859-1’. Por defecto la librería trabaja con ‘XHTML 1.0 Transitional’ en ‘UTF-8’, si este es el único tipo de documento y codificación que necesitas puedes eliminar las llamadas a set() y no es necesario crear el objeto $config. Existen muchos otros parámetros de configuración que se merecen una ojeada aunque para un funcionamiento normal no es necesario tocar casi nada.

También existen plugins para varios CMS conocidos para empezar a usar HTML Purifier de una forma todavía más fácil. Entre ellos está el plugin HTML Purified para WordPress y el módulo HTML Purifier para Drupal.

Tagged with:
preload preload preload