Maison  >  Article  >  développement back-end  >  Comment éviter les attaques par injection de commandes en utilisant PHP

Comment éviter les attaques par injection de commandes en utilisant PHP

WBOY
WBOYoriginal
2023-06-24 08:55:361884parcourir

Avec le développement d'Internet, les problèmes de sécurité des réseaux ont attiré de plus en plus d'attention, en particulier pour les développeurs de sites Web, qui doivent prêter davantage attention aux problèmes de sécurité. Les attaques par injection de commandes sont l’une des méthodes d’attaque les plus populaires de ces dernières années, pouvant entraîner des problèmes de sécurité tels que des fuites de données et des falsifications d’informations. Dans le développement PHP, comment éviter les attaques par injection de commandes est un gros problème. Voyons comment utiliser PHP pour éviter de telles attaques.

1. Comprendre les attaques par injection de commandes

Tout d'abord, il est très important de comprendre ce qu'est une attaque par injection de commandes. L'attaque par injection de commandes signifie que l'attaquant soumet un code malveillant pour transformer l'ensemble du système ou de l'application en un exécuteur qui effectue délibérément certaines opérations malveillantes. L'attaquant utilise le code malveillant pour exécuter des commandes et des opérations arbitraires, prenant ainsi le contrôle du système et des applications.

Les attaques courantes par injection de commandes incluent l'injection SQL, l'injection de commandes du système d'exploitation, l'injection LDAP, etc. Dans le développement PHP, l'injection de commandes du système d'exploitation se produit généralement, nous nous concentrerons donc ensuite sur la façon de prévenir les attaques par injection de commandes du système d'exploitation.

2. Évitez de fusionner directement les commandes

Dans la programmation PHP, il existe de nombreuses situations dans lesquelles des commandes système doivent être exécutées, telles que le téléchargement de fichiers, les appels de commandes système, etc. Éviter directement les commandes de raccordement constitue la mesure préventive la plus élémentaire, car les commandes de raccordement peuvent facilement inciter les attaquants à exploiter des vulnérabilités.

Ce qui suit est un exemple pour démontrer la nécessité d'éviter de fusionner directement les commandes lors de l'appel de commandes système :

<?php 
// 获取传入参数
$user_input = $_POST['name'];

// 定义命令
$command = 'ls -l '.$user_input;

// 执行命令
exec($command, $result);

// 输出结果
var_dump($result);
?>

Dans le code ci-dessus, $user_input est un paramètre obtenu via $_POST code> et est directement associé à la variable <code>$command, facilement exploitable par les attaquants. $user_input是通过$_POST获取的参数,直接拼接到了$command变量中,容易被攻击者利用。

正确的做法是对$user_input进行过滤和特定字符的检查,然后再拼接到$command中。具体可以采用PHP中的escapeshellarg()escapeshellcmd()addslashes()等函数进行过滤。

<?php 
// 获取传入参数
$user_input = $_POST['name'];

// 过滤参数
$user_input = escapeshellarg($user_input);

// 定义命令
$command = 'ls -l '.$user_input;

// 执行命令
exec($command, $result);

// 输出结果
var_dump($result);
?>

在上面代码中,我们使用escapeshellarg()函数对$user_input进行过滤,然后再拼接到$command中,从而避免了命令注入攻击。

三、使用参数绑定

除了避免直接拼接命令,另一个解决方法是使用参数绑定。参数绑定需要使用PHP中的PDO扩展。下面是一个例子:

<?php 
// 连接数据库
$dsn = 'mysql:host=localhost;dbname=test';
$username = 'root';
$password = 'root';
$dbh = new PDO($dsn,$username,$password);

// 获取传入参数
$user_input = $_POST['password'];

// 定义命令
$command = "SELECT * FROM user WHERE password = :password";

// 准备查询
$stmt = $dbh->prepare($command);

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

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

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

// 输出结果
var_dump($result);
?>

在上面代码中,我们使用bindParam()方法绑定参数$user_input

L'approche correcte consiste à filtrer et à vérifier des caractères spécifiques sur $user_input, puis à les fusionner en $command. Plus précisément, vous pouvez utiliser des fonctions telles que escapeshellarg(), escapeshellcmd() et addslashes() en PHP pour le filtrage.

rrreee

Dans le code ci-dessus, nous utilisons la fonction escapeshellarg() pour filtrer $user_input, puis l'assembler en $command, donc que les attaques par injection de commandes soient évitées.

3. Utiliser la liaison de paramètres

En plus d'éviter les commandes d'épissage direct, une autre solution consiste à utiliser la liaison de paramètres. La liaison de paramètres nécessite l'utilisation de l'extension PDO en PHP. Voici un exemple : 🎜rrreee🎜Dans le code ci-dessus, nous utilisons la méthode bindParam() pour lier le paramètre $user_input, en évitant la méthode d'épissage direct des instructions SQL. , évitant ainsi les attaques par injection SQL. 🎜🎜4. Utilisez des outils d'audit de code🎜🎜Enfin, nous vous recommandons d'utiliser des outils d'audit de code pour nous aider à découvrir les problèmes de sécurité potentiels. Les outils d'audit de code courants incluent PMD, SonarQube, etc., qui peuvent effectuer une analyse statique, une détection de vulnérabilités, etc. sur le code pour détecter rapidement les risques de sécurité. 🎜🎜En bref, lors du développement de PHP, il faut veiller à assurer la sécurité du code et à éviter des problèmes tels que les attaques par injection de commandes. Les méthodes ci-dessus peuvent nous aider à prévenir les attaques par injection de commandes et à mieux protéger la sécurité du code. 🎜

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