Maison  >  Article  >  développement back-end  >  Comment éviter les vulnérabilités d’injection de commandes système dans le développement du langage PHP ?

Comment éviter les vulnérabilités d’injection de commandes système dans le développement du langage PHP ?

WBOY
WBOYoriginal
2023-06-10 11:16:561336parcourir

Ces dernières années, avec la popularisation d'Internet et le développement de la technologie IoT, les problématiques de sécurité informatique sont devenues de plus en plus prégnantes. Parmi elles, la vulnérabilité d'injection de commandes système, également connue sous le nom de « vulnérabilité d'exécution de commandes », est l'une des vulnérabilités Web courantes et est largement utilisée par les pirates pour mener des attaques et des opérations malveillantes. Dans le développement du langage PHP, comment éviter les vulnérabilités d’injection de commandes système est devenu un problème urgent à résoudre pour les développeurs. Cet article analysera ce problème et proposera quelques suggestions spécifiques et expériences pratiques pour référence par les développeurs PHP.

1. Le concept et le principe de la vulnérabilité d'injection de commandes système

La vulnérabilité d'injection de commandes système, c'est-à-dire le manque de validation des entrées, permet aux utilisateurs d'injecter des systèmes exécutables arbitraires dans des applications Web commande pour obtenir l’effet d’avoir des droits d’administrateur système. La raison de cette vulnérabilité est généralement que l'application Web n'effectue pas un filtrage et une vérification suffisants des données saisies par l'utilisateur, permettant à l'utilisateur d'injecter des commandes exécutées dans le système.

Le principe de la vulnérabilité d'injection de commande système est le suivant : les pirates informatiques soumettent des données d'entrée malveillantes, incluent la commande qu'ils souhaitent exécuter dans les données d'entrée malveillantes et soumettent ces données à l'application Web. Lorsque l'application Web reçoit ces données et ne les vérifie pas, elle les intègre directement dans la commande et exécute la commande malveillante. Cette méthode d'attaque est généralement réalisée via des formulaires Web, des paramètres d'URL, des en-têtes HTTP, etc.

2. Comment éviter les vulnérabilités d'injection de commandes système

Afin d'éviter les vulnérabilités d'injection de commandes système, une série de mesures préventives doivent être prises lors du développement du langage PHP. Ci-dessous, nous développons ces mesures et les expliquons.

1. Le filtrage et la vérification des données d'entrée

Le filtrage et la vérification des données d'entrée sont l'un des moyens d'éviter efficacement les vulnérabilités d'injection de commandes système. En langage PHP, les développeurs peuvent utiliser certaines fonctions intégrées pour filtrer et valider les données d'entrée. Par exemple, il existe une fonction en PHP appelée filter_var(), qui peut être utilisée pour vérifier et traiter différents types de données, comme vérifier si le format d'un e-mail est correct. Cette fonction peut également filtrer certains caractères sensibles pour éviter d'être exploités par des pirates.

2. Lorsque vous utilisez des commandes système pour exécuter des fonctions, n'utilisez pas directement les paramètres saisis par l'utilisateur

commandes système telles que system(), exec(), shell_exec( ) en PHP, les fonctions sont très faciles à exploiter par des pirates de bas niveau. Par conséquent, lors de l’utilisation de ces fonctions, nous devons faire particulièrement attention à ne pas utiliser directement les paramètres saisis par l’utilisateur. Au lieu de cela, vous pouvez filtrer certains caractères dangereux (y compris, mais sans s'y limiter, $, ;, &&, ||, etc.) dans les paramètres de saisie utilisateur, échapper aux données saisies par l'utilisateur ou utiliser des expressions régulières pour le filtrage et la vérification.

3. Activez le mode sans échec en PHP

PHP fournit une fonction appelée "mode sans échec", qui peut être utilisée pour définir le niveau de sécurité du programme PHP. Après avoir activé le « mode sans échec », les programmes PHP peuvent restreindre certaines fonctions sensibles. Par exemple, la fonction sys_exec() peut être désactivée pour éviter d'être exploitée par des attaquants.

4. Désactivez les fonctions dangereuses en PHP

En plus d'activer le mode sans échec, nous pouvons également désactiver certaines fonctions dangereuses, telles que exec(), shell_exec() et autres fonctions. De cette façon, même si l’attaquant réussit à injecter des commandes malveillantes, celles-ci ne pourront pas être exécutées.

5. Essayez d'utiliser les fonctions fournies par le framework

Dans le développement du langage PHP, nous pouvons également utiliser le framework PHP existant pour éviter les vulnérabilités d'injection de commandes système. Comme nous le savons tous, le framework PHP fournit de nombreuses fonctions et classes sécurisées, permettant aux développeurs d'effectuer facilement une programmation sécurisée. Par conséquent, essayez d'utiliser les fonctions fournies par le framework pour réduire les risques de sécurité du code et améliorer la stabilité et la sécurité du programme.

3. Exemple d'analyse de la vulnérabilité d'injection de commande système

Ci-dessous, nous prenons un simple extrait de code PHP comme exemple pour voir comment la vulnérabilité d'injection de commande système est générée : #🎜 🎜#

<?php
$parameter = $_POST['parameter'];
exec("ls -l ".$parameter);
?>

Dans l'extrait de code ci-dessus, nous pouvons voir que la fonction exec() est utilisée. Dans cette fonction, nous fusionnons directement les paramètres saisis par l'utilisateur dans la fonction exec(). A partir de là, les pirates ont la possibilité d’injecter des commandes malveillantes. Par exemple, si nous soumettons un paramètre=; rm -rf/ dans le formulaire POST, cette commande supprimera l'intégralité du système de fichiers, provoquant de graves problèmes de sécurité.

Alors comment éviter ce genre de vulnérabilité ? Ci-dessous, nous fournirons une analyse approfondie de cette question.

1. Utilisez la technologie de filtrage et de vérification pour filtrer les caractères illégaux

Si nous ajoutons une technologie simple de filtrage et de vérification aux entrées de l'utilisateur, nous pouvons efficacement éviter les commandes système La génération de vulnérabilités d’injection. Par exemple, nous pouvons filtrer et valider les paramètres saisis par l'utilisateur. Si nous constatons que les paramètres contiennent des caractères spéciaux (tels que $, ;, &&, ||, etc.), alors nous pouvons directement quitter le programme ou renvoyer un message d'erreur. De cette façon, les pirates peuvent être empêchés d’injecter des commandes malveillantes.

<?php
$parameter = $_POST['parameter'];
if(preg_match('/[^sw]/', $parameter)) {
  // 参数中含有特殊字符,退出程序或返回错误信息
} else {
  exec("ls -l ".$parameter);
}
?>

2. Utilisez la technologie d'échappement pour empêcher les attaques par injection

Lors de l'exécution de commandes système, nous pouvons utiliser la fonction d'échappement fournie par PHP pour traiter les paramètres d'entrée de l'utilisateur. Par exemple, nous pouvons utiliser la fonction addlashes() pour ajouter des barres obliques inverses afin de filtrer certains caractères sensibles. Voici un exemple :

<?php
$parameter = $_POST['parameter'];
$parameter = addslashes($parameter); // 对输入数据进行转义处理
exec("ls -l ".$parameter);
?>

3. Utilisez les fonctions de sécurité fournies par le framework PHP

.

在使用PHP框架时,我们可以尽量利用框架提供的安全函数,来降低系统命令注入漏洞的风险。例如,在Yii框架中,我们可以使用CConsoleCommand类来代替exec()函数。这个类提供了一些安全的函数,可以方便地处理与执行系统命令相关的操作。下面是一个示例:

<?php
// 在Yii框架中执行系统命令的代码
$command = new CConsoleCommandRunner();
$command->run(array('parameter.php', $parameter));
?>

四、总结

PHP语言是目前非常流行的高级语言之一,其在web开发和物联网开发中均得到了广泛的运用。然而,由于PHP语言的开发模式比较注重灵活性和易用性,因此面临系统命令注入漏洞的风险也比较大。为了避免系统命令注入漏洞,我们需要在PHP语言开发中尽可能地使用安全的函数和技术。例如,我们可以使用过滤和验证技术,使用转义技术,利用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!

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