Burdjia

Cómo hacer un sistema CAPTCHA propio

por el Profesor Momar

Mis dos webs tienen sendos formularios con los cuales cualquiera puede enviarme un mensaje.  El funcionamiento es muy sencillo:  cuando el servidor recibe el mensaje, comprueba que contiene todos los datos y que hay un correo correctamente indicado, y acto seguido me envía un mensaje con todo.  Pero claro, fue poner en marcha estos formularios y empecé a recibir SPAM.  Bueno, inicialmente recibí varios intentos de juankeo (estoy seguro de haber escrito algo sobre dar las gracias a los piratas turcos por poner a prueba la web, pero ahora no lo encuentro), el SPAM tardó un poquito en llegar, pero llegó.

La solución de añadir un CAPTCHA la barajé desde el principio, pero no me apetecía tener que meter una biblioteca de terceros ya que podía complicar las cosas.  No uso un framework al uso ni ninguna biblioteca extra, así que tendría que instalarlo y configurarlo y hacer pruebas y… paso.

Pero hace cosa de un mes hice un trámite para la TSS y me encontré con un sistema a priori muy simple pero ingenioso.  La página te presenta una lista de palabras y tienes que escribir en un campo aquella que pertenece a una categoría concreta.  Esto me recordó, también, a la pregunta de seguridad de la wiki de Free Pascal, la cual pregunta por el resultado de ejecutar una instrucción Pascal.  Así que me decidí, finalmente, a programarlo.

Cómo funciona

Primero, tenemos una tabla con dos campos:  Palabras y Categorías.  Cada palabra tiene una única categoría y no debe haber ambigüedades, lo cual limita un poco el número de palabras pero facilita las cosas luego.

Cuando se genera el formulario, se selecciona una palabra de forma aleatoriamente, que será la respuesta.  Luego se seleccionan otras tres que pertenezcan a una categoría distinta a la seleccionada.  A continuación creo un código hash combinando la palabra de respuesta con la fecha POSIX para tenerla con referencia y almaceno la palabra de respuesta junto con el hash y la fecha.  Finalmente se genera el formulario mostrando todas las palabras, desordenadas, y la pregunta, con el hash en un campo oculto.

Cuando se recibe el formulario, se eliminan del almacén todas las respuestas viejas para que no se acumulen y se comprueba si la respuesta enviada es correcta.  Si no lo es, se genera otro hash diferente.

Podéis probarlo vosotros mismos.

El resultado

Sé que el sistema no es perfecto, y seguramente que algún bot sería capaz de romperlo con facilidad, sin embargo desde que está activo he dejado de recibir SPAM.  ¿Por cuánto tiempo?  Pues no lo sé.

De todas formas me parece bastante absurdo que me envíen SPAM cuando es más que evidente que tiene un retorno del 0%.  Incluso cuando lo recibía, no lo leía, porque era fácilmente identificable: en el asunto se limitaban a poner una cadena de caracteres aleatoria.

En conclusión, ha sido muy fácil quitarse esta molestia de encima, así que si tienes este problema de SPAM no quites el formulario, símplemente añade un CAPTCHA, aunque sea simple como el mío, y asunto arreglado.

Tener las herramientas adecuadas

por el Profesor Momar

Es algo que ya he mencionado anteriormente, aunque ahora no son las mismas circunstancias.

Ayer mismo terminé un ciclo en el proyecto Allegro.pas (¡por fin!).  En este último empujón me ha dado por pensar en lo importante que es tener herramientas adecuadas, y me he dado cuenta de cómo he perdido el tiempo debido a algunas carencias.

Por ejemplo, para solucionar la compatibilidad con Delphi en varias ocasiones he tenido que hacer un mismo cambio (o conjunto de cambios) en muchos archivos, como cambiar una variable de configuración de todos los archivos de proyecto o cambiar un tipo de dato en los ejemplos.  En el peor caso el proceso sería:

  1. Cargar archivo.
  2. Buscar el punto en el que hacer el cambio.
  3. Hacer el cambio.
  4. Guardar archivo.
  5. Repetir desde 1. hasta que todos los cambios estén hechos.

Sí, los editores de código e IDEs incluyen opciones de "Buscar y reemplazar" que pueden ayudar, incluso a través de varios archivos, pero en ocasiones no es tan simple como buscar y reemplazar:  a veces no son exactamente el mismo en todos los archivos sino que depende de ciertas condiciones.

Afortunadamente me di cuenta enseguida del problema, y vi que era una ocasión de poner a prueba BAScript.  Y dio el tipo, ¡vaya si lo dio!

Creé un programa que permitía ejecutar un guion a un grupo de archivos, y añadí multitud de funciones de búsqueda y manipulación de textos.  Empecé con guiones como el siguiente, que se asegura de que, en un archivo de proyecto, el nombre del proyecto y el del archivo principal coinciden, lo que me permitía copiar el archivo de proyecto sin tener que abrir Lazarus ni Delphi para crear y configurar uno nuevo casi exactamente igual a los anteriores:

; Actualiza el nombre del proyecto.

; Obtiene el nombre del archivo.
FileName			; Nombre con extensión.
Filename CALL:StrLen 5 -	; Posición del punto.
6				; Longitud extensión + punto
CALL:RemoveStr $FileName	; Elimina extensión.

'ex_audio_simple' FileName CALL:StrPos 0 > IF GOTO:end FI

:loop
'ex_audio_simple' 0 CALL:FindTextLine
DUP IF
; Se encontró.
  #Linea
  Linea CALL:GetTextLine
  'ex_audio_simple' FileName CALL:ReplaceStr
  Linea CALL:SetTextLine
  GOTO:loop
FI
DROP

:end

Este es de los guiones más simples que utilicé.  El más largo es otro que se asegura de que diversas variables de configuración de los proyectos tienen los valores adecuados, además de añadir algunas unidades a los mismos en caso de ser necesario.  No un simple "Buscar y reemplazar" como el que veis, sino otro que comprueba condiciones previas y toma decisiones de si hacerlo o no hacerlo. 80 líneas, más o menos.

Este programa me ha resultado tan útil que seguramente lo añada como ejemplo en la próxima versión de BAScript, que la habrá.

Pero antes, también me ha salvado un poco otro de mis proyectos:  mlsde, ahora mismo sólo una prueba de concepto que hice hace algunos años para probar algunas ideas para un IDE tras descubrir la existencia de Sublime Text con idea de añadir guiones (scripts) al estilo de los viejos Turbo de Borland.

Normalmente trabajo con Vim y me funciona bastante bien, pero escribiendo el tutorial de la web eché en falta una forma más simple de moverme entre diferentes archivos, aparte de que los scripts al estilo Turbo me hubieran venido de perlas también.  Decidí usar mlsde a ver qué tal, y aunque me hizo la navegación entre archivos más fácil, lamenté no tener terminado el motor de guiones.

En conclusión, tengo que hacerme con mejores herramientas de trabajo para ser más productivo.  Evidentemente hablo de mejorar mlsde, ¿o qué os creíais? :)

Malas formas en la web

por el Profesor Momar

He recibido, a través del formulario de contacto de la web, un mensaje anónimo llamándome cobarde porque en la web no tengo nada sobre Lazarus (cuando Burdjia Components está diseñado especialmente para él) pero uso su foro.

La verdad es que no entiendo por qué me llama cobarde, y me molesta que lo haga sin decir quién es ni dar oportunidad de réplica.  Eso sí me parece cobarde.

He revisado la bitácora y, aparte de que llevo más de un año sin escribir nada por razones que no voy a contar por personales, tiene razón en que no hay mucho referente al proyecto Lazarus.  La etiqueta Lazarus sólo tiene un artículo (ahora dos) que además no tiene mucha relación con el IDE de Pascal.  Sin embargo la etiqueta Pascal tiene 20 artículos.

Esto me ha hecho pensar.  Como he dicho, llevo mucho sin escribir en la bitácora, y no es por falta de conocimientos ni ganas.  Digamos que este mensaje ha sido un rebulsivo, el empuje que necesibata para terminar de decidirme a continuar con la bitácora (como ya llevo un tiempo haciendo con otro proyecto).  Claro que tampoco voy a prometer nada, que me conozco, pero algo escribiré.

Aun así, está muy feo eso de acusar a alguien de algo amparado en el anonimato de Internet.

Notas al pie:

La lista de etiquetas está más abajo (lo que me recuerda el desbarajuste del diseño de páginas de la bitácora) pero usa este enlace para que no tengas que buscar.

Aquí

Planificando Gesbit 3.0

por el Profesor Momar

Ya sé que este proyecto parece el Guadiana, que aparece y desaparece, pero es lo que pasa cuando el tempo libre escasea y hay que repartirlo entre vida social, aficiones y proyectos varios.

Esta vuelta al proyecto será algo más larga que las anteriores principalmente por necesidad.  Resulta que me puse a reparar el estilo y las plantillas de este blog y descubrí que Gesbit no funciona en mi servidor local de purebas porque tengo instalado PHP 7 y Gesbit utiliza varias bibliotecas que ya no están disponibles en esta versión.  Podría ser algo fácil de arreglar, quizá un poco más o menos que el problema con preg_replace pero teniendo en cuenta que al menos una de las cosas que no funciona es la conexión con la base de datos y la cosa sólo puede ir a peor, casi que prefiero no arriesgarme a intentar arreglarlo para descubrir que hay más cosas que no funcionan (y seguramente será así).

Por tanto, en vez de ir al rebufo lo mejor es tirar para delante.  Ya tengo buena parte de los requisitos y carencias localizadas y redactadas (mucho hace ya tiempo), pero no empezaré a escribir código pronto.  Además de terminar de redactar y concretar estos requisitos tengo que hacer unos cuantos esquemas e indagaciones, de lo contrario no conseguiré que funcione.

Versión 5.2.β.0 de Allegro.pas publicada

por el Profesor Momar

Desde hace unos meses he estado utilizando buena parte de mi tiempo libre trabajando en Allegro.pas, una biblioteca que permite utilizar Allegro con compiladores Pascal.  Finalmente hace unos días publiqué una nueva versión, la 5.2.β.0.  La principal (y casi la única) novedad es que ha vuelto la compatibilidad con Delphi.

Lo cierto es que la compatibilidad con Delphi estuvo desde el principio.  Allegro comparte variables a través de su DLL, algo que Delphi no permite hacer.  Para conseguir que funcionara creé una DLL extra con la que obtener los punteros a dichas variables.  Esto hacía las cosas bastante complicadas tanto de mantener como de usar (nunca es cómodo usar punteros en Pascal, mucho menos con Delphi) así que terminé eliminando la compatibilidad con Delphi, siendo la última versión que la tuvo la 4.2.2.  Sin embargo, dado que la rama 5 eliminaba las variables de la API, siempre he prometido que la compatibilidad volvería algún día.

Y por fin esa compatibilidad ha vuelto.  No es una compatibilidad del 100% ya que algún ejemplo no funciona en Delphi, y lo que funciona sólo se ha comprobado con la versión Delphi 10.2 Tokio Starter Edition, pero la mayor parte de Allegro funciona así que puede utilizarse para hacer juegos con Delphi.  Buena parte de este hito ha sido gracias al trabajo de Gregor A. Cieslak, cuyo trabajo puede verse en GitHub.

Otra de las novedades ha sido añadir archivos de proyecto para Lazarus de todos los ejemplos, algo que me habían pedido desde Pascal Game Development.  Espero que facilite lascosas.

Se puede bajar los paquetes desde la página de descargas.  Hace ya algún tiempo creé un proyecto en GitHub, pero no tengo ni idea de cómo funciona, así que no se parece a ningún otro proyecto de los que he visto en GitHub y seguramente no sea muy útil.  Si alguien tiene algún consejo sobre este o cualquier otro tema, que no dude en hacermelo saber.

En cuanto al futuro, todavía queda trabajo antes de poder quitar esa β de la numeración (al menos ya que quitado el α), corregir las incompatibilidades con Delphi, añadir nueva funcionalidad que está pendiente y completar la documentación.  También debería hacer algo con la web del proyecto, que es un poco desastrosa.