Maison >base de données >tutoriel mysql >Comment puis-je empêcher l'injection SQL dans les applications PHP?

Comment puis-je empêcher l'injection SQL dans les applications PHP?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-25 22:17:08295parcourir

How Can I Prevent SQL Injection in PHP Applications?

Empêcher l'injection de SQL de SQL dans PHP

L'injection SQL est une vulnérabilité. Cela peut conduire à l'exécution par un attaquant de tout code SQL, ce qui entraînera des conséquences catastrophiques à l'application.

Afin d'éviter l'injection de SQL, il est important de séparer les données de SQL pour garantir que les données sont toujours conservées en tant que données, et elles ne seront jamais interprétées par l'analyseur SQL comme commande. Cela peut être implémenté en utilisant des phrases de pré-procédure avec des paramètres. De cette façon, un attaquant ne peut pas injecter un SQL malveillant.

Il existe deux façons de réaliser:

Utilisez PDO (adapté pour tout pilote de base de données de support)

Utilisez MySQLI (adapté à MySQL)
<code class="language-php">$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(['name' => $name]);

foreach ($stmt as $row) {
    // 处理 $row
}</code>
  • php 8.2:

PHP 8.1 et versions inférieures:

<code class="language-php">$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);
while ($row = $result->fetch_assoc()) {
    // 处理 $row
}</code>
Si vous êtes connecté à une base de données non -MySQL, vous pouvez vous référer à la deuxième option spécifique au pilote (par exemple,

et ) de PostgreSQL. L'APD est un choix général.

La configuration de connexion correcte
<code class="language-php">$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name); // 's' 指定变量类型 -> 'string'
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // 处理 $row
}</code>

pg_prepare() Lorsque vous utilisez PDO pour accéder à la base de données MySQL, les phrases de pré-procédure réelles ne seront pas utilisées par défaut. Pour résoudre ce problème, la simulation des instructions de pré-procédure est nécessaire. Voici comment créer un exemple de connexion avec l'APD: pg_execute()

Pour MySqli, la même opération doit être effectuée:

Explication

<code class="language-php">$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8mb4', 'user', 'password');

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);</code>
La requête SQL que vous avez transmise à est analysée et compilée par le serveur de base de données. En spécifiant les paramètres (qu'il s'agisse de paramètres ou de paramètres de nommage, tels que l'exemple

ci-dessus), vous dites au noyau de base de données ce que vous voulez filtrer. Ensuite, lorsque vous appelez , la requête de pré-procédure est combinée avec les valeurs des paramètres que vous avez fournies.

<code class="language-php">mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // 错误报告
$dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test');
$dbConnection->set_charset('utf8mb4'); // 编码</code>
Il est important que la valeur du paramètre soit combinée avec la requête compilée, non combinée avec la chaîne SQL. SQL est injecté dans le script via le script, et le SQL envoyé à la base de données contient des cordes malveillantes pour travailler. Par conséquent, en envoyant le SQL et les paramètres réels, vous pouvez réduire le risque d'obtenir des accidents.

Tous les paramètres envoyés par instructions de pré-procédure seront simplement considérés comme une chaîne (bien que le noyau de la base de données puisse effectuer une certaine optimisation, de sorte que les paramètres peuvent également être des nombres). Dans l'exemple ci-dessus, si la variable contient

, le résultat ne recherchera que la chaîne

et que votre montre ne sera pas vidé. prepare ? Un autre avantage de l'utilisation de l'instruction de pré-processus est que si vous effectuez la même requête dans la même session, analysez et compilez une seule fois pour améliorer la vitesse. :name

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn