Lo que debes saber sobre la seguridad del código PHP
4 de septiembre de 2024
0 minutos de lecturaEn el desarrollo web, PHP es un lenguaje de scripting muy utilizado. Debido a su popularidad, es fundamental comprender los posibles riesgos de seguridad asociados con PHP y las medidas para mitigarlos. Ya sea que implementes aplicaciones CMS con WordPress o crees aplicaciones empresariales con el framework Laravel para PHP, es fundamental que los desarrolladores comprendan la importancia de la seguridad de PHP y el impacto empresarial de algunas vulnerabilidades notables del intérprete de PHP.
¿Por qué es importante protegerse de las vulnerabilidades de seguridad de PHP? Debido a su popularidad y amplio uso, PHP suele ser un objetivo para hackers y actores maliciosos. Las vulnerabilidades de seguridad pueden aparecer por diversos motivos, como malas prácticas de programación, falta de sanitización de los datos ingresados por los usuarios y versiones desactualizadas.
Por ejemplo, imaginemos que se usa una entrada de usuario sin sanitizar en una consulta SQL. Esto puede provocar una inyección SQL, una vulnerabilidad común.
En el código que se muestra, un usuario malicioso puede manipular el parámetro id de la URL para realizar una inyección SQL. Para evitarlo, es fundamental sanitizar las entradas de usuario, por ejemplo, con mysqli_real_escape_string o consultas preparadas:
Las vulnerabilidades de seguridad en tus aplicaciones PHP pueden tener un impacto profundo en tu negocio. Pueden provocar filtraciones de datos y, como consecuencia, multas cuantiosas por incumplir normativas de protección de datos, como el RGPD y la CCPA. Una filtración también puede erosionar la confianza de los clientes y provocar una pérdida de negocio. Además, los costos de corrección pueden ser elevados, sobre todo si las vulnerabilidades se detectan tarde en el ciclo de desarrollo. Por eso es fundamental priorizar la seguridad desde el inicio del proyecto.
Preguntas frecuentes relacionadas
¿Cómo puedo proteger mi aplicación PHP de las vulnerabilidades?
Valida y sanitiza siempre las entradas de los usuarios. Usa consultas preparadas con parámetros para prevenir la inyección SQL. Usa las versiones más recientes de PHP y sus frameworks, ya que incluyen parches de seguridad para vulnerabilidades conocidas. Usa regularmente herramientas como Snyk para analizar tu código, las dependencias de tu aplicación y la configuración de tu infraestructura en la nube en busca de vulnerabilidades. Sigue prácticas de codificación segura.
¿Por qué es importante la seguridad de PHP?
La seguridad de PHP es fundamental porque una aplicación PHP vulnerable puede provocar filtraciones de datos, pérdida de la confianza de los clientes y multas regulatorias. Como PHP suele usarse para desarrollar aplicaciones web, es un blanco frecuente de los atacantes. Asegurarte de que tu código PHP sea seguro ayuda a proteger los datos de tus usuarios y tu negocio.
¿Qué es un escáner de vulnerabilidades de PHP?
Un escáner de vulnerabilidades de PHP es una herramienta que analiza automáticamente tu código PHP para detectar vulnerabilidades de seguridad conocidas. Algunos ejemplos son Snyk y el verificador de seguridad integrado de Composer. Estas herramientas pueden ayudarte a identificar y corregir problemas de seguridad en tus aplicaciones PHP.
¿Qué es un aviso de seguridad de PHP?
Un aviso de seguridad de PHP es un anuncio público sobre una vulnerabilidad de seguridad en un componente de PHP. Incluye detalles sobre la vulnerabilidad, su posible impacto y cómo corregirla. PHP.net y otros sitios web relacionados con PHP suelen publicar estos avisos. Snyk también mantiene una base de datos de avisos de seguridad de PHP basada en el administrador de paquetes Composer.
Vulnerabilidades de seguridad comunes en PHP
Exploremos algunas vulnerabilidades de seguridad comunes en PHP y conozcamos recursos útiles sobre seguridad para desarrolladores que ayudan a mitigarlas.
Cookies y administración de sesiones
Las cookies y las sesiones son aspectos fundamentales del desarrollo web, ya que nos permiten mantener el estado entre solicitudes. Sin embargo, si no se administran correctamente, pueden generar graves fallas de seguridad.
En PHP, especialmente al usar un framework web como Laravel, es importante proteger las cookies y los datos de sesión al administrar la autenticación. Estos son algunos consejos:
Usa siempre cookies seguras con el atributo HttpOnly.
Configura el atributo
SameSiteenLaxoStrictpara evitar ataques de falsificación de solicitudes entre sitios (CSRF).Regenera el ID de sesión después de iniciar sesión o cambiar la contraseña para evitar ataques de fijación de sesión.
En Laravel, puedes establecer estas configuraciones en el archivo config/session.php:
Consulta más pautas de seguridad web sobre cómo proteger aplicaciones Laravel para ayudar a prevenir vulnerabilidades de seguridad de PHP.
Inyección SQL
La inyección SQL es una técnica de inyección de código que los atacantes usan para explotar vulnerabilidades en las consultas a la base de datos de una aplicación web. Puede permitir el acceso no autorizado a datos confidenciales y la posible manipulación o eliminación de datos.
Considera el siguiente código PHP vulnerable:
Un atacante puede manipular el parámetro id de la URL para modificar la consulta SQL. Para evitarlo, usa consultas preparadas:
Para obtener más información sobre la inyección SQL y la seguridad de PHP, consulta este curso gratuito sobre seguridad de PHP.
Inyección de código
La inyección de código es otra vulnerabilidad común que permite a un atacante insertar y ejecutar código arbitrario en tu aplicación. En PHP, esto suele ocurrir cuando se pasan entradas de usuario a la función eval() o a llamadas al sistema sin validarlas ni sanitizarlas adecuadamente.
Veamos el siguiente caso de uso en el contexto de un proyecto PHP con Laravel, donde un desarrollador enfrentó un reto al intentar generar dinámicamente la URL de una imagen dentro de una plantilla Blade. El objetivo era mostrar una imagen cuya ruta se construía con contenido variable y la función auxiliar de URL de Laravel. Para lograrlo, el desarrollador usó la función eval() de PHP de la siguiente manera:
La intención del desarrollador era crear una forma flexible de generar URL de imágenes a partir de la variable $value. Sin embargo, el uso de eval() plantea importantes riesgos de seguridad, como:
Inyección de código: Si un atacante puede influir en el contenido de la cadena que se pasa a
eval(), podría ejecutar código PHP arbitrario en el servidor. Esto puede dar lugar a accesos no autorizados, filtraciones de datos y otros problemas de seguridad.Depuración y mantenimiento complejos: El código ejecutado mediante
eval()suele ser más difícil de depurar y mantener, ya que puede ocultar la lógica y el flujo de la aplicación. Esta complejidad puede introducir, sin querer, fallas de seguridad o errores adicionales.
El desarrollador podría haber usado un enfoque más seguro y fácil de mantener, aprovechando el motor de plantillas Blade de Laravel para generar la URL de la imagen:
Este método evita por completo el uso de eval() y aprovecha las funciones integradas de Laravel para generar contenido dinámico de forma segura. Asegúrate de leer sobre otras formas de prevenir la inyección de código PHP.
Prueba las dependencias de PHP Composer para detectar vulnerabilidades de seguridad
Un aspecto de la seguridad de las aplicaciones que suele pasarse por alto son las dependencias de terceros. En PHP, usamos Composer para administrar estas dependencias. Es fundamental revisarlas con regularidad para detectar vulnerabilidades de seguridad conocidas.
Puedes usar herramientas como Snyk para analizar automáticamente tus dependencias de Composer y detectar vulnerabilidades conocidas. A continuación, te explicamos cómo instalar y usar Snyk:
Al ejecutar el comando snyk test en el directorio raíz para comprobar si tus dependencias de Composer tienen vulnerabilidades de seguridad, podrías ver un resultado como este:
Te recomiendo leer más sobre cómo probar tus dependencias de PHP Composer para detectar vulnerabilidades de seguridad con Snyk.
Vulnerabilidades de seguridad en el intérprete de PHP
Aunque sigas prácticas de programación segura, las vulnerabilidades del propio intérprete de PHP pueden exponer tus aplicaciones a riesgos. Por ejemplo, se reportaron varias vulnerabilidades en el paquete PHP 8.2 de Debian, que puedes consultar en la base de datos de Snyk.
Algunas de las vulnerabilidades notables del intérprete de PHP son:
CVE-2023-0568: asignación de recursos sin límites ni control de velocidad.
CVE-2023-3823: inyección de entidades externas XML (XXE).
CVE-2023-0662: agotamiento de recursos.
Estas vulnerabilidades podrían permitir que un atacante ejecute código arbitrario o provoque una DoS (denegación de servicio). Por eso, es esencial mantener PHP actualizado y comprobar con frecuencia si se han reportado vulnerabilidades en el intérprete de PHP que usas.
¿Cómo ayuda Snyk a proteger PHP?
Snyk es una potente plataforma de seguridad diseñada para desarrolladores que les ayuda a identificar y corregir vulnerabilidades de seguridad en sus aplicaciones PHP. Ofrece una amplia base de datos de vulnerabilidades conocidas y puede analizar automáticamente tu proyecto para detectarlas. Además, Snyk ofrece solicitudes de incorporación de cambios con correcciones automatizadas, lo que puede ahorrarles mucho tiempo a los desarrolladores al corregir las vulnerabilidades identificadas.
¿Cuáles son las vulnerabilidades de PHP más comunes?
Hay varias vulnerabilidades comunes de PHP que los desarrolladores deben conocer. Entre ellas se incluyen:
Ataques de inyección: Ocurren cuando un atacante puede insertar código SQL o scripts maliciosos en tu código PHP. Un ejemplo es la inyección SQL, en la que el atacante manipula consultas SQL para obtener acceso no autorizado a la base de datos.
Secuencias de comandos entre sitios (XSS): Esto ocurre cuando un atacante puede inyectar scripts maliciosos en páginas web que ven otros usuarios. Luego, los scripts pueden robar datos confidenciales de los usuarios.
Falsificación de solicitudes entre sitios (CSRF): En este tipo de ataque, un atacante engaña a una víctima para que envíe una solicitud maliciosa.
Vulnerabilidades de inclusión de archivos: Ocurren cuando un atacante puede incluir un archivo de un servidor remoto, lo que a menudo provoca la ejecución de código en el servidor.
¿Qué sigue para la seguridad de PHP?
Una forma de mantenerte al día sobre las vulnerabilidades del intérprete de PHP es conectar tus repositorios Git a Snyk. Así, Snyk supervisará automáticamente tus dependencias para detectar vulnerabilidades y te notificará cuando se reporten nuevas. En particular, quizá implementes tus aplicaciones PHP con Docker y otras tecnologías de contenedores. Es fundamental supervisar las imágenes de tus contenedores para detectar vulnerabilidades, ya que estas imágenes de Docker incluyen el intérprete de PHP y otras dependencias que podrían ser vulnerables.
Si usas Docker, puedes analizar tus imágenes de contenedores Docker con Snyk para detectar vulnerabilidades conocidas. Ejecuta lo siguiente:
Sigue las prácticas recomendadas de James Walker para crear un Dockerfile listo para producción para aplicaciones PHP y la guía de Neema Muganga sobre cómo proteger contenedores PHP para proteger las imágenes de tus contenedores PHP.
La protección contra las vulnerabilidades de seguridad de PHP no debe ser algo que se deja para después, sino una parte integral de tu proceso de desarrollo. Esto implica aplicar prácticas de programación segura, instalar actualizaciones con regularidad y estar atento a las vulnerabilidades reportadas en el ecosistema de PHP.
¿Cómo puedo aprender más sobre la seguridad de PHP?
Para aprender más sobre la seguridad de PHP, puedes seguir los tutoriales en línea del blog de Snyk y tomar lecciones breves y gratuitas en línea en Snyk Learn. Sitios web como OWASP también ofrecen recursos completos sobre seguridad de aplicaciones web, incluido PHP.
Protege tu código mientras desarrollas
Snyk analiza tu código para detectar problemas de calidad y seguridad, y te ofrece recomendaciones para corregirlos directamente en tu IDE.



