Hace un par de días un compañero de trabajo me avisaba de que la web de Mosaic, en la que hago «más o menos» de responsable técnico tenía un problema de XSS (inyección de código) en el formulario de búsqueda.
Alarmado, rápidamente actualicé la versión de WordPress a la 2.9.1, pero no conseguí solucionar el problema. La prueba era fácil, poniendo este sencillo script en el formulario de búsqueda
<script>alert("hola");</script>
Se abría un cuadro de diálogo de alerta.
Hoy, con tranquilidad, me he dedicado a investigar. El error se produce sólo en algunos blogs de WordPress, no en todos. Por tanto no es un problema del gestor de contenidos.
Después de algunas pruebas y algunos cambios, el error ha aparecido. Es un problema de algunos temas de WordPress y es muy fácil de arreglar. En el formulario de búsqueda de los temas que tienen la vulnerabilidad podemos ver algo parecido a esto:
<label for="s"><input type="text" name="s" id="s" size="50" maxlength="200" value="<?php echo get_search_query(); ?>" /></label>
El problema es el echo
del código php. Eliminándolo se elimina el problema. Fácil :)
Actualización: Tal como apuntan Javier y Oscar en los comentarios, el problema no es tanto del echo
(que permite mostrar la cadena buscada) como el hecho que no se filtre adecuadamente get_search_query().
Por tanto, tal y como propone Javier, en vez de eliminar el echo
la solución más elegante es <?php echo htmlentities(get_search_query()); ?>