La Seguridad No Es Opcional
La seguridad web es fundamental. PHP alimenta más del 77% de los sitios web, lo que lo convierte en un objetivo frecuente de ataques.
1. Prevenir SQL Injection
// ❌ PELIGROSO
$sql = "SELECT * FROM usuarios WHERE email = '" . $_POST["email"] . "'";
// ✅ SEGURO con Prepared Statements
$stmt = $pdo->prepare("SELECT * FROM usuarios WHERE email = :email");
$stmt->execute([":email" => $_POST["email"]]);
2. Prevenir XSS (Cross-Site Scripting)
// ❌ PELIGROSO
echo $_GET["nombre"];
// ✅ SEGURO
echo htmlspecialchars($_GET["nombre"], ENT_QUOTES, "UTF-8");
3. Protección CSRF
// Generar token
$_SESSION["csrf_token"] = bin2hex(random_bytes(32));
// Verificar token
if ($_POST["csrf_token"] !== $_SESSION["csrf_token"]) {
die("Token CSRF inválido");
}
4. Hashing de Contraseñas
// Hashear (nunca usar md5 o sha1)
$hash = password_hash("mi_password", PASSWORD_DEFAULT);
// Verificar
if (password_verify($input_password, $hash)) {
echo "Contraseña correcta";
}
5. Validación de Entrada
// Filtrar email
$email = filter_var($_POST["email"], FILTER_VALIDATE_EMAIL);
if (!$email) die("Email inválido");
// Filtrar entero
$edad = filter_var($_POST["edad"], FILTER_VALIDATE_INT, [
"options" => ["min_range" => 1, "max_range" => 120]
]);
6. Headers de Seguridad
header("X-Content-Type-Options: nosniff");
header("X-Frame-Options: DENY");
header("X-XSS-Protection: 1; mode=block");
header("Content-Security-Policy: default-src 'self'");
Conclusión
La seguridad es un proceso continuo. Aplica estas prácticas desde el inicio de tus proyectos y mantente actualizado sobre nuevas vulnerabilidades.