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()); ?>
Hola el error no es que aparezca el término de la búsqueda, que puede resultar interesante volver a ver la cadena buscada.
El problema es que no se filtren los resultados que se insertan…..
Con PHP en lugar de eliminar el echo, creo que resulta mucho más práctico y fino filtrar el resultado de get_search_query() con la función htmlentities() que nos codificará los caracteres especiales del html ( , & )… a < > & …. . Es conveniente utilizar esta función con la opción ENT_QUOTES para que nos codifique también las comillas.
En algunos casos también puede ser útil el uso de la función strip_tags para eliminar tags html de una cadena determinada.
Saludos.
Me lo apunto!
Hasta en mi propio blog he caído :( y el caso es que siempre he tenido presente los problemas de inyección de código cuando desarrollo mis propios proyectos. Al tratarse de WP me confié y zaca, mal creí que la cadena devuelta estaría escapada.
Si se quiere mostrar la cadena de búsqueda que devuelve WP de formas segura podemos usar strip_tags o htmlentities.
Ejemplo:
El problema no es tanto del comando echo sino del valor de get_search_query()
Un saludo.
No aparece el ejemplo, lo pongo con entidades html:
<?php echo htmlentities(get_search_query()); ?>
veamos ahora…
Javiaurea creo que es mejor:
para codificar también las comillas. Es importante codificar las comillas porque imaginemos que ponemos la consulta xxxxx en un campo input:
si no codificamos las comillas, la consulta «xxxxxx nos cierra las comillas del value:
dejando todavía vulnerable el codigo.
perdon el ejemplo:
<?php echo htmlentities(get_search_query(),ENT_QUOTES );?>
Claro!
Gracias Oscar.