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)
<code class="language-php">$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(['name' => $name]); foreach ($stmt as $row) { // 处理 $row }</code>
<code class="language-php">$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]); while ($row = $result->fetch_assoc()) { // 处理 $row }</code>
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>
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>
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!