¿Cómo prevenir inyecciones SQL en PHP? (guía completa)
¡Hola a todos! Soy un desarrollador PHP principiante y tengo un problema grave de seguridad. Estoy escribiendo un formulario de inicio de sesión simple para un sitio web, y mi código se ve así:
```php
$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'";
$result = mysqli_query($conn, $query);
```
Sé que esto es terriblemente inseguro, pero no entiendo cómo solucionarlo correctamente. Mis amigos dijeron que me pueden hackear a través de una inyección SQL. Intenté ingresar algo como `admin' OR '1'='1` en el campo de login, ¡y efectivamente me dejó entrar al sistema sin contraseña!
He leído sobre `mysqli_real_escape_string()`, pero escuché que no es una panacea. También hablan de PDO y prepared statements, pero no entiendo cómo usarlos correctamente. Mi proyecto funciona en PHP 8.1 con MySQL.
Por favor, expliquen en detalle:
1. ¿Cómo funciona exactamente la inyección SQL?
2. ¿Cuáles son los métodos modernos de protección?
3. ¿Qué método se considera la mejor práctica?