Seguridad de aplicaciones PHP: top 10 vulnerabilidades en la práctica

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Seguridad de aplicaciones PHP: top 10 vulnerabilidades en la práctica

PHP sigue siendo uno de los lenguajes más populares para el desarrollo web, pero su flexibilidad a menudo conlleva serios problemas de seguridad. Según OWASP, el 80% de los ataques a aplicaciones web están relacionados con vulnerabilidades que se pueden prevenir en la etapa de escritura del código. En este artículo, analizaremos las 10 vulnerabilidades más comunes de aplicaciones PHP con ejemplos de código reales y métodos de protección. El material será útil tanto para desarrolladores principiantes como experimentados.



1. Inyecciones SQL (SQL Injection)

La vulnerabilidad más peligrosa y común. El atacante introduce código SQL a través de campos de entrada, obteniendo acceso a la base de datos.

Código vulnerable:

$username = $_POST['username'];$query = "SELECT * FROM users WHERE username = '$username'";

Ataque: La entrada ' OR '1'='1 convierte la consulta en SELECT * FROM users WHERE username = '' OR '1'='1', devolviendo todos los usuarios.

Protección: Use consultas preparadas (prepared statements) con PDO:

$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");$stmt->execute(['username' => $_POST['username']]);


2. XSS (Cross-Site Scripting)

El atacante inyecta código JavaScript que se ejecuta en el navegador de la víctima. Existen tres tipos: reflejado, almacenado y basado en DOM.

Código vulnerable (XSS almacenado):

echo "<div>" . $comment . "</div>";

Protección: Escape la salida con htmlspecialchars():

echo "<div>" . htmlspecialchars($comment, ENT_QUOTES, 'UTF-8') . "</div>";

Para contenido HTML, use bibliotecas como HTML Purifier.



3. CSRF (Cross-Site Request Forgery)

El ataque obliga a un usuario autenticado a realizar una acción no deseada en el sitio, como cambiar la contraseña o transferir fondos.

Protección: Implemente tokens CSRF:

// Generación del token$_SESSION['csrf_token'] = bin2hex(random_bytes(32));

// En el formularioecho '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';

// Verificaciónif ($_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('Ataque CSRF detectado');}


4. Path Traversal (Recorrido de directorios)

El atacante manipula las rutas de archivos para acceder a archivos del sistema (/etc/passwd, etc.).

Código vulnerable:

$file = $_GET['file'];include("pages/" . $file);

Protección: Use listas blancas o la función basename():

$allowed = ['home', 'about', 'contact'];$file = basename($_GET['file']);if (in_array($file, $allowed)) {    include("pages/$file.php");} else {    die('Archivo no permitido');}


5. Vulnerabilidades de carga de archivos (File Upload Vulnerabilities)

El atacante sube un script PHP en lugar de una imagen, obteniendo acceso remoto al servidor.

Protección:

  • Verifique el tipo MIME del archivo: $_FILES['file']['type']
  • Use finfo para determinar el tipo real
  • Prohíba la ejecución de scripts en la carpeta de subidas mediante .htaccess
  • Genere nombres de archivo únicos: md5(uniqid()) . '.jpg'
$finfo = finfo_open(FILEINFO_MIME_TYPE);$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);$allowed = ['image/jpeg', 'image/png'];if (!in_array($mime, $allowed)) {    die('Tipo de archivo no permitido');}


6. Fijación de sesión (Session Fixation)

El atacante impone al usuario un identificador de sesión conocido para interceptarla después de la autenticación.

Protección: Después de una autenticación exitosa

Blogs

Book Recommendations