WordPress 2.3 y el problema de las peticiones largas

Autor: Armonth | El jueves 04 de octubre del 2007 @ 02:58.

Actualización (21:55): si alguno actualiza desde Subversion, el parche ya es oficial (¡gracias filex por el aviso!).

Pensaba no publicarlo (todavía) porque se trata de un problema que si bien no compromete la seguridad puede dejar la versión 2.3 de WordPress frita.

Será un descuido o directamente una cagada el no haber pensando en ello, no sé muy bien cómo considerarlo, pero al menos ya hay parche.

Preámbulo

Con WordPress 2.3 apareció el sistema de etiquetas de forma nativa y al igual que otros muchos sistemas se pueden combinar varias, si etiquetas una entrada por "ubuntu, trucos, seguridad" la entrada aparecerá en el archivo de las tres etiquetas pero también se puede buscar por "ubuntu+seguridad" para mostrar los temas que al menos tengan esas dos etiquetas.

Esto no es nuevo y otros muchos servicios que incluyen etiquetas ofrecen esta característica de "unir etiquetas".

El problema de las queries largas

El problema es que (resumiendo) no han puesto ninguna limitación a este comportamiento por lo que se pueden pedir entradas con cientos de intersecciones por ejemplo:

url-del-sitio/tag/ubuntu+seguridad+trucos+abc+bcd+cdf+edf+etc+etc2+etc3+etc4

Al hacerlo se crean peticiones (queries) muy complejas que no son nada eficientes y que llegan a saturar totalmente la máquina donde nos alojamos. O lo que es lo mismo: podemos saturar una máquina con una URL estructurada a mala leche.

Esto ha salido a la luz por un reporte en la lista de wp-testers con una bonita query SQL que se tomó su tiempo en procesarse:

# Query_time: 77983 Lock_time: 0 Rows_sent: 0 Rows_examined: 0

Las soluciones

Hay dos soluciones, según Ryan Boren limitar el número de etiquetas que se pueden juntar a un valor bajo de entre 3 y 5 lo cual no quita ningún tipo de funcionalidad (rara vez se usan las intersecciones y yo nunca he visto usar más de dos). Ya hay un ticket con parche incluido para solucionarlo.

Para arreglarlo es lo de siempre: hay que editar el fichero wp-includes/query.php, buscar el mismo código que aparece en el enlace anterior, borrar lo que sale en rojo y añadir lo que sale en verde.

La otra solución es de parte de Alexander Concha que es un parche más completo según sus propias palabras (primer comentario de esta entrada) y no limita nada pero usa un método alternativo que no provoca el problema.

Comentarios