Principales errores de desarrolladores PHP principiantes: de la A a la Z
PHP es uno de los lenguajes más populares para el desarrollo web, pero su flexibilidad y bajo umbral de entrada a menudo juegan una mala pasada a los novatos. Muchos desarrolladores principiantes cometen los mismos errores que conducen a vulnerabilidades, rendimiento lento del sitio o simplemente código ilegible. En este artículo analizaremos los principales errores de los desarrolladores PHP, desde sintácticos hasta arquitectónicos, y mostraremos cómo corregirlos.
1. Errores de seguridad: inyecciones y XSS
Inyecciones SQL
El error más común y peligroso es insertar datos del usuario directamente en una consulta SQL. Nunca hagas esto:
<?php// ❌ PELIGROSO: vulnerable a inyecciones SQL$id = $_GET['id'];$query = "SELECT * FROM users WHERE id = $id";$result = mysqli_query($conn, $query);?>Un atacante podría pasar id=1; DROP TABLE users-- y destruir la base de datos. Siempre usa prepared statements:
<?php// ✅ SEGURO: prepared statement$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");$stmt->bind_param("i", $_GET['id']);$stmt->execute();$result = $stmt->get_result();?>Ataques XSS (Cross-Site Scripting)
Mostrar datos del usuario sin escape es otro error clásico de los desarrolladores PHP:
<?php// ❌ PELIGROSO: vulnerable a XSSecho "Hola, " . $_GET['name'];?>Si el usuario pasa ?name=<script>alert('XSS')</script>, el script se ejecutará. Usa la función htmlspecialchars():
<?php// ✅ SEGURO: escape HTMLecho "Hola, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');?>2. Problemas con tipos de datos y comparación
Conversión implícita de tipos
PHP es un lenguaje de tipado débil, y los novatos a menudo se encuentran con comportamientos inesperados:
<?php// ❌ ERROR: conversión implícitavar_dump("123abc" == 123); // true! La cadena se convierte a númerovar_dump(0 == "string"); // true! La cadena se convierte a 0?>Usa la comparación estricta === en lugar de ==:
<?php// ✅ CORRECTO: comparación estrictavar_dump("123abc" === 123); // falsevar_dump(0 === "string"); // false?>Confusión entre empty() y isset()
Muchos desarrolladores PHP principiantes no entienden la diferencia entre estas funciones:
<?php$var = 0;// ❌ ERROR: empty() considera 0 como valor vacíoif (empty($var)) { echo "La variable está vacía"; // ¡Mostrará este mensaje!}
// ✅ CORRECTO: isset() solo verifica la existenciaif (isset($var)) { echo "La variable existe y es igual a " . $var; // Mostrará "0"}?>3. Malas prácticas con formularios y datos
Ignorar la validación en el servidor
Los desarrolladores principiantes a menudo confían solo en la validación del lado del cliente (JavaScript), pero un atacante puede enviar una solicitud directamente al servidor. Siempre verifica los datos en el lado del servidor:
<?php// ❌ ERROR: sin validación en el servidor$email = $_POST['email'];mail($email, "Asunto", "Mensaje"); // Se puede enviar un correo a cualquier dirección
// ✅ CORRECTO: validamos el email$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);if ($email === false) { die("Email no válido");}mail($email, "Asunto", "Mensaje");?>Manejo incorrecto de la subida de archivos
Otro error típico de los desarrolladores PHP es guardar archivos sin verificar la extensión y el tipo MIME:
<?php// ❌ PELIGROSO: se puede subir un shell PHPmove_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name']);
// ✅ SEGURO: verificamos la extensión$allowed = ['jpg