Skip to main content

Lo que debes saber sobre la seguridad del código PHP

Escrito por

4 de septiembre de 2024

0 minutos de lectura

En 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.

$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";

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:

$id = mysqli_real_escape_string($conn, $_GET['id']);
$sql = "SELECT * FROM users WHERE id = $id";

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 SameSite en Lax o Strict para 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:

'cookie' => env(
    'SESSION_COOKIE',
    Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
),
'cookie_secure' => env('SESSION_SECURE_COOKIE', null),
'cookie_same_site' => 'lax',

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:

$id = $_GET['id'];
$result = mysqli_query($con, "SELECT * FROM users WHERE id = $id");

Un atacante puede manipular el parámetro id de la URL para modificar la consulta SQL. Para evitarlo, usa consultas preparadas:

$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("s", $_GET['id']);
$stmt->execute();

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:

<?php
  eval("\$image_url = \"{{ url('public/uploads/trust/".$value.".jpg') }}\";");
?>

<img src="{{ $image_url }}" />

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:

<img src="{{ url('public/uploads/trust/'.$value.'.jpg') }}" />

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:

npm install -g snyk
snyk test

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:

Testing /path/to/your/laravel-project/composer.lock...

✗ High severity vulnerability found in symfony/http-foundation
  Description: Arbitrary Code Execution
  Info: https://snyk.io/vuln/SNYK-PHP-SYMFONY-174006
  Introduced through: symfony/http-foundation@5.4.0
  From: symfony/http-foundation@5.4.0
  From: symfony/http-foundation@5.4.0 > symfony/http-foundation@5.4.0
  From: symfony/http-foundation@5.4.0 > symfony/http-foundation@5.4.0 > symfony/http-foundation@5.4.0
  From: symfony/http-foundation@5.4.0 > symfony/http-foundation@5.4.0 > symfony/http-foundation@5.4.0 > symfony/http-foundation@5.4.0
  Fix: Upgrade to symfony/http-foundation@5.4.1

Tested 123 dependencies for known vulnerabilities, found 1 vulnerabilities, 122 vulnerable paths.

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:

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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:

snyk container test your-docker-image

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.

Leer más

blog feature snyk container custom base recommendations
Blog

Presentamos Evo Agentic AppSec: seguridad al ritmo del desarrollo con IA

El desarrollo impulsado por IA supera el ritmo de los flujos de trabajo de seguridad tradicionales. Agentic AppSec de Snyk usa agentes de seguridad para encontrar, corregir y verificar vulnerabilidades de forma continua, mientras las personas definen el estándar.

feature insights context
Blog

Los ataques autónomos ya están aquí. La defensa debe estar a su altura.

Los atacantes autónomos están reduciendo el tiempo disponible para defenderse. Descubre cómo el descubrimiento, la corrección, la validación y la prevención continuos pueden ayudar a los equipos de seguridad a seguirles el ritmo.

illustration hero ai
Blog

El huracán de la IA ha llegado

La IA está acelerando por igual la creación de software y los ciberataques. Los líderes deben proteger los agentes y el código desde el inicio, aplicar controles en tiempo de ejecución y validar las defensas de forma independiente.