Maison  >  Article  >  développement back-end  >  Injection de commandes de sécurité PHP

Injection de commandes de sécurité PHP

黄舟
黄舟original
2017-02-21 09:12:511521parcourir



Injection de commandes

L'utilisation de commandes système est une opération dangereuse, surtout si vous essayez d'utiliser des données distantes pour construire la commande à exécuter. Si des données contaminées sont utilisées, des vulnérabilités d’injection de commandes apparaissent.

Exec() est une fonction utilisée pour exécuter des commandes shell. Il renvoie l'exécution et renvoie la dernière ligne de sortie de la commande, mais vous pouvez spécifier un tableau comme deuxième argument afin que chaque ligne de sortie soit stockée en tant qu'élément dans le tableau. L'utilisation est la suivante :

  <?php
 
  $last = exec(&#39;ls&#39;, $output, $return);
 
  print_r($output);
  echo "Return [$return]";
 
  ?>


Supposons que la commande ls produira le résultat suivant lorsqu'elle sera exécutée manuellement dans le shell :

$ ls
  total 0
  -rw-rw-r--  1 chris chris 0 May 21 12:34
php-security
  -rw-rw-r--  1 chris chris 0 May 21 12:34
chris-shiflett


Lors de l'exécution dans exec() via la méthode dans l'exemple ci-dessus, le résultat de sortie est le suivant suit :

Array
  (
      [0] => total 0
      [1] => -rw-rw-r--  1 chris chris 0 May 21
12:34 php-security
      [2] => -rw-rw-r--  1 chris chris 0 May 21
12:34 chris-shiflett
  )
  Return [0]


Cette méthode d'exécution de commandes shell est pratique et utile, mais cette commodité vous comporte des risques importants. Si les données contaminées sont utilisées pour construire une chaîne de commandes, l'attaquant peut exécuter des commandes arbitraires.

Je vous suggère d'éviter d'utiliser des commandes shell si possible. Si vous les utilisez, assurez-vous de filtrer les données utilisées pour construire la chaîne de commande et d'échapper à la sortie :

<?php
 
  $clean = array();
  $shell = array();
 
  /* Filter Input ($command, $argument) */
 
  $shell[&#39;command&#39;] =
escapeshellcmd($clean[&#39;command&#39;]);
  $shell[&#39;argument&#39;] =
escapeshellarg($clean[&#39;argument&#39;]);
 
  $last = exec("{$shell[&#39;command&#39;]}
{$shell[&#39;argument&#39;]}", $output, $return);
 
  ?>


Bien qu'il existe de nombreuses façons d'exécuter des commandes shell, il est important d'insister sur le fait que seules les données filtrées et échappées sont autorisées lors de la construction de la chaîne à exécuter. D'autres fonctions similaires qui nécessitent une attention particulière incluent passthru(), popen(), shell_exec( ) et system( ). Encore une fois, je recommande d’éviter si possible l’utilisation de toutes les commandes shell.

Ce qui précède est le contenu de l'injection de commandes de sécurité PHP. Pour plus de contenu connexe, veuillez prêter attention au site Web PHP chinois (www.php). .cn) !


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