Avec le développement rapide de la technologie Internet, les applications Web jouent un rôle de plus en plus important dans notre vie quotidienne. En tant que langage de programmation Web largement utilisé, PHP est également devenu la cible d’activités de cyberattaque. Parmi eux, les risques de sécurité par injection de commandes constituent une menace importante à laquelle PHP est confronté. Cet article présente quelques méthodes permettant d'éviter de tels risques de sécurité dans le développement PHP.
1. Qu'est-ce qu'une attaque par injection de commandes ?
L'attaque par injection de commandes fait référence à un pirate informatique qui injecte des commandes système malveillantes dans une application Web via les paramètres d'entrée de l'application Web et les place sur le serveur d'application Web. L'attaque par injection de commandes est une méthode d'attaque très dangereuse qui permet aux pirates de contrôler directement le serveur d'une application Web sans restrictions, obtenant ainsi un contrôle total sur le serveur.
2. Deux formes d'attaques par injection de commandes
Les attaques par injection de commandes peuvent être divisées en deux formes dans les attaques réelles. L'une consiste à utiliser directement les paramètres d'entrée de l'application Web pour attaquer, et l'autre consiste à obtenir les autorisations système par d'autres moyens, puis à attaquer.
Lorsque l'utilisateur soumet des données à l'application Web via POST ou GET, le pirate informatique peut injecter des chaînes avec des commandes système dans les données, permettant ainsi à l'application Web de Le programme exécute ces commandes malveillantes lors de son exécution. Par exemple, un exemple de code pour une attaque courante par injection de commandes ressemble à ceci :
mysql_query("SELECT * FROM user WHERE name = '".$_POST['name']."' AND password = '".$_POST['password']."'");
Lorsqu'un utilisateur saisit son nom d'utilisateur et son mot de passe via un formulaire pour se connecter, un pirate informatique peut injecter une chaîne avec une commande système malveillante dans le formulaire, comme affiché ci-dessous Affichage :
a' OR 1=1; DROP TABLE user;#
Cette commande amènera l'application Web à effectuer une opération "OU" lors de l'exécution d'une requête SQL et à supprimer une table nommée "utilisateur".
Les pirates peuvent obtenir les autorisations système par d'autres moyens, comme l'exploitation d'autres vulnérabilités dans les applications Web ou le piratage direct du mot de passe du serveur. Une fois que les pirates obtiennent les privilèges système, ils peuvent directement prendre le contrôle du serveur via une attaque par injection de commandes. Par exemple, un pirate informatique peut effectuer une simple attaque par injection de commande via la commande suivante :
system(“rm -rf /”);
Cette commande supprimera tous les fichiers et répertoires du serveur, provoquant des pertes très graves.
3. Comment éviter les attaques par injection de commandes
Après avoir maîtrisé les connaissances de base des attaques par injection de commandes, nous pouvons éviter ce risque de sécurité grâce aux méthodes suivantes :
Les instructions prétraitées sont une requête SQL sécurisée. méthode qui peut éviter les attaques par injection SQL et les attaques par injection de commandes et améliorer les performances des applications. Les instructions préparées peuvent être implémentées à l'aide de bibliothèques d'extension telles que PDO ou MySQLi.
Par exemple, voici un exemple de code qui utilise des instructions préparées par PDO pour exécuter des requêtes SQL :
$pdo = new PDO(‘mysql:host=hostname;dbname=database_name;’, ‘username’, ‘password’); $stmt = $pdo->prepare(‘SELECT name FROM user WHERE email = :email’); $stmt->execute(array(‘email’ => $email));
Avant d'implémenter la logique du programme, nous devons filtrer et valider les données traitées. Vous pouvez utiliser les fonctions intégrées de PHP telles que intval()
, floatval()
, trim()
et d'autres fonctions pour filtrer et vérifier les données. . intval()
、floatval()
、trim()
等函数来过滤和验证数据。
例如,以下示例代码演示了如何使用filter_input()
函数来过滤和验证输入数据:
$name = filter_input(INPUT_POST, ‘name’, FILTER_SANITIZE_STRING); $email = filter_input(INPUT_POST, ‘email’, FILTER_VALIDATE_EMAIL); $password = filter_input(INPUT_POST, ‘password’, FILTER_SANITIZE_SPECIAL_CHARS);
在执行系统命令之前,必须对输入的命令进行严格的验证和过滤。可以使用一些可信的命令行参数来限制输入。
例如,以下示例代码演示了如何使用escapeshellcmd()
filter_input()
pour filtrer et valider les données d'entrée : $command = escapeshellcmd($_POST['command']); $output = shell_exec($command);
Avant d'exécuter les commandes système, les commandes saisies doivent être strictement vérifiées et filtrées. La saisie peut être restreinte à l'aide de certains paramètres de ligne de commande fiables.
Par exemple, l'exemple de code suivant montre comment utiliser la fonction escapeshellcmd()
pour filtrer les arguments de ligne de commande :
$allowed_types = array('png', 'jpg', 'gif'); $file_type = substr(strrchr($_FILES['file']['name'], '.'), 1); if(!in_array($file_type, $allowed_types)) { die("Invalid file type."); } if ($_FILES['file']['size'] > 1000000) { die("File size too large."); }
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!