Maison  >  Article  >  développement back-end  >  Comment prévenir les attaques par injection SQL dans les formulaires PHP ?

Comment prévenir les attaques par injection SQL dans les formulaires PHP ?

WBOY
WBOYoriginal
2023-08-25 19:45:381102parcourir

Comment prévenir les attaques par injection SQL dans les formulaires PHP ?

Comment prévenir les attaques par injection SQL dans les formulaires PHP ?

L'attaque par injection SQL est une vulnérabilité de sécurité très courante et dangereuse dans le développement Web. Les attaquants utilisent cette vulnérabilité pour injecter du code malveillant dans la base de données, détruisant ainsi l'intégrité de la base de données et même obtenant des informations sensibles. Dans les formulaires PHP, la principale méthode pour empêcher les attaques par injection SQL consiste à filtrer et à encoder strictement les données saisies par l'utilisateur. Cet article explique comment empêcher les attaques par injection SQL, avec des exemples de code.

1. Utilisez des instructions préparées

Les instructions préparées sont une technologie qui envoie des instructions SQL à l'analyseur de base de données pour compilation et analyse avant de les exécuter. Il peut empêcher efficacement les attaques par injection SQL car il utilise des requêtes paramétrées pour séparer les données saisies par l'utilisateur des instructions SQL. Le PDO de PHP fournit une méthode pour utiliser les instructions préparées. L'exemple est le suivant :

// 连接数据库
$dsn = 'mysql:host=localhost;dbname=test';
$username = 'root';
$password = 'password';

try {
    $pdo = new PDO($dsn, $username, $password);
    // 设置错误模式为异常
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
    echo '数据库连接失败:' . $e->getMessage();
}

// 准备SQL语句
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username');

// 绑定参数
$stmt->bindParam(':username', $username);

// 执行查询
$stmt->execute();

// 获取结果
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 输出结果
foreach($result as $row) {
    echo $row['username'];
}

Dans le code ci-dessus, nous préparons une instruction SQL via la méthode prepare(), qui utilise un paramètre . :username pour remplacer le nom d'utilisateur saisi par l'utilisateur. Ensuite, le nom d'utilisateur réel est lié au paramètre via la méthode bindParam(), et enfin la requête est exécutée et les résultats sont obtenus. De cette façon, quelle que soit l’entrée de l’utilisateur, cela n’affectera pas l’instruction SQL. prepare()方法准备了一个SQL语句,其中使用了一个参数:username来代替用户输入的用户名。然后,通过bindParam()方法将实际的用户名绑定到参数上,最后执行查询并获取结果。这样,无论用户输入如何,都不会对SQL语句造成影响。

二、使用过滤函数

PHP提供了一些过滤函数,用于过滤和清理用户输入的数据。这些函数可以帮助我们去除输入字符串中的特殊字符和SQL关键字,从而防止SQL注入攻击。其中,mysqli_real_escape_string()是一种常用的过滤函数,示例如下:

// 连接数据库
$servername = "localhost";
$username = "root";
$password = "password";
$dbname = "test";

$conn = mysqli_connect($servername, $username, $password, $dbname);
// 检查连接是否成功
if (!$conn) {
    die("数据库连接失败: " . mysqli_connect_error());
}

// 过滤用户输入数据
$username = mysqli_real_escape_string($conn, $_POST['username']);
$password = mysqli_real_escape_string($conn, $_POST['password']);

// 执行查询
$sql = "SELECT * FROM users WHERE username = '{$username}' AND password = '{$password}'";
$result = mysqli_query($conn, $sql);

// 处理结果
if (mysqli_num_rows($result) > 0) {
    while($row = mysqli_fetch_assoc($result)) {
        echo "用户名为: " . $row["username"];
    }
} else {
    echo "用户名或密码错误";
}

// 关闭连接
mysqli_close($conn);

在上面的代码中,我们使用mysqli_real_escape_string()

2. Utiliser les fonctions de filtre

PHP fournit des fonctions de filtre pour filtrer et nettoyer les données saisies par l'utilisateur. Ces fonctions peuvent nous aider à supprimer les caractères spéciaux et les mots-clés SQL de la chaîne d'entrée pour empêcher les attaques par injection SQL. Parmi eux, mysqli_real_escape_string() est une fonction de filtrage couramment utilisée. L'exemple est le suivant : 🎜rrreee🎜Dans le code ci-dessus, nous utilisons la fonction mysqli_real_escape_string() pour filtrer. l'entrée utilisateur Filtrez par nom et mot de passe, puis collez la chaîne filtrée dans l'instruction SQL. De cette façon, même si l'entrée contient des caractères spéciaux ou des mots-clés SQL, ils seront échappés pour éviter les attaques par injection SQL. 🎜🎜Pour résumer, il existe de nombreuses façons de prévenir les attaques par injection SQL dans les formulaires PHP, parmi lesquelles l'utilisation d'instructions préparées et de fonctions de filtrage sont les méthodes les plus courantes et les plus efficaces. Quelle que soit la méthode utilisée, assurez-vous que les données saisies par l'utilisateur sont strictement filtrées et codées pour garantir la sécurité du site et l'intégrité des données. Dans le même temps, les développeurs doivent également effectuer régulièrement des examens de sécurité et des analyses de vulnérabilité pour réparer rapidement les éventuelles vulnérabilités de sécurité et protéger la sécurité des informations du site Web et des utilisateurs. 🎜

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