Maison  >  Article  >  développement back-end  >  Comment empêcher les attaques par injection SQL en PHP

Comment empêcher les attaques par injection SQL en PHP

PHPz
PHPzoriginal
2023-05-20 18:40:364185parcourir

Dans les applications Web, les attaques par injection SQL sont une méthode d'attaque courante. Il profite de l'incapacité de l'application à filtrer ou à restreindre les entrées de l'utilisateur et à insérer des instructions SQL malveillantes dans l'application, ce qui permet à l'attaquant de contrôler la base de données et de voler des données sensibles. Pour les développeurs PHP, comment prévenir efficacement les attaques par injection SQL est une compétence qui doit être maîtrisée.

Cet article présentera les meilleures pratiques pour prévenir les attaques par injection SQL en PHP. Il est recommandé aux développeurs PHP de suivre les étapes suivantes pour protéger leurs applications.

1. Utilisez des instructions préparées

Les instructions préparées sont une bonne pratique pour empêcher les attaques par injection SQL en PHP. Il définit les espaces réservés des paramètres de l'instruction SQL avant d'envoyer l'instruction de requête SQL à la base de données. Les paramètres de la requête sont ensuite liés à des espaces réservés et exécutés sur la base de données, évitant ainsi les instructions SQL injectées de manière malveillante.

Ce qui suit est un exemple d'utilisation d'instructions préparées par PDO pour exécuter des requêtes SQL :

$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$results = $stmt->fetchAll();

Dans cet exemple, $pdo est un objet de connexion PDO , $username est le nom d'utilisateur qui doit être interrogé. La méthode prepare() définit l'instruction préparée d'une requête et utilise l'espace réservé ? au lieu des paramètres. La méthode execute() lie les paramètres de l'instruction préparée à des espaces réservés et exécute la requête dans la base de données. Enfin, stockez les résultats de la requête dans la variable $results. $pdo是一个PDO连接对象,$username是需要进行查询的用户名。prepare()方法定义了一个查询的预处理语句,并使用占位符?代替了参数。execute()方法将预处理语句中的参数与占位符绑定,并向数据库执行查询。最后,将查询结果存储在$results变量中。

2.使用参数化查询

参数化查询是一种在PHP中防止SQL注入攻击的另一种最佳实践。与预处理语句类似,它也使用占位符来代替需要查询的参数,但是它是在SQL查询语句中显式地定义占位符。

以下是一个使用mysqli参数化查询执行SQL查询的示例:

$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param('s', $username);
$stmt->execute();
$results = $stmt->get_result();

在此示例中,$mysqli是一个mysqli连接对象,$username是需要进行查询的用户名。prepare()方法定义了一个查询的参数化语句,并使用占位符?代替了参数。bind_param()方法将占位符与$username绑定。最后,调用execute()方法执行查询,get_result()方法获取查询结果。

使用参数化查询方式,比起预处理语句方式,要多做一步绑定参数的步骤,使用起来相对麻烦了一些。不过,参数化查询更加灵活,能够更好地处理一些复杂的SQL语句。

3.使用过滤器

PHP内置了大量的过滤器函数,可以用来过滤和验证输入值。使用合适的过滤器函数,可以确保输入值符合特定的格式或规范,并防止输入值被用于SQL注入攻击。

以下是一个使用filter_input()函数过滤用户输入的示例:

$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
$password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING);

在此示例中,filter_input()函数用于过滤用户输入的用户名和密码。第一个参数INPUT_POST指定了过滤的输入类型,此处指的是POST请求。第二个参数usernamepassword分别为POST请求中传递的变量名。第三个参数FILTER_SANITIZE_STRING

2. Utilisez des requêtes paramétrées

Les requêtes paramétrées sont une autre bonne pratique pour empêcher les attaques par injection SQL en PHP. Semblable aux instructions préparées, il utilise également des espaces réservés pour remplacer les paramètres de requête requis, mais il définit explicitement des espaces réservés dans l'instruction de requête SQL.

Ce qui suit est un exemple d'exécution d'une requête SQL à l'aide de requêtes paramétrées mysqli :

rrreee

Dans cet exemple, $mysqli est un objet de connexion mysqli , $username est le nom d'utilisateur qui doit être interrogé. La méthode prepare() définit une instruction paramétrée pour une requête, en utilisant des espaces réservés ? au lieu de paramètres. La méthode bind_param() lie l'espace réservé à $username. Enfin, appelez la méthode execute() pour exécuter la requête, et la méthode get_result() pour obtenir les résultats de la requête.

En utilisant la méthode de requête paramétrée, par rapport à la méthode d'instruction préparée, vous devez effectuer une étape supplémentaire de liaison des paramètres, ce qui est relativement difficile à utiliser. Cependant, les requêtes paramétrées sont plus flexibles et peuvent mieux gérer certaines instructions SQL complexes. #🎜🎜##🎜🎜#3. Utiliser des filtres #🎜🎜##🎜🎜#PHP possède un grand nombre de fonctions de filtre intégrées qui peuvent être utilisées pour filtrer et vérifier les valeurs d'entrée. À l'aide de fonctions de filtrage appropriées, vous pouvez garantir que les valeurs d'entrée sont conformes à un format ou à une spécification spécifique et empêcher que les valeurs d'entrée soient utilisées pour des attaques par injection SQL. #🎜🎜##🎜🎜#Ce qui suit est un exemple d'utilisation de la fonction filter_input() pour filtrer les entrées de l'utilisateur : #🎜🎜#rrreee#🎜🎜#Dans cet exemple, filter_input( ) permet de filtrer le nom d'utilisateur et le mot de passe saisis par l'utilisateur. Le premier paramètre <code>INPUT_POST spécifie le type d'entrée filtrée, qui fait ici référence à la requête POST. Les seconds paramètres username et password sont respectivement les noms de variables transmis dans la requête POST. Le troisième paramètre FILTER_SANITIZE_STRING est utilisé pour filtrer et supprimer tous les caractères illégaux et conserver les lettres et les chiffres dans la chaîne. #🎜🎜##🎜🎜#L'utilisation de filtres équivaut à une couche de vérification des entrées utilisateur sur le client. Différentes fonctions de filtrage peuvent filtrer différents types d'entrées, ce qui peut aider les développeurs à prévenir efficacement les attaques par injection SQL. #🎜🎜##🎜🎜#4. Restreindre les autorisations des utilisateurs de la base de données#🎜🎜##🎜🎜#Enfin, assurez-vous que les utilisateurs de la base de données ne disposent que d'autorisations minimales pour accéder à la base de données. Les utilisateurs de bases de données qui disposent uniquement d'autorisations de modification, d'insertion, de suppression et d'autres opérations, mais aucune autorisation de requête et de sélection, ne pourront pas exécuter de requêtes contenant des instructions illégales, empêchant ainsi les attaques malveillantes par injection SQL. #🎜🎜##🎜🎜#En bref, prévenir les attaques par injection SQL en PHP est crucial. En utilisant des instructions préparées, des requêtes paramétrées, des filtres et en restreignant les autorisations des utilisateurs de bases de données, les développeurs peuvent protéger leurs applications contre les attaques malveillantes. #🎜🎜#

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