Drupal

De vuelta con los comentarios

Un tiempo atrás tuve problemas de ataques masivos de spam, que llenaron el blog de comentarios publicitarios por todos lados. Como solución rápida, deshabilité la posibilidad de hacer comentarios y borré absolutamente todos los comentarios existentes, por lo que quedó el blog sin posibilidad de comentar nada de nada. 

Lo que fue una medida temporal, a la espera de instalar algun sistema antispam, se dilató en el tiempo hasta ayer que quise volver a poner esto un poco en marcha. El tema de los comentarios en un blog, es algo imprescindible bajo mi punto de vista, pues es necesario tener un mínimo de feedback e interacción con quien aterriza por aquí por el motivo que sea. Por esa razón, ayer los volví a habilitar, después de haber instalado un sistema antispam, que ya veremos qué tal funciona... 

El módulo CAPTCHA

El módulo usado es CAPTCHA (https://drupal.org/project/captcha), que te da la opción de insertar un test de este tipo en cualquier formulario de la página. Se puede definir un tipo de test por defecto (inicialmente se puede escoger entre el test matemático y el test de la trascripción del texto de una imagen), pero luego sobrescribir el tipo de test para cada formulario en concreto.

En mi caso el tipo de test usado inicialmente en todos los formularios es el de la operación matemática sencilla, puesto que como usuario lo prefiero bastante al test de transcripción de texte de una imagen... Ahora veremos si es suficiente para mantener esto limpio... Por lo menos, durante las primeras 12h, todo parece seguir en orden... 

Como contrapartida, hay que valorar el hecho que el módulo deshabilita el memory caching de las páginas donde se ha insertado un test captcha, ya que si no, para un determinado formulario, al usuario siempre se le pediría la misma operación, que con fuerza bruta muy fácilmente terminaría resolviendo. Esto hace que se pierda parte de la velocidad de la página, especialmente si se colocan formularios en muchas pantallas de la página. 

Actualización a los 5 días...

Ya hemos cambiado el test del Captcha y hemos colocado la transcripción de la imagen.

Los tests matemáticos son menos molestos de cara al usuario, pero su efectividad ha quedado un poco en entredicho, en menos de una semana de pruebas. En estos días, se han colado un total de 8 mensajes de SPAM. Imagino que simplemente por una cuestión de estadística, como el texto correcto acaba siendo un valor casi siempre entre 0 y 100, simplemente por fuerza bruta, uno de cada 100 intentos se acabará colando... Ahora esperemos que con las imágenes la cosa mejore. 

Consumir webservice de Drupal desde PHP

Con esta entrada veremos la forma (una forma) de consumir desde PHP un servicio web publicado mediante Drupal. Lo haremos usando la librería Client URL, cURL, que es una implementación de libcurl para PHP, y que nos permite hacer todo tipo de peticiones desde PHP.

El servicio web en cuestión publicado desde Drupal, es de tipo RESTful, y la particularidad más destacada que tiene es que la autenticación funciona mediante cookie. Esto significa que toda llamada a una función de ese servicio web debe llevar consigo una cookie con una sesion establecida previamente con el servidor

Entonces el procedimiento cuando queremos hacer una petición a una función del servicio, inicialmente haremos una primera petición para autenticarnos y obtener una cookie con la sesión. Una vez hecho esto ya podremos hacer la petición a la función que queramos del sevicio, adjuntando la cookie que hemos obtenido en la petición de autenticación. 

 

El código 

Vamos a ver el código en cuestión: 

<?php
    ///////////////////////////////////////////////////////////////////////
    // Código de ejemplo para llamar a un servicio web publicada con Drupal.
    // Se trata de un servicio de tipo REST, autenticado mediante cookie.
    ///////////////////////////////////////////////////////////////////////
    

    ///////////////////////////////////////////////////////////////////////
    // Primera petición, para autenticarnos y obtener la cookie de sesion
    ///////////////////////////////////////////////////////////////////////
​    $crl = curl_init();
    $urlLogin = "http://example.com/user/login";
    $postdata=array(
        "name"=>"user_name", 
        "pass"=>"user_password",
        "form_id"=>"user_login", 
        "op"=>"Log in"
    );
    
    // URL donde hacer la petición
    curl_setopt($crl, CURLOPT_URL, $urlLogin);
    curl_setopt($crl, CURLOPT_COOKIEFILE, "/tmp/cookies/curlCookie.txt");
    curl_setopt($crl, CURLOPT_COOKIEJAR, "/tmp/cookies/curlCookie.txt");
    curl_setopt($crl, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($crl, CURLOPT_RETURNTRANSFER, 1);
    // Indicamos que vamos a hacer una petición de tipo POST
    curl_setopt($crl, CURLOPT_POST, 1);
    // Y pasamos los parámetros de la llamada post, que es basicamente
    // la variable $postdata que hemos creado al inicio    
    curl_setopt ($crl, CURLOPT_POSTFIELDS, $postdata);    
    // Ejecutamos la llamada
    $result=curl_exec($crl);
    // Para terminar esta primera llamada, nos aseguramos que hemos 
    // podido acceder correctamente, y estamos dentro
    $headers = curl_getinfo($crl);
    if ($headers['url'] == $url) {
        die("Cannot login.");
    }     
    // Si no ha habido imprevistos, cerramos esta primera petición
    curl_close ($crl); 
    

    ///////////////////////////////////////////////////////////////////////
    // Ahora que ya tenemos la cookie guardada de la petición anterior, 
    // hacemos la segunda petición y llamamos a la función del servicio web. 
    ///////////////////////////////////////////////////////////////////////
    $ch = curl_init(); 
    // Url de la petición del servicio web
    $RequestUrl = "http://example.com/samples/get_created_samples.json";
    curl_setopt($ch, CURLOPT_URL,$RequestUrl);    
    // Este parámetro hace que al ejecutar la petición, la función devuelva  
    // la respuesta de la misma
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    // Lo más importante! Pasamos la cookie que hemos obtenido con la 
    // petición inicial    
    curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookies/curlCookie.txt");
    // Ejecutamos la llamada 
    $result = curl_exec ($ch);
    // Ya tenemos los resultados en $result, podemos cerrar la petición 
    curl_close ($ch); 
   
    // Con la funcion json_decode de PHP pasamos del String de json a un 
    // array con el que trabajar mejor con los datos    
    $json_array = json_decode($result, true);
    foreach ($json_array as $json_object){
        echo ("<b>Nom:</b> ".utf8_decode($json_object['surname']."<br/>"));
        echo ("<b>Cognoms:</b> ".utf8_decode($json_object['lastname']."<br/>"));
        echo ("<b>Ciutat:</b> ".utf8_decode($json_object['city']."<br/>"));        
    }
    
?>

 

Haciendo las peticiones detrás de un proxy

En nuestro caso, tuvimos que añadir adicionalmente la configuración del proxy de nuestra red, puesto que para salir a Internet lo hacemos mediante un servidor proxy. Para hacer esto, simplemente añadimos dos opciones más al objeto curl: la url del proxy y su puerto: 

    $ch = curl_init(); 
    $RequestUrl = "http://example.com/samples/get_created_samples.json";
    // Configuración del proxy
    curl_setopt($ch, CURLOPT_PROXY, "http://proxy.example.edu");
    curl_setopt($ch, CURLOPT_PROXYPORT, "8080");
    curl_setopt($ch, CURLOPT_URL,$RequestUrl);    
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookies/curlCookie.txt");
    $result = curl_exec($ch);
    curl_close ($ch); 

Y esto es todo. 

Categorias: 

Últimos workarounds

Últimos Short Tips

Puedes encontrarme en

Sites Relacionados