Preparando un pequeño nuevo proyecto del que os hablaré en mi siguiente artículo, tuve un problema que me llevó a escribir este otro. En un momento de la aplicación el usuario debe escribir una url (el resto es secreto aún :P). Pues bien, ya durante las pruebas aparecieron los típicos graciosos que utilizan url’s potencialmente peligros, de esas que no hacen cosas nada buenas. Buscando un poco dí con Google Safe Browsing API, el sistema que Google pone a nuestra disposición para comprobar contra sus sistemas si tienen una determinada url recogida dentro de su base de datos de urls peligrosas, la misma que utilizan ellos para lanzar a veces esos avisos de “¿seguro que quieres ver esto?”.
Esta API funciona de modo diferente a la mayoría de aplicaciones de Google que residen directamente en la nube y lanzamos consultas contra su API. En este caso nos provee de su base de datos de urls potencialmente peligrosas para que las guardemos localmente y hagamos las consultas directamente en nuestros sistemas, lo único que debemos hacer es actualizar periódicamente esos datos, eso sí, con algunas limitaciones que nos impone Google, como que no se pueden renovar en intervalos inferiores a 30 minutos. Actualmente esta base de datos tiene más de trescientos mil registros.
Vamos a explicar como utilizarla. Lo primero que debemos hacer es, como en todo lo que hace Google, crear una “API KEY” y una sencilla tabla en nuestro servidor MySQL donde alojaremos la información que nos envíe Google.
CREATE TABLE IF NOT EXISTS `malware` ( `malware_hash` varchar(32) NOT NULL, PRIMARY KEY (`malware_hash`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Creamos ahora una tarea que se ejecutará periódicamente y que leerá, siguiendo las especificaciones adecuadas, los datos que devuelve Google y los insertará/eliminará de nuestra base de datos. Yo, como ya he comentado en otras ocasiones, utilizo Adodb para el acceso a datos.
include(dirname(dirname(__FILE__))."/includes/funciones.inc.php"); $api_key = "TU KEY"; $google_url = "http://sb.google.com/safebrowsing/update"; //open the remote URL $target = "$google_url?client=api&apikey=$api_key&version=goog-malware-hash:1:-1,goog-black-hash:1:-1"; $handle = fopen("$target", 'r') or die("Couldn't open file handle " . $target); if ($handle) { while (!feof($handle)) { $line = fgets($handle); if (substr($line,0,1) != '[') { $operation = (substr($line,0,1)); //get the '+' or '-' $hash = trim(substr($line,1)); //get the md5 hash $hash = qstr($hash); //escape if ($operation == '+'){ $sql = "insert ignore into malware (malware_hash) VALUES ('".$hash."')"; $conn->Execute($sql); }else{ $sql = "delete from malware where malware_hash = '".$hash."'"; $conn->Execute($sql); } } } fclose($handle); }
Lo que hacemos simplemente es eliminar los hash que nos indica que debemos quitar y añadir los nuevos. Vamos a probar el sistema. Utilicé varias clases y sistemas que había por ahí para utilizar con PHP pero ninguno me parecía lo suficientemente completo hasta que encontré este. Su funcionamiento es muy sencillo. De nuevo está hecho usando Adodb, cámbialo según tus requerimientos.
$class = new GoogleSafeBrowsing('tu_key', true); $safe=$class->lookupsFor("http://blog.osusnet.com");
Nos devolverá un booleano que indica si la url es segura o no. Si probamos con alguna de éstas obtendremos un bonito false :). Espero que os sirva.