← Back to projects

Jun 2025 ·Full stack developer

Todo App · PHP, jQuery and AJAX

I made the first version in June 2025 as a technical exercise in the BlinkLearning selection process, as part of a job interview to join the company: login, PHP API and a jQuery interface. In October 2026 I audited it, fixed its security flaws and published it on my own server as an open demo, with automated tests.

Screenshot of Todo App · PHP, jQuery and AJAX

The detailed case study is available in Spanish.

Logros

  • Cuatro fallos de seguridad de la versión inicial, corregidos
  • API REST con sesión, token CSRF y validación en servidor
  • 24 pruebas unitarias y 39 pruebas HTTP de extremo a extremo
  • Publicada en mi servidor Apache con un script de despliegue verificado

Contexto

El reto de BlinkLearning pedía una aplicación de tareas con login. La primera versión funcionaba en local, pero al revisarla para publicarla en internet comprobé que no era segura: la API aceptaba escrituras sin sesión, una tarea con código HTML se ejecutaba en el navegador de quien la viera, y el archivo de usuarios y el log (que guardaba la contraseña) se podían descargar por URL.

Mi rol

Desarrollé las dos versiones yo solo, del backend al despliegue. En la segunda usé Claude como asistente para la auditoría y las pruebas; las decisiones de arquitectura y la publicación en el servidor son mías.

Qué construí

Backend en PHP

API REST con los verbos GET, POST, PATCH, PUT y DELETE, respuestas JSON con códigos HTTP correctos y validación de longitud, tipo y codificación. El almacenamiento está detrás de una interfaz: hoy usa la sesión, para que cada visitante tenga sus propias tareas, y pasar a MySQL solo exige otra implementación.

Seguridad

Contraseñas con password_hash, sesión regenerada al entrar y limitada a la ruta de la app, token CSRF en todas las escrituras, Content-Security-Policy estricta y salida siempre escapada. El código y la configuración quedan fuera de la carpeta pública.

Interfaz en jQuery

Lista con detalle lateral, edición, tareas hechas, reordenación arrastrando con jQuery UI y avisos de error claros. Adaptada a móvil y usable con teclado. Sin peticiones a terceros: fuentes, iconos y librerías van incluidas.

Despliegue

  • Pruebas unitarias → respaldo → copia en solo lectura → Alias de Apache con configtest → 39 pruebas HTTP contra el servidor real

Resultado

  • Demo pública en patrickjoel.com/todo-app con cuenta de prueba
  • Imágenes reducidas de unos 2,8 MB a menos de 400 KB
  • Integración continua en GitHub Actions con PHP 8.0 y 8.3

Qué demuestra

  • Desarrollo backend en PHP sin framework, con API REST y sesiones
  • Criterio de seguridad web: XSS, CSRF, exposición de archivos y contraseñas
  • Revisión crítica de código propio antes de publicarlo
  • Despliegue y configuración de Apache en un servidor Linux propio

Nota

Es un proyecto deliberadamente pequeño: muestra cómo trabajo, no el tamaño de la aplicación.

Looking for someone to do this in your company?