Maison >développement back-end >tutoriel php >Comment éviter les attaques par injection de mots clés SQL dans le développement du langage PHP ?

Comment éviter les attaques par injection de mots clés SQL dans le développement du langage PHP ?

WBOY
WBOYoriginal
2023-06-10 17:41:511292parcourir

Avec le développement d'Internet, les attaques par injection SQL sont devenues un problème sérieux en matière de sécurité des réseaux. L'attaque par injection SQL fait référence à une méthode d'attaque dans laquelle les attaquants utilisent les vulnérabilités des applications Web pour soumettre des instructions SQL malveillantes au serveur afin d'obtenir un accès illégal et de voler des données sensibles. En tant que l'un des langages de programmation les plus utilisés dans le développement Web, le langage PHP est également confronté au risque d'attaques par injection SQL. Dans cet article, nous présenterons comment éviter les attaques par injection de mots clés SQL dans le développement du langage PHP.

1. Comprendre les attaques par injection SQL

Avant de prévenir les attaques par injection SQL, nous devons d'abord comprendre les concepts et principes de base des attaques par injection SQL. Les attaques par injection SQL utilisent principalement des applications Web pour filtrer de manière incorrecte les données d'entrée de l'utilisateur et transmettre les entrées de l'utilisateur directement à la base de données principale dans le cadre de l'instruction SQL, permettant aux attaquants d'attaquer et de contrôler la base de données via des instructions SQL malveillantes. Par exemple, l'extrait de code suivant peut être exposé à des attaques par injection SQL :

<?php
//连接数据库
$con=mysqli_connect("localhost","username","password","my_db");

//获取用户提交的用户名和密码
$username=$_POST['username'];
$password=$_POST['password'];

//构造SQL语句
$sql="SELECT * FROM users WHERE username='".$username."' AND password='".$password."'";

//执行SQL语句
$result=mysqli_query($con,$sql);

// 输出查询结果
while($row=mysqli_fetch_array($result,MYSQLI_ASSOC)){
    echo $row['username']. " " . $row['password'];
}

//关闭数据库连接
mysqli_close($con);
?>

Dans le code ci-dessus, les données soumises par l'utilisateur peuvent être directement transmises à la base de données SQL dans le cadre de l'instruction SQL, et l'attaquant peut utiliser certains moyens d'injecter des données dans la base de données. Transmettez des instructions SQL malveillantes pour attaquer et contrôler la base de données. Par exemple, lorsque le mot de passe soumis par l'utilisateur est "123' OR 1=1--", la base de données exécutera l'instruction SQL suivante :

SELECT * FROM users WHERE username='user' AND password='123' OR 1=1--'

Cette instruction SQL interrogera les informations de tous les utilisateurs de la base de données car "1 =1" Toujours vrai.

2. Méthodes pour éviter les attaques par injection SQL

Afin d'éviter les attaques par injection SQL, nous devons prendre certaines mesures pour protéger les applications Web contre les attaques. Voici quelques méthodes courantes :

  1. Utiliser des requêtes paramétrées

Les requêtes paramétrées sont un moyen efficace d'éviter les attaques par injection SQL. Cette méthode utilise des instructions et des paramètres SQL prédéfinis et transmet les valeurs des paramètres en entrée à la base de données pour exécution. Cette méthode peut empêcher les données saisies par l'utilisateur d'être directement fusionnées dans des instructions SQL, protégeant ainsi les applications Web des attaques par injection SQL. Par exemple, le code suivant utilise une requête paramétrée :

<?php
//连接数据库
$con=mysqli_connect("localhost","username","password","my_db");

//获取用户提交的用户名和密码
$username=$_POST['username'];
$password=$_POST['password'];

//构造SQL语句
$sql="SELECT * FROM users WHERE username=? AND password=?";

//创建预处理语句
$stmt=mysqli_prepare($con,$sql);

//绑定参数值
mysqli_stmt_bind_param($stmt,"ss",$username,$password);

//执行SQL语句
mysqli_stmt_execute($stmt);

// 迭代查询结果
$result=mysqli_stmt_get_result($stmt);
while($row=mysqli_fetch_array($result,MYSQLI_ASSOC)){
    echo $row['username']. " " . $row['password'];
}

//关闭数据库连接
mysqli_close($con);
?>
  1. Filtrer les données d'entrée

Avant de traiter les données d'entrée de l'utilisateur, nous pouvons les filtrer, assurant ainsi leur sécurité. Par exemple, nous pouvons utiliser les fonctions intégrées de PHP strip_tags(), addlashes(), etc. pour filtrer les données saisies par l'utilisateur. Ces fonctions peuvent filtrer les balises HTML, échapper aux caractères spéciaux, etc. dans les entrées utilisateur, réduisant ainsi le risque d'attaques par injection SQL. Par exemple :

<?php
//连接数据库
$con=mysqli_connect("localhost","username","password","my_db");

//获取用户提交的用户名和密码
$username=$_POST['username'];
$password=$_POST['password'];

//过滤用户输入数据
$username=mysqli_real_escape_string($con,strip_tags($username));
$password=mysqli_real_escape_string($con,strip_tags($password));

//构造SQL语句
$sql="SELECT * FROM users WHERE username='".$username."' AND password='".$password."'";

//执行SQL语句
$result=mysqli_query($con,$sql);

// 输出查询结果
while($row=mysqli_fetch_array($result,MYSQLI_ASSOC)){
    echo $row['username']. " " . $row['password'];
}

//关闭数据库连接
mysqli_close($con);
?>

Dans le code ci-dessus, nous utilisons les fonctions mysqli_real_escape_string() et strip_tags() pour filtrer les données saisies par l'utilisateur et assurer leur sécurité.

3. Résumé

L'attaque par injection SQL est un problème de sécurité courant dans les applications Web, qui peut entraîner des pertes incommensurables pour les bases de données et les données des utilisateurs. Afin d'éviter les attaques par injection SQL, nous devons garantir l'exactitude des données d'entrée, filtrer les données d'entrée des utilisateurs, utiliser des requêtes paramétrées et d'autres méthodes pour renforcer la sécurité des applications Web. En tant que développeurs, nous devons constamment apprendre et comprendre les dernières technologies de sécurité pour garantir la sécurité des applications Web.

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