Avec le développement continu de la technologie Internet, les problèmes de sécurité des sites Web et des applications attirent de plus en plus l'attention. Parmi elles, l’attaque par injection SQL est une méthode d’attaque courante, notamment pour les sites Web et les applications écrites en PHP. Par conséquent, cet article expliquera comment éviter les attaques par injection SQL dans les fichiers PHP pour garantir la sécurité des sites Web et des applications.
Les instructions préparées sont un moyen important de prévenir les attaques par injection SQL. Il sépare les instructions et les paramètres SQL, évitant ainsi la possibilité d'attaques provoquées par une saisie incorrecte. Les instructions préparées couramment utilisées en PHP incluent PDO et MySQLi. Voici un exemple d'utilisation de PDO :
//连接数据库 $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); //预处理SQL语句 $stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = :password'); //绑定参数 $stmt->bindParam(':username', $username); $stmt->bindParam(':password', $password); //执行查询 $stmt->execute();
Les requêtes paramétrées sont similaires aux instructions préparées, et séparent également les instructions et paramètres SQL. La différence est que la requête paramétrée fait référence à l'utilisation d'espaces réservés pour remplacer les paramètres dans l'instruction SQL et à la transmission des paramètres à la fonction de requête individuellement. Voici un exemple utilisant MySQLi :
//连接数据库 $conn = mysqli_connect('localhost', 'username', 'password', 'test'); //参数化查询 $stmt = mysqli_prepare($conn, 'SELECT * FROM users WHERE username = ? AND password = ?'); mysqli_stmt_bind_param($stmt, 'ss', $username, $password); mysqli_stmt_execute($stmt);
L'entrée utilisateur doit être correctement filtrée et validée avant d'être utilisée comme critère de requête SQL. Les fonctions de filtrage couramment utilisées en PHP incluent htmlspecialchars() et strip_tags(), qui peuvent filtrer les balises HTML et les caractères spéciaux. Par exemple :
//使用htmlspecialchars()过滤用户输入 $username = htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8'); $password = htmlspecialchars($_POST['password'], ENT_QUOTES, 'UTF-8'); //查询用户 $stmt = $pdo->query("SELECT * FROM users WHERE username = '{$username}' AND password = '{$password}'");
Avant d'utiliser la saisie utilisateur comme conditions de requête SQL, vous devez également vérifier si son type de variable est correct. Par exemple, lorsque l'entrée utilisateur est une chaîne, elle doit être placée entre guillemets ; lorsque l'entrée utilisateur est un nombre, elle n'a pas besoin d'être placée entre guillemets. Les fonctions de vérification de type couramment utilisées en PHP incluent is_numeric() et is_string(), qui peuvent nous aider à vérifier si les variables sont des nombres et des chaînes. Par exemple :
$username = $_POST['username']; if (is_string($username)) { //将字符串用引号括起来 $username = "'" . $username . "'"; } $password = $_POST['password']; if (is_string($password)) { //将字符串用引号括起来 $password = "'" . $password . "'"; } //查询用户 $stmt = $pdo->query("SELECT * FROM users WHERE username = {$username} AND password = {$password}");
En bref, l'attaque par injection SQL est une méthode d'attaque dangereuse et courante, et des mesures efficaces doivent être prises pour l'empêcher. Cet article présente plusieurs méthodes pour éviter les attaques par injection SQL, telles que les instructions préparées, les requêtes paramétrées, le filtrage des entrées et la vérification des types de variables. J'espère que cela sera utile aux développeurs PHP.
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!