Contenido

Escribe plugins más seguros para tu WordPress

28 May

+ 4

Debido a la oleada de bugs, problemas y fallos encontrados en las versiones más usadas de WordPress están saliendo muchos posts, de ayuda a los bloggers para mejorar la seguridad de sus sitios web, y esto está muy bien aunque no solo con eso conseguiremos estar completamente a salvo.

Como desarrollador he de asegurarme de que mis aplicaciones cumplan un mínimo de seguridad, ya sea para que nadie pueda robar información como para que la aplicación funcione contra viento y marea. Lamentablemente en un mundo tan vertiginoso como Internet en que las modas, tendencias y versiones son tan breves que es imposible estar a la última solo nos queda informarnos e informarnos y no dejar nunca de reciclarnos, aprender las nueves herramientas de las que disponemos para realizar nuestro trabajo y ya que las empresas no confian en la formación, ya que en la mayoría esta es nula o impensable, tienes que dedicar tiempo en casa para poder afrontar los problemas laborales con más herramientas.

Mi Sensei, JuanPe, me dijo una vez una frase de un tio famoso de esos que el lee:

Si solo tienes un martillo, tenderás a ver los problemas como clavos, en cambio si tienes más herramientas podrás ver los problemas desde un prisma más grande…

O algo, asi, que me perdone el tio ese tan famoso 😀

Bueno, todo este rollo era la introducción, pero he visto la película Click (la recomiendo, ha entrado en el ranking de mis preferías con un aplastante resultado) y he perdido un poco el norte. Lo único que quería era deciros que debemos mejorar nuestros plugins para WordPress y para ello tenemos a nuestra disposición muchas herramientas para conseguirlo.

En este artículo, nos explican como mejorar la seguridad de nuestros plugins usando una serie de funciones del propio WordPress para controlar nuestros datos, haré una traducción de las mias así que Dios nos pille confesados (expresión usada para decir que os agarreis que vienen curvas :D).

attribute_escape();

El mayor problema que tenemos en las aplicaciones web es la interacción externa con la aplicación. Debido a que es algo que prácticamente es imposible de controlar hemos de limitar los posibles usos fraudulentos o erroneos de nuestros parámetros de entrada, ya sean POST o GET.

Para los que no conozcan esta terminología Web, solo decir y para entendernos, que los datos enviados por GET son los que vemos como parámetros en la barra de direcciones de nuestro navegador y que los datos de POST son aquellos que envian mediante un formulario a otra página de forma completamente invisible para el usuario.

Generalmente en PHP usamos un set de variables globales destinadas a alojar todos los parámetros que enviemos a nuestros scripts mediante alguna de las 2.

<?php
echo $_GET['param1']; //Imprimirá el valor del parametro param1
echo $_POST['param2']; //Imprimirá el valor del parámetro param2?>

Como podemos ver en el ejemplo el uso de estas variables globales es realmente sencillo, se tratan como variables normal, solo que estas variables son de solo lectura y no pueden modificarse su valor en el script de recepción.

Estos parámetros se reciben sin alterar, osea no se aplica ningún filtro a los datos enviados, por este motivo hemos de tratarlos antes de trabajar con ellos.

Para conseguir un nivel de seguridad generalizado a todo WordPress, este incorpora una función llamada attribute_escape(), que se encarga de «escapar» los parámetros para hacerlos inofesivos a nuestros scripts.

Pongamos un ejemplo de algo que pueda pasar.

http://www.url.com/?param1=hola's
...
mysql_query("SELECT * FROM tabla where texto = '".$_GET['param1']."'"); // Causará un error, aunque podría ocurrir algo mucho peor.

Creo que en el ejemplo podemos ver claro por donde quiero ir, hemos de limpiar nuestros parámetros de carácteres raros para evitar posibles problemas.

http://www.url.com/?param1=hola's
...
mysql_query("SELECT * FROM tabla where texto = '".attribute_escape($_GET['param1'])."'"); // No causará error y devolverá todo lo relacionado con hola\'s

De esta forma estamos convirtiendo el valor nuestro parámetro en uno válido para nuestro script.

wp_nonce_field() y wp_nonce_url()

Estas nuevas herramientas funcionan implantando un parámetro con un valor encriptado que a modo de semilla será informado por el desarrollador del plugin, de este modo conoceremos que es lo que debemos recibir como valor de ese campo y podremos cotejarlo con la semilla informada anteriormente, de esta forma estamos añadiendo un valor añadido más a nuestra aplicación.

if ( !function_exists('wp_nonce_field') ) {
        function myplugin_nonce_field($action = -1) { return; }
        $myplugin_nonce = -1;
} else {
        function myplugin_nonce_field($action = -1) { return wp_nonce_field($action); }
        $myplugin_nonce = 'myplugin-update-key';
}

Añadiremos algo similar a esto al inicio de nuestro plugin para comprobar que disponemos de estas propiedades y en caso negativo no causar un error de ejecución en nuestro script.

<form action= ...>
      <?php myplugin_nonce_field('$myplugin_nonce', $myplugin_nonce); ?>
       ...

En nuestro formulario añadiremos la llamada a nuestra función en la que informaremos el nombre y el valor del parámetro que queremos enviar a nuestra página receptora. Yá en ella añadiremos el código pertinente para cotejar el valor enviado.

if ( isset($_POST['submit']) ) {
      if ( function_exists('current_user_can') && !current_user_can('manage_options') )
      die(__('Cheatin’ uh?'));

      check_admin_referer( '$myplugin_nonce', $myplugin_nonce );

Con el uso de check_admin_referer() podremos comprobar el valor del parámetro enviado atraves de nuestro formulario.

Tambien podemos usar wp_nonce_url() para parámetro por GET visibles al usuario.

$delete_url = wp_nonce_url($get_url . "mode=del", '$adsense_nonce' . $myplugin_nonce);

Para los parámetros por GET tendremos que poner un parámetro señuelo que se encargará de abrirnos las puertas a la comprobación.

if($mode == 'del' ){
    check_admin_referer('$myplugin_nonce', $myplugin_nonce);

Bueno, conociendo esto ya estamos dando un gran paso en hacer que WordPress sea más seguro, ya que recordaremos aquel post loco que aNieto2k comentaba algo relacionado con la seguridad de WordPress.

Comentar

#

Me reservo el derecho de eliminar y/o modificar los comentarios que contengan lenguaje inapropiado, spam u otras conductas no apropiadas en una comunidad civilizada. Si tu comentario no aparece, puede ser que akismet lo haya capturado, cada día lo reviso y lo coloco en su lugar. Siento las molestias.