Seguridad de aplicaciones PHP: top 10 vulnerabilidades para principiantes

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 para principiantes

\n

PHP sigue siendo uno de los lenguajes más populares para el desarrollo web, pero su flexibilidad a menudo se convierte en vulnerabilidades si no se siguen las reglas básicas de seguridad. Según OWASP, la mayoría de los ataques ocurren debido a 10 errores típicos que cometen los desarrolladores principiantes. En este artículo analizaremos cada vulnerabilidad con ejemplos de código reales y mostraremos cómo proteger su aplicación.

\n\n

1. Inyección SQL (SQL Injection)

\n

El ataque más común. El atacante inyecta código SQL malicioso a través de la entrada del usuario.

\n

Código vulnerable:

\n
<?php\n$id = $_GET['id'];\n$query = "SELECT * FROM users WHERE id = $id";\n$result = mysqli_query($conn, $query);\n?>
\n

Protección: Utilice consultas preparadas (prepared statements):

\n
<?php\n$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");\n$stmt->bind_param("i", $_GET['id']);\n$stmt->execute();\n$result = $stmt->get_result();\n?>
\n\n

2. XSS (Cross-Site Scripting)

\n

Inserción de código JavaScript en la página a través de datos no validados.

\n

Código vulnerable:

\n
<?php\necho "Hola, " . $_GET['name'];\n?>
\n

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

\n
<?php\necho "Hola, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');\n?>
\n\n

3. CSRF (Cross-Site Request Forgery)

\n

Ataque en el que el usuario realiza acciones no deseadas en su propio nombre.

\n

Código vulnerable:

\n
<form action="/delete.php" method="POST">\n    <input type="submit" value="Eliminar cuenta">\n</form>
\n

Protección: Agregue un token CSRF:

\n
<?php\nsession_start();\n$_SESSION['csrf_token'] = bin2hex(random_bytes(32));\n?>\n<form action="/delete.php" method="POST">\n    <input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">\n    <input type="submit" value="Eliminar cuenta">\n</form>
\n\n

4. Almacenamiento inseguro de contraseñas

\n

Almacenamiento de contraseñas en texto plano o con hashes obsoletos (MD5, SHA1).

\n

Código vulnerable:

\n
<?php\n$password = md5($_POST['password']);\n// o\n$password = sha1($_POST['password']);\n?>
\n

Protección: Utilice password_hash() y password_verify():

\n
<?php\n$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);\n// Verificación:\nif (password_verify($input_password, $hash)) {\n    echo "Contraseña correcta";\n}\n?>
\n\n

5. Trabajo inseguro con archivos (Inclusión de archivos local/remota)

\n

Inclusión de archivos a través de la entrada del usuario sin verificación.

\n

Código vulnerable:

\n
<?php\ninclude($_GET['page'] . '.php');\n?>
\n

Protección: Utilice una lista blanca de archivos permitidos:

\n
<?php\n$allowed_pages = ['home', 'about', 'contact'];\n$page = $_GET['page'] ?? 'home';\nif (in_array($page, $allowed_pages)) {\n    include($page . '.php');\n} else {\n    include('404.php');\n}\n?>
\n\n

6. Configuración incorrecta de sesiones

\n

Uso de identificadores de sesión predecibles o falta de regeneración.

\n

Código vulnerable:

\n
<?php\nsession_start();\n$_SESSION['user_id'] = $user_id;\n// La sesión no se regenera después del inicio de sesión\n?>
\n

Protección:

\n
<?php\nsession_start();\nsession_regenerate_id(true); // Regenerar ID después del inicio de sesión\n$_SESSION['user_id'] = $user_id;\n?>
\n\n

7. Validación de entrada insuficiente

\n

Confiar en cualquier dato del usuario.

\n

Có

Blogs

Book Recommendations