El retorno del SPAM

[blog] [programación]

La solución con la base de datos de SPAM debo reconocer que fue ingeniosa. Está muy en mi línea de “matar moscas a cañonazos”. El problema es que lo que se dice eficaz, no era. Digamos que el número de direcciones IP desde las que puede llegar SPAM, o el número de direcciones de correo o URLs que pueden usar en los comentarios están en un orden de magnitud tal que nunca voy a ser capaz de filtrar los comentarios basura.

Todo vuelve a la pregunta que me hice hace ya hace 9 meses: ¿Como estaban los bots de SPAM enviando comentarios saltándose el formulario de envío? Y por pura casualidad, encontré a que página están atacando. Probablemente están haciendo un POST directamente contra wp-comments-post.php.

Así que volvemos a la sencillez. ¿Como detectar un POST que llega a wp-comments-post.php sin pasar por comments.php? Fácil. Si los bots están lanzando un POST genérico para blogs en WordPress, añadamos un nuevo campo al formulario. Si en wp-comments-post.php detectamos que ese campo no está establecido, entonces se está saltando comments.php y debe ser SPAM. Está solución es tan eficaz que hace que mis dos soluciones anteriores queden obsoletas, así que para aligerar la página y reducir tiempo de procesado, elimino las modificaciones del código anteriores. El código definitivo quedaría de la siguiente manera:

Dentro de los ficheros del tema, en el fichero comments.php:

Añadimos un nuevo campo oculto al formulario:

<input type="hidden" id="comment_post_antirobot" name="comment_post_antirobot" value="0" />

Por si acaso el robot de SPAM está comprobando que campos tiene el formulario, cambiamos su valor por javascript:

<script type="text/javascript">
  document.getElementById('comment_post_antirobot').value = "1";
</script>

En wp-comments-post.php:

Obtenemos el valor del campo oculto, y en caso de no estar establecido o no ser igual a 1, marcamos el comentario como SPAM modificando el contenido:

$comment_antirobot    = ( isset($_POST['comment_post_antirobot']) ) ? trim($_POST['comment_post_antirobot']) : null;

if( empty($comment_antirobot) || $comment_antirobot == '0'){
    // It's SPAM
    $comment_content = '[THIS#IS#SPAAAM!] '.$comment_content;    
}

En wp-includes/comment.php, en el método wp_insert_comment:

Comprobamos si contiene la marca de SPAM en su contenido, y en ese caso lo etiquetamos como SPAM:

if(strpos($comment_content, '[THIS#IS#SPAAAM!]') !== false){
    $comment_approved = 'spam';
}

De momento, el SPAM que está llegando se está etiquetando todo automáticamente como tal. A ver cuanto dura la solución… aunque en esta tengo bastante confianza!

El SPAM contraataca!

[blog] [programación]

El método que implementé contra el SPAM, que comenté en esté articulo, ha estado funcionando bien, pero en los últimos 2 meses ha dejado de cazar todo el SPAM. Los últimos comentarios que están llegando sí que  traen el campo de email cumplimentado, por lo que ya no es efectivo. Dándole vueltas al asunto, se me ha ocurrido hacer mi propia base de datos anti-spam. La idea es que cada vez que llega un nuevo comentario, se comprueba con la base de datos si es SPAM, y en caso que lo sea, añadir sus datos para futuras comprobaciones. El código es el siguiente:

En wp_includes/comment.php en el método wp_insert_comment, justo antes de insertar el comentario hago esta comprobación:

if(!is_email($comment_author_email)){
    $comment_approved = 'spam';
}
else{
    $spam_query = "SELECT * FROM spam_data "
    ."WHERE data = '".$comment_author_IP
    ."' OR data = '".$comment_author_email
    ."' OR data = '".$comment_author_url."'";

    /*$spam_query = "SELECT * FROM spam_data "
    ."WHERE 1";*/

    $spam_results = $wpdb->get_results($spam_query);

    /*if(count($spam_results) <= 0){ // It's SPAM
        $comment_approved = 'spam';
    }*/

    if(count($spam_results) > 0){ // It's SPAM
        $comment_content .= " count: ".count($spam_results);
        $comment_approved = 'spam';

        insert_into_spam_data($comment_author_IP);
        insert_into_spam_data($comment_author_email);
        insert_into_spam_data($comment_author_url);
    }    
}

Y para añadir los datos a la BD he añadido este método:

function insert_into_spam_data($spam_data){
    global $wpdb;

    $spam_query = "SELECT * FROM spam_data "
    ."WHERE data = '".$spam_data."'";

    $spam_results = $wpdb->get_results($spam_query);

    if(count($spam_results) <= 0){
        $wpdb->insert(
            'spam_data',
            array(
                'data' => $spam_data
            ),
            array(
                '%s'
            )
        );
    }
}

Esto debería parar una buena parte del SPAM. El siguiente paso será que cuando yo marque manualmente un comentario como SPAM, sus datos también sean incluidos en la tabla con la información de SPAM. Para ello en el metodo wp_spam_comment, tras marcar el comentario como SPAM, añadimos este código:

insert_into_spam_data($comment->comment_author_IP);
insert_into_spam_data($comment->comment_author_email);
insert_into_spam_data($comment->comment_author_url);

Ahora faltará ver como de efectivas son las medidas. Me estoy planteando introducir algún otro tipo de comprobación anti-spam, viendo que el captcha no está funcionando. Pero eso para otro artículo más adelante 🙂

Remedio casero para la garganta irritada

[recetas]

Debo haber vuelto de las vacaciones con las defensas bajas, porque en apenas unos días he caído en una gripe débil o un resfriado fuerte, nunca los se distinguir 😛

El caso es que siempre me atacan a la garganta, y me la noto irritada, lo que hace que me den ganas de estar tosiendo constantemente. Lo que mejor me va es un remedio tradicional que hemos hecho siempre en casa. Ya no me acordaba como se hacía, así que he pedido instrucciones y las dejo aquí para referencia futura:

Ingredientes

  • 2 manzanas grandes
  • 1 cebolla grande
  • Un puñado de cominos
  • Limones
  • Miel

Elaboración

  1. Limpiamos las manzanas y las cortamos en 4 trozos, quitando el corazón. La cebolla la cortamos también en 8 partes.
  2. Lo metemos todo en una olla, y cubrimos con agua (a mi me suele quedar como media olla de agua), añadimos los cominos y tapamos la olla.
  3. Lo calentamos hasta que empiece a hervir, y después lo dejamos 30 minutos hirviendo a fuego medio.

Uso

  • Solo se toma el caldo, lo demás se queda en la olla para volverlo a calentar en la siguiente toma. Recomiendo usar un colador para servirlo en un vaso.
  • Hay que tomarse el preparado en ayunas, un par de horas después de haber comido o una hora antes de comer. Es especialmente eficaz al levantarse por la mañana y al acostarse por la noche.
  • En un vaso, exprimimos un limón. Rellenamos el resto del vaso con el preparado. Por último añadimos la miel. La cantidad de miel dependerá de cuanto zumo de el limón. No tiene que quedar muy dulce, pero si neutralizar la acidez del limón.
  • Este preparado puede durar un par de días, con 4-5 tomas se acaba el caldo. Si hacia el final ya no queda suficiente caldo para otra toma, se puede añadir agua, dejar hervir un rato y ya tenemos para la última toma.

Realizar una copia de seguridad del Mac en un PC de la misma red

[mac]

La situación es la siguiente. Tengo el MacBook y un PC. En el PC ya lo tengo todo montado para hacer copias de seguridad regularmente, y ahora que he estado haciendo más trabajo en el Mac, quería tener un sistema similar. Estaba haciendo las copias de seguridad del Mac en una memoria USB, pero no me estaba gustando el sistema, por lo que se ocurrió lo siguiente:

Hacer la copia de seguridad del Mac directamente en el PC, en un disco duro del que hago copia de seguridad regularmente, de manera que al hacer la copia del PC, también estoy haciendo una tercera copia de la del Mac.

  1. Compartir una carpeta en el PC.
    En mi caso sigo usando un Windows XP. En el Explorador de Windows vamos a Herramientas -> Opciones de carpeta -> Pestaña “Ver”. Abajo del todo hay una opción llamada “Utilizar uso compartido simple de archivos” que debemos desmarcar.
    Ahora vamos a la carpeta que queremos compartir. Pulsamos con el botón derecho -> Propiedades -> Pestaña “Compartir”. Seleccionamos “Compartir esta carpeta” y pulsamos el botón de “Permisos”. Por defecto “Todos” pueden leer la carpeta. Yo personalmente prefiero quitar este permiso. Después le doy permisos solo a mi usuario. Pulsamos en “Agregar…”, escribes tu nombre en el recuadro, y pulsas en “Comprobar nombres”. Si el nombre es correcto, lo autocompletará con el nombre del equipo. Pulsamos en “Aceptar” y le damos permisos de “Control total”. “Aplicamos” y “Aceptamos” hasta salir de los menús. Debería aparecer una mano en el icono de la carpeta, indicando que se está compartiendo.

  2. Montar la carpeta en el Mac
    Abrimos el Finder y vamos al menú “Ir” -> “Conectarse al servidor…”. En la dirección podemos usar tanto la IP como el nombre del equipo, y quedará algo como smb://nombreDeMiPC y pulsamos en “Conectar”. Aparecerá un listado de los recursos compartidos. Seleccionamos el que queremos montar y “Aceptar”. Nos pedirá el nombre de usuario y contraseña de Windows, los introducimos y el recurso aparecerá en la barra lateral del Finder.

  3. Realizar la copia de seguridad
    La forma más sencilla de hacer esta copia es usando RSYNC. Para ello abrimos el Terminal y escribimos la instrucción:

    rsync -azv /Carpeta/De/Origen/ /Carpeta/De/Destino/
    

    Es importante que la carpeta de destino exista, ya que RSYNC no la crea automáticamente. Las opciones significan lo siguiente:
    z: Permite compresión, lo que hace que la transferencia sea más rápida. Supongo que su utilidad dependerá de la velocidad de la conexión y del tipo de fichero que se envíe.
    v: Verbose, va mostrando por pantalla los ficheros que se van procesando.
    a: Modo de archivo. Activa el modo recursivo (para que se copien las subcarpetas), mantiene los enlaces simbólicos, los permisos y las fechas de creación/modificación.

  4. Automatizarlo todo
    Para que la carpeta del PC se monte automáticamente al iniciar sesión, vamos a “Preferencias del Sistema” -> “Cuentas” -> “Arranque” y pulsamos sobre el signo más "+". Aquí seleccionamos la carpeta compartida y pulsamos sobre Añadir.
    Para evitar tener que escribir las instrucciones del RSYNC cada vez, o tal vez queremos sincronizar varias carpetas, podemos crear un fichero de texto e introducir tantas sentencias de RSYNC como queramos, una por línea. Después guardamos el fichero y de damos como extensión “.command”. Por ejemplo, el mio se llama “backup.command”. Le cambiamos los permisos para que se pueda ejecutar con:

    chmod 744 backup.command
    

    Ahora para realizar la copia de seguridad lo único que tendremos que hacer será dar doble click sobre este fichero.

Recomendaciones de anime - Temporada de primavera 2012

[anime]

Anime de la temporada de primavera 2012

¡Que magnífica temporada de primavera de anime hemos tenido! Mucho anime y del bueno, con algunos tipos de serie de los que se echaban en falta. Mención especial a las series que me han entretenido pese a sus defectos, como Ozuma, Zetman, Kore wa zombie desu ka? OF THE DEAD, Medaka Box, Sankarea, Tasogare Otome x Amnesia, Jormugand y Tsuritama. Como podéis ver, ¡muchas series!

Pero vamos a por las mejores de la temporada.

Lupin the Third: A woman named Mine Fujiko

Lupin me trae gratos recuerdos. Tal vez ya no me acuerdo del argumento de los capítulos, pero se que no me perdía ni uno, y los disfrutaba todos. Esta nueva serie trata sobre los orígenes del grupo, y como se van conociendo todos con Fujiko como nexo de unión. El tono es bastante más serio que la serie original, y lo acompaña un estilo gráfico muy cuidado y acorde con la trama. En ocasiones la historia se vuelve demasiado confusa, pero al final tenemos una nueva versión de Lupin, que aporta nueva profundidad a los personajes y que resulta muy entretenida. Muy recomendable.

Fate/Zero

La precuela de Fate/Stay night no ha decepcionado. Aunque sin duda la trama ha mejorado con respecto a entregas anteriores, no es ese el principal atractivo de la serie. Si disfruto con cada capítulo es por la buena selección de personajes, batallas épicas y el mejor dibujo y animación que se puede encontrar en el anime actual. Puro espectáculo.

Sakamichi no Apollon

La mejor de la temporada y tal vez del año. Una historia de amistad y primeros amores ambientada en los años 60, con el jazz como conductor de la historia. Geniales personajes, con relaciones muy humanas, una trama simple pero excepcionalmente llevada para los pocos capítulos de los que se disponían, y fantástica la música que acompaña a toda la historia. Muy recomendable, incluso para los profanos en el anime.

Cositas útiles para Mac

[mac]

Últimamente estoy volviendo a usar el Mac a diario para trabajar y vuelvo a descubrir cosas nuevas y a enfrentarme a problemas inesperados. Poco a poco voy recopilando cositas útiles para trabajar en Mac y las voy a ir guardando aquí como referencia futura:

Mostrar la ruta completa como título en Finder

Cuando trabajas con cosas como WordPress u OJS, que tienen gran cantidad de carpetas anidadas, es agradable saber donde te encuentras. Por suerte encontré la solución en appleweblog.com. Te vas al Terminal y usas este comando:

defaults write com.apple.finder _FXShowPosixPathInTitle -bool YES

Mostrar los archivos y carpetas ocultos en Finder

Una de las primeras cosas que hago al instalar Windows es permitir ver los ficheros ocultos. En Mac me ha costado un poco más sentir la necesidad, pero al final también me ha tocado hacerlo. La solución es de lifehacker.com. En Terminal hacemos:

defaults write com.apple.finder AppleShowAllFiles TRUE

Y a continuación reiniciamos el Finder con:

killall Finder

Eliminar las carpetas .SVN recursivamente

Siendo que soy muy fan de Subversion, y tengo todo el código versionado, hay veces que es necesario eliminar estas carpetas, como cuando quieres subir alguna carpeta al FTP o hacer una copia de una carpeta. En Windows es sencillo, buscar y borrar. En Mac no es tan inmediato. La solución la encontré en www.michaelhanley.org, donde vuelven a recurrir al Terminal. Nos movemos hasta la carpeta objetivo y ejecutamos lo siguiente:

find ./ -name ".svn" | xargs rm -Rf

Mostrar el escritorio

F11 o fn + F11

Maximizar una ventana con cmd+TAB

Tenemos que apretar la tecla Opción (alt) antes de soltar la tecla cmd.

Cambiar entre ventanas de una misma aplicación

cmd + `

Ver las IPs de todos los equipos conectados a la red

arp -a

“No hay transpondedores para este satélite” en el Illusion M2T

[mundo real]

Hace unos días, sin causa aparente, me desaparecieron la mitad de los canales del TDT. Intenté hacer una nueva búsqueda de canales, y cual fue mi sorpresa al mostrarme el siguiente mensaje:

“No hay transpondedores para este satélite!”

¿Qué es un transpondedor? ¿De qué satélite me habla? ¡Yo solo quiero poder volver a ver las noticias en el canal 24h!

Haciendo una búsqueda rápida por Google, encuentro la solución al primer problema:

Simplemente volver a los ajustes iniciales del deco.

Esto se hace pulsando el botón “MENU” del mando a distancia, seleccionamos la opción de “CONFIGURACIÓN”, introducimos la contraseña, que por defecto es 1111 y por último seleccionamos “CONFIGURACIÓN ORIGINAL”. Después podemos ir al menú de “INSTALACIÓN” y hacer una “BÚSQUEDA AUTOMÁTICA” para volver a llenar la lista de canales.

El segundo problema es como ordenar los canales, y es que no hay ninguna opción en los menús para ello. Por suerte otra búsqueda en Google da la respuesta.

Mientras estamos viendo un canal, debemos pulsar el botón “OK” que nos muestra el listado de canales. Después podemos situarnos sobre el canal que deseamos mover, pulsamos el botón rojo, y con las flechas del mando podemos recolocarlo. Un poco rollo, pero fácil de hacer.

Una reflexión sobre el sonido de los coches eléctricos

[reflexiones]

Hace ya algunas semanas vi este vídeo de como habían dado sonido a la moto eléctrica que usa Domino’s Pizza para repartir, y me pareció tremendamente gracioso.

Unas semanas antes, había visto este vídeo de como Audi estaba diseñando el sonido de sus coches eléctricos, y me pareció una gran idea.

Pero ahora que llega el verano, y toca abrir las ventanas, me doy cuenta de lo ruidosas que llegan a ser nuestras calles. ¿De verdad queremos sustituir el ruido de los motores de combustión por el de altavoces en los vehículos eléctricos? ¿No sería maravilloso abrir las ventanas y solo escuchar el sonido de la gente y el piar de los pájaros? Entiendo que el sonido se añade como medida de seguridad, porque la gente está muy acostumbrada a escuchar llegar a un coche en marcha. Pero no podemos estar dependiendo de este sistema eternamente. Estoy convencido que un sistema de radar, que detectara al peatón y frenara el coche salvaría muchas más vidas que darle ruido a un motor eléctrico. Y para muestra el coche autopilotado de Google:

Concluyendo, NO a los coches eléctricos con sonido artificial, NO a la contaminación acústica en las ciudades, SÍ a mejores sistemas de seguridad en los coches.

Abrir puertos en el router CDE-30364 de ONO

[hardware]

Los señores de ONO han sido tan amables de hacerme una pequeña rebaja del precio y un aumento de la velocidad después de una simple amenaza de darme de baja 😛

Por lo visto, mi viejo modem no sirve para la nueva velocidad, así que me han puesto un estupendo router/nave espacial, que es muy bonito por fuera, pero tiene una interfaz que es una basura (o tal vez es solo problema de que la traducción deja mucho que desear).

Total, que estaba intentando abrir los puertos para el eMule, y me ha costado un rato encontrar donde estaba la opción (que evidentemente no se llama “abrir puertos” :P)

Para la próxima, me dejo aquí apuntado un tutorial que lo explica a las mil maravillas.

Recomendaciones de anime - Temporada de invierno 2012

[anime]

Anime de la temporada de invierno de 2012

Esta temporada de invierno ha sido muy, muy floja. Tenía esperanzas puestas en Black Rock Shooter y en Another, pero no han alcanzado las expectativas, aunque han sido entretenidas de ver. Por suerte tengo para recomendar un par de series de la temporada pasada que han terminado ahora.

Chihayafuru

Es de sobra conocido que los japoneses son capaces de hacer un anime sobre cualquier tema y que resulte interesante. Ya me pasó con Hikaru no Go, un anime sobre el Go (un juego de mesa japones, que me fascina porque los ordenadores todavía no son capaces de ganar a los campeones humanos), y lo han vuelto a conseguir con este anime que gira en torno al Karuta, un juego de cartas ancestral japonés. El ritmo es bueno, las partidas son interesantes, los personajes consiguen que les cojas cariño rápidamente y me ha dejado deseando una segunda temporada.

Mirai Nikki

Sí, es un anime lleno de tópicos, con personajes demasiado encasillados, y algunos giros argumentales que se veían venir a la legua. Sin embargo, ha conseguido mantener la emoción en la mayoría de los capítulos, y me dejó dudando cual sería la conclusión hasta el último momento. Una pena que lo dejen tan abierto. Supongo que tendrá un epílogo en forma de OVA o similar.

Daily Lives of High School Boys

La sorpresa de la temporada. Comedia pura y dura, con carcajadas garantizadas el 80% del tiempo. Vale que algunos chistes no tienen gracia, pero tampoco es fácil acertar todo el tiempo. Este anime me ha hecho reir más que ningún otro en mucho tiempo, por lo que se merece de sobra estar aquí.

Nisemonogatari

La mejor de la temporada (aunque eso no era difícil… ). La secuela de Bakemonogatari me ha decepcionado un poquito. Los diálogos siguen siendo geniales, y los nuevos personajes introducidos están a la altura de los ya conocidos. Pero lo que se dice trama hay poco, y fanservice hay demasiado. También parece que han recortado bastante de las novelas originales, por lo que un par de capítulos más le habrían venido bien para que la segunda historia no resultara tan apresurada. Pese a todo, ya estoy deseando que anuncien la adaptación de la siguiente novela, aunque por suerte este año tendremos la precuela en formato película OH YEAH! 😀