human
Si l'entrée de l'utilisateur est insérée sans modification dans une requête SQL, alors l'application devient vulnérable aux injections SQL, comme dans l'exemple suivant :
```$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
```
C'est parce que l'utilisateur peut entrer quelque chose comme ```value'); DROP TABLE table;--```, et la requête devient :
```INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
```
Que peut-on faire pour éviter que cela se produise
gpt
La bonne façon d'éviter les attaques par injection SQL, peu importe la base de données que vous utilisez, est de séparer les données de SQL, de sorte que les données restent des données et ne seront jamais interprétées comme des commandes par le parseur SQL. Il est possible de créer une instruction SQL avec des parties de données correctement formatées, mais si vous ne comprenez pas pleinement les détails, vous devriez toujours utiliser des instructions préparées et des requêtes paramétrées. Ce sont des instructions SQL qui sont envoyées et analysées par le serveur de base de données séparément de tous les paramètres. De cette façon, il est impossible pour un attaquant d'injecter du SQL malveillant.

Vous avez essentiellement deux options pour y parvenir :

1. Utilisation de PDO (pour n'importe quel pilote de base de données pris en charge) :
```
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute([ 'name' => $name ]);

foreach ($stmt as $row) {
    // Faites quelque chose avec $row
}
```

2. Utilisation de MySQLi (pour MySQL) :
Depuis PHP 8.2+, nous pouvons utiliser execute_query() qui prépare, lie les paramètres et exécute l'instruction SQL en une seule méthode :
```
$result = $dbConnection->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);

while ($row = $result->fetch_assoc()) {
    // Faites quelque chose avec $row
}
```

Jusqu'à PHP 8.1 :
```
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name); // 's' spécifie le type de variable => 'string'
$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // Faites quelque chose avec $row
}
```
Si vous vous connectez à une base de données autre que MySQL, il existe une deuxième option spécifique au pilote à laquelle vous pouvez vous référer (par exemple, pg_prepare() et pg_execute() pour PostgreSQL). PDO est l'option universelle.