Categories
WordPress

WordPress 2.3: privacidad, problemas y otros

Comentarios sobre algunas mejoras WordPress 2.3, sobre la privacidad de datos y algunos parches para evitar problemas de seguridad.

A estas alturas supongo que seré uno de los últimos de los que aburra con este tema 😀 , pero la salida de WordPress 2.3 ha generado -- como esperaba luego de leer la lista de correo -- bastante polémica por que el nuevo sistema de actualizaciones envía ciertos datos* a api.wordpress.org.

Privacidad

A pesar de que el código para la notificación de actualizaciones está en el repositorio desde el 22 de agosto, este incidente empezó día anterior al lanzamiento de esta versión con opiniones divididas -- incluso entre los desarrolladores -- sobre si es necesario y sobre todo, si es correcto o no que éstos datos se envíen sin el consentimiento de los usuarios. Lo malo de todo este revuelo que se armó es que hasta dos horas antes del lanzamiento, ninguno de los que reclamaba que quitaran esta característica propuso un parche; por otro lado también hubo respuestas inadecuadas por parte de Matt Mullenweg, en especial esta:

If you don’t trust wordpress.org, I suggest you do one of the following:

  • Use different software.
  • Fork WordPress.
  • Install one of the aforementioned plugins.

Problemas

Esta versión trae consigo importantes cambios en el esquema de la base de datos, por lo que es necesario antes de actualizar, asegurarse que los plugins y tema usados sean compatibles.

Andrés recopiló una serie de errores que muchos usuarios parecen compartir, adicionalmente a esto si alguien se encuentra con el siguiente error no tiene porque preocuparse (probablemente es parte de un bug antiguo que permitía agregar dos veces la misma categoría a una entrada).

code:

WordPress database error: [Duplicate entry 'post_id-category_id' for key 1]
INSERT INTO wp_term_relationships (object_id, term_taxonomy_id)
VALUES ('post_id', 'category_id')

Personalmente les sugiero que primero hagan pruebas locales antes de actualizar sus blogs, pueden seguir el artículo "5 Step Failsafe upgrade for WordPress" para esto, pero sólo tomen en cuenta los últimos cuatro pasos (por ningún motivo realicen el paso 1 con la alternativa que se menciona ahí, o al menos no lo mantengan activado luego de terminar de actualizar).

Consumo de memoria

Me ha llamado la atención otra vez los datos que publica Andrés con respecto al incremento de memoria de WordPress 2.3, según sus pruebas esta última versión consume casi el doble de memoria que la anterior versión:

code:

//Wordpress 2.2
Memoria usada: 2981.4 KB de 3328 KB

//Wordress 2.3
Memoria usada: 6743.2 KB de 6912 KB

Personalmente creo que hay algo raro en su entorno de pruebas 🙂 , puesto que tanto en DreamHost, en este servidor y la máquina virtual que uso, WordPress 2.2 recién instalado y con el tema por omisión consume alrededor de 4530 KB y WordPress 2.3 está por los 5180 KB, con lo cual el incremento de memoria no es tan dramático para blogs pequeños como éste (blogs más populares tampoco tienen porque preocuparse si usan wp-cache).

Una forma de reducir un poco más el consumo de memoria de blogs que usan archivos de traducción, es traducir sólo el texto necesario (fechas principalmente) y eliminar las demás palabras, pueden descargar estos archivos que actualmente uso para el blog:

Otras mejoras

Aunque no está relacionado directamente a WordPress 2.3, modifiqué un parche para evitar posibles problemas de denegación de servicio a través de pingbacks que afecta a todas las versiones.

diff:

Index: wp-includes/functions.php
===================================================================
--- wp-includes/functions.php   (revision 6145)
+++ wp-includes/functions.php   (working copy)
@@ -690,8 +690,39 @@
        return $array;
 }
 
-function wp_remote_fopen( $uri ) {
-       $timeout = 10;
+function wp_limited_curl($url, $bytes_limit = 30720, $timeout = 10) {
+       $ch = curl_init($url);
+       
+       $GLOBALS['__temp'] = array('total' => 0, 'output' => '', 'bytes_limit' => $bytes_limit);
+       
+       function read_body($ch, $string) {
+              $length = strlen($string);
+              
+              $GLOBALS['__temp']['total'] += $length;
+              $GLOBALS['__temp']['output'] .= $string;
+              
+              if ( $GLOBALS['__temp']['total'] > $GLOBALS['__temp']['bytes_limit'] )
+                     return -1;
+              
+              return $length;
+       }
+       
+       curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'read_body');       
+       curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+       curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1);
+       curl_setopt($ch, CURLOPT_BUFFERSIZE, 4096);
+       curl_setopt($ch, CURLOPT_RANGE, "0-$bytes_limit");
+       curl_exec($ch);
+       curl_close($ch);
+       
+       $output = $GLOBALS['__temp']['output'];
+       unset($GLOBALS['__temp']);
+       
+       return $output;
+}
+
+function wp_remote_fopen( $uri, $bytes_limit = 102400 ) { // 100 KB
+       $timeout = 10;
        $parsed_url = @parse_url($uri);
 
        if ( !$parsed_url || !is_array($parsed_url) )
@@ -702,24 +733,21 @@
 
        if ( ini_get('allow_url_fopen') ) {
               $fp = @fopen( $uri, 'r' );
-              if ( !$fp )
+              if ( !is_resource($fp) )
                      return false;
 
-              //stream_set_timeout($fp, $timeout); // Requires php 4.3
+              if ( function_exists('stream_set_timeout') )
+                     stream_set_timeout($fp, $timeout); // Requires php 4.3
               $linea = '';
-              while( $remote_read = fread($fp, 4096) )
+              $bytes = 0;
+              while( ( $remote_read = fread($fp, 4096) ) && $bytes < $bytes_limit ) {
+                     $bytes = $bytes + 4096;
                      $linea .= $remote_read;
+              }
               fclose($fp);
               return $linea;
        } else if ( function_exists('curl_init') ) {
-              $handle = curl_init();
-              curl_setopt ($handle, CURLOPT_URL, $uri);
-              curl_setopt ($handle, CURLOPT_CONNECTTIMEOUT, 1);
-              curl_setopt ($handle, CURLOPT_RETURNTRANSFER, 1);
-              curl_setopt ($handle, CURLOPT_TIMEOUT, $timeout);
-              $buffer = curl_exec($handle);
-              curl_close($handle);
-              return $buffer;
+              return wp_limited_curl($uri, $bytes_limit, $timeout);
        } else {
               return false;
        }

*: Los datos que se envían pueden verlo en el anuncio oficial.

9 replies on “WordPress 2.3: privacidad, problemas y otros”

Gura, la diferencia es que con la modificación que hice casi todo* funciona 😀 (el último parche que aparece en el ticket tiene bugs)

*: Hay un error si se usa CURL y se llama dos veces seguidas a wp_remote_fopen

Oye Álex, que digo yo una cosa, ¿no es posible desactivar las "actualizaciones automáticas" de WordPress? Digo yo que esto debería ser, cuando menos, opcional... ¿no?

Si es posible, pero no desde el panel de administración, sino usando otros plugins o haciendo cambios en wp-settings.php y wp-admin/includes/admin.php (en este momento siguen con la discusión el la lista wp-hackers).

Comments are closed.