Vulnerabilidades comunes en aplicaciones web desarrolladas con php
Las aplicaciones web construidas con PHP presentan una serie de vulnerabilidades recurrentes cuando no se aplican controles de seguridad adecuados. Estas fallas suelen originarse en el manejo incorrecto de datos de entrada, el uso de funciones peligrosas o configuraciones inseguras del entorno. A continuación se detallan las principales vulnerabilidades observadas en este tipo de desarrollos.
Inyección SQL
La inyección SQL se produce cuando se incorporan datos no validados directamente en consultas a la base de datos. Un ejemplo típico consiste en concatenar valores recibidos a través de parámetros de la URL o formularios dentro de una sentencia SQL.
El uso de consultas preparadas mediante PDO o MySQLi constituye la principal medida de protección. Además, resulta conveniente limitar los privilegios de la cuenta de base de datos empleada por la aplicación.
Cross-Site Scripting (XSS)
Esta vulnerabilidad aparece cuando se genera salida HTML que incluye contenido controlado por el usuario sin el escape correspondiente. Puede manifestarse de forma reflejada, almacenada o basada en el DOM.
La función "htmlspecialchars()" con los parámetros adecuados (ENT_QUOTES y charset UTF-8) permite neutralizar la mayoría de los casos. El empleo de políticas de Content Security Policy refuerza la protección.
Cross-Site Request Forgery (CSRF)
Los ataques CSRF explotan la confianza que el navegador deposita en las cookies de sesión de un usuario autenticado. De esta forma se pueden ejecutar acciones no autorizadas en nombre de la víctima.
La generación de tokens únicos asociados a cada sesión y formulario, junto con la verificación de los encabezados Origin o Referer, reduce significativamente el riesgo. La configuración del atributo SameSite en las cookies de sesión aporta una capa adicional de defensa.
Inclusión de archivos locales y remotos (LFI/RFI)
Cuando se utilizan valores externos en funciones como "include", "require" o "file_get_contents()", existe la posibilidad de cargar archivos no previstos del sistema o de ubicaciones remotas.
La práctica recomendada consiste en evitar por completo la inclusión dinámica basada en datos de entrada. En caso de resultar imprescindible, se deben aplicar listas blancas estrictas y validaciones con "realpath()" para confirmar que la ruta permanece dentro del directorio permitido. La directiva allow_url_include debe permanecer desactivada.
Ejecución de código e inyección de comandos
Funciones como "eval()", "system()", "exec()", "passthru()" o "shell_exec()" permiten la ejecución de código o comandos del sistema operativo cuando reciben datos no controlados.
La eliminación de estas funciones del código y su deshabilitación mediante la directiva disable_functions en php.ini constituyen medidas prioritarias. Cuando su uso resulta inevitable, se requiere el empleo de "escapeshellarg()" y "escapeshellcmd()" junto con listas blancas.
Subida de archivos insegura
La ausencia de validaciones rigurosas en los mecanismos de carga de archivos puede permitir la subida de scripts PHP maliciosos que posteriormente se ejecutan en el servidor.
Resulta necesario comprobar la extensión, el tipo MIME real y el contenido del archivo, almacenarlo fuera del document root con nombres aleatorios y evitar cualquier posibilidad de ejecución directa.
Gestión insegura de sesiones y autenticación
Problemas habituales incluyen identificadores de sesión predecibles, ausencia de regeneración del identificador tras el inicio de sesión y almacenamiento de contraseñas con algoritmos débiles.
El uso de "password_hash()" y "password_verify()" (con bcrypt o Argon2), la llamada a "session_regenerate_id(true)" después de la autenticación y la correcta configuración de los flags HttpOnly, Secure y SameSite en las cookies de sesión mitigan estos riesgos.
Deserialización insegura
La función "unserialize()" aplicada a datos controlados por el usuario puede derivar en la ejecución de código arbitrario, especialmente cuando existen clases con métodos mágicos peligrosos.
Se recomienda sustituir este mecanismo por "json_encode()" y "json_decode()". En caso de mantener el uso de "unserialize()", deben restringirse las clases permitidas.
Exposición de información sensible y software desactualizado
La visualización de errores detallados en entornos de producción, la accesibilidad de archivos de configuración o la presencia de versiones antiguas de PHP y dependencias constituyen vectores frecuentes de ataque.
La configuración display_errors = Off, la protección de directorios sensibles y la actualización periódica del intérprete y las librerías reducen la superficie de exposición.
Consideraciones generales
La seguridad en aplicaciones PHP se basa en el principio de no confiar en ninguna entrada externa y en la aplicación de controles en múltiples capas. El mantenimiento actualizado del entorno, el uso de frameworks modernos que incorporan protecciones por defecto y la realización de revisiones periódicas de código contribuyen a minimizar la aparición de estas vulnerabilidades.