WordPress 3.5: peligro de inyección SQL si ves “PHP Warning: Missing argument 2 for wpdb::prepare()”

Hosting Seguro para WordPress con Soporte especializado

codigo matrix hackeado

Nos avisa el bueno de Andrew Nacin de un grave error en sitios que han actualizado a WordPress 3.5 que, aunque no afecta a todos, es un potencial peligro de inyecciones SQL, así que no hay que tomarlo con ligereza.

El asunto es que hay usuarios que, debido a plugins o temas, están recibiendo un aviso bastante feo, este:

“PHP Warning: Missing argument 2 for wpdb::prepare().”

Pues bien, como se ha apuntado en los foros de soporte, esto es debido a que algo o alguien (un plugin) está usando incorrectamente la función $wpdb->prepare. Es un aviso de algo gordo, porque también indica un uso indebido de prepare(), y eso es un riesgo de seguridad.

No es un error de WordPress, más bien al revés, pues el equipo de desarrollo ha preferido que estos errores se muestren a que tengamos un agujero de seguridad por un plugin y no nos enteremos, así que en realidad está hecho por nuestro bien, mal que le pese a algún desarrollador que ahora tendrá que revisar su código.

Un ejemplo de esto sería esta línea de código en un plugin:

$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->comments SET comment_parent=$parentID WHERE comment_ID=$commentID;" ) );

El problema es que no se ha usado la declaración de prepare correctamente, pues incluye las variables $parentID y $commentID directamente en el SQL. Para hacerlo bien se tendrían que usar “placeholders” y luego ya incluir las variables.

El ejemplo anterior es un código peligroso, ya que conlleva la posibilidad de que abra la puerta a un exploit de inyección SQL, o sea, el primer paso para hackear tu sitio web.

El código anterior se puede solucionar de este modo:

$wpdb->query( $wpdb->prepare( "UPDATE $wpdb->comments SET comment_parent=%d WHERE comment_ID=%d;", $parentID, $commentID ) );

Como ambos se supone que son integradores, se han reemplazado las variables en la declaración con el %d, y luego se ponen las variables al final de la declaración prepare(). Así es como se supone que se debe usar prepare. Si fueran cadenas entonces usas %s.

O sea, que si quieres arreglar momentáneamente el error tienes que encontrar la línea de código con el problema y corregirla. Con eso eliminas el exploit y el mensaje de aviso tan feo.

Por supuesto, lo anterior es un apaño temporal que solo te sirve a ti, no a toda la comunidad ni a WordPress en su conjunto, lo que hay que hacer en realidad si ves este error es lo siguiente:

  1. Desactivar todos los plugins
  2. Ir activando uno a uno hasta detectar el que provoca el error
  3. Avisar al desarrollador indicándole el enlace del artículo de Andrew Nacin para que lo arregle y suba una versión segura

Lo mismo también puede pasar con un tema WordPress así que si tras hacer lo anterior sigue el error cambia de tema para comprobarlo.

La peor solución es ocultar los errores, aunque puedes hacerlo simplemente añadiendo estas líneas al fichero wp-config.php:

ini_set( 'display_errors', false );
error_reporting( 0 );

Un ejemplo de este error, lamentablemente, es el plugin Akismet, pues aunque acaban de actualizalo ahora mismo y soluciona el fallo deberían haber estado más pendientes, por la estrecha relación de Automattic con el desarrollo de WordPress.

Valora este artículo para mejorar la calidad del blog ...

PobreRegularEstá bienMuy buenoExcelente (sin valoración aún)
Loading...Loading...

autor: Fernando

Fernando Tellado, maquero cansino, padre de tres hijos y de una perrita Beagle, Bilbaino de nacimiento, Español de corazón y ciudadano de donde me quieran. Autor del libro WordPress - La tela de la araña. Mi blog personal es Navegando con red, donde he crecido como escritor en la red y ofrezco mis visiones acerca de la Web 2.0 y la blogosfera.

comparte esta entrada en
cursos wordpress online
  • vive2

    Nexgen gallery en su ultima version 1.9.8 tiene ese problema, no la actualicéis

    hasta que los desarrolladores lo solucionen.

    Si lo habeis echo y os sale ese mensaje, y no os queda otro remedio que esperar a lo resuelvan, podeis hacer esta chapucilla que he encontrado pero de momento a mi me saca del apuro:

    Well, I managed to make the warning to go away with the functionality still working.

    I made a change to nextgen-gallery/lib/tags.php by adding ‘null’ as second argument, changing the line

    $term_ids = $wpdb->get_col( $wpdb->prepare(“SELECT term_id FROM $wpdb->terms WHERE slug IN ($sluglist) ORDER BY term_id ASC “));

    to

    $term_ids = $wpdb->get_col( $wpdb->prepare(“SELECT term_id FROM $wpdb->terms WHERE slug IN ($sluglist) ORDER BY term_id ASC “, null));

    http://wordpress.org/support/topic/missing-argument-wpdb-in-35-final?replies=21#post-3549768

    Fernando no se como editar mejor este post, si quieres lo eliminas y pones tu la informacion como mejor te parezca, seguro que ha algún usuario le sacas del “Panico”..

  • http://mp3letras.com/ Daniel Paulino Perez

    Carajo si yo hubiese sabido antes que esta Jodida versión traía tanto problema ni me preocupo por actualizarla muy buenos gráfico pero dentro del editor hay muchos problema como el que explican aquí http://ayudawordpress.com/foros/hilo/problemas-tras-instalar-actualizacion-3-5/ también no me deja personalizar la url cuando le da como que se frisa el wordpress y no cuando le da la gana es que responde

  • http://twitter.com/iBlogLabs iBlogLabs

    Fernando me gustaria saber si en el repositorio no hay un filtro donde se verifique que los plugins usan bien la api de WP y no crean vulnerabilidad? Digo, si no es asi deberian ser mas rigurosos a la hora de aceptar plugins en el repositorio.

    • http://tellado.es/ Fernando

      Lo hay pero no es perfecto, un tremendo ejemplo negativo es Akismet, que pecaba de esto siendo de Automattic

  • Gustavo Freitas

    Fernando,

    parabéns pelo artigo e pelo alerta, como sempre o Ayuda WordPress é de grande ajuda para a comunidade que utiliza WordPress, mesmo aqui no Brasil.

    Citei seu artigo no meu artigo onde falo sobre as novidades do WordPress 3.5. Coloco o link abaixo, se não puder, por favor, me perdoe e exclua essa parte do comentário.
    http://querocriarumblog.com.br/wordpress-3-5-confira-novidades/

    abraço.

  • http://masalladelared.com/ Patrick Muñoz

    Donde sale el mensaje? Lo digo porque yo también uso Nexgen Gallery y no ve el mensaje de error por ningún lado.

    • vive2

      Eso me ha salido al actualizar wp 3.5 y nexgen gallery 1.9.8, si no has actualizado nexgen no hay problema de momento, por lo que el fallo está en nexgen gallery y no en wp 3.5.
      De todas formas si sigues el hilo del enlace verás como los desarrolladores hacen preguntas sobre la configuración del server etc, es decir que estan recopilando la maxima informacion para sacar un parche.

    • vive2

      Eso me ha salido al actualizar wp 3.5 y nexgen gallery 1.9.8, si no has actualizado nexgen no hay problema de momento, por lo que el fallo está en nexgen gallery y no en wp 3.5.
      De todas formas si sigues el hilo del enlace verás como los desarrolladores hacen preguntas sobre la configuración del server etc, es decir que estan recopilando la maxima informacion para sacar un parche.

      • http://masalladelared.com/ Patrick Muñoz

        Si, pero donde sale ese mensaje? Lo digo por que no lo veo por ningún lado…

        • byhanzo

          Sale en la parte de arriba en el panel de control/administración de WordPress. Es muy claro y se ve siempre hasta que no se solucionen los fallos, así que si no lo ves no estará dando el fallo.

          A mi me a salido y recomiendo actualizar todos los plugins primero antes de actualizar WordPress ya que muchos han parcheado el error. Una vez que he actualizado los plugins me ha desaparecido el mensaje sin tocar yo nada de código ni nada, por lo que actualizad los plugins porque en la mayoría lo han solucionado.

  • Arthur Shelby

    Lo primero que te dicen en el college “NO COCATENES SENTENCIAS DE SQL” y lo primero que haces :S

  • latrasweb.net

    Creo que wordpress asume algo que no es verdad.
    Puedes haber validado y sanado( como es recomendable hacer )
    tus variables antes de formar la consulta.
    Siendo por tanto innecesario los placeholders.

  • http://tellado.es/ Fernando

    La versión no tiene ningún problema a este respecto, sino plugins que tienen código inseguro

  • Armansio

    ¿Para cuando una actualizacion?

    • http://tellado.es/ Fernando

      Lo que necesita actualizarse son los plugins, no WordPress

  • alexander

    yo estoy usando esa version….

  • http://imojito.com/ iMojito

    Hola,
    muchos hostings desactivan estos mensajes por defecto. Yo me he topado con estos mensajes en el syslog pero bien podrían estar en los logs de apache o lo que tengáis configurado en el php.ini

    La versión actual de Disqus para wordpress muestra esta advertencia. No hay que alarmarse porque los riesgos son los mismos que antes de utilizar wordpress 3.5, solo que antes no lo sabías.

Suscríbete a Ayuda WordPress

Suscríbete para recibir en tu correo las últimas noticias de Ayuda WordPress (solo un correo al día y únicamente si hay nuevas publicaciones)

¡Enhorabuena, ya te has suscrito!