PHP dispose d'une option de configuration appelée Allow_url_fopen, qui est activée par défaut. Il vous permet de pointer vers de nombreux types de ressources et de les traiter comme des fichiers locaux. Par exemple, vous pouvez obtenir le contenu (HTML) d'une page en lisant l'URL :
<?php $contents = file_get_contents('http://example.org/'); ?>
Comme indiqué au chapitre 5, de graves vulnérabilités peuvent survenir lorsque des données corrompues sont utilisées pour pointer vers des fichiers inclus et requis. En fait, je considère cette vulnérabilité comme l’une des plus dangereuses des applications PHP car elle permet à un attaquant d’exécuter du code arbitraire.
Bien que légèrement moins grave, une vulnérabilité similaire peut résulter de l'utilisation de données corrompues dans une fonction de système de fichiers standard :
<?php $contents = file_get_contents($_GET['filename']); ?>
Cet exemple permet à l'utilisateur de manipuler file_get_contents( ) afin qu'il obtienne le contenu de la ressource distante. Considérez une demande comme la suivante :
http://www.php.cn/ … mple.org/xss.html
Cela conduit à une situation dans laquelle la valeur de $content est entachée. Puisque cette valeur est obtenue indirectement, ce fait est susceptible d'être ignoré. C'est pourquoi le principe de défense en profondeur traite le système de fichiers comme une source de données distante et la valeur de $content comme entrée, afin que votre mécanisme de filtrage puisse potentiellement renverser la situation.
Parce que la valeur $content est contaminée , cela peut conduire à diverses vulnérabilités de sécurité, notamment des vulnérabilités de script intersite et des vulnérabilités d'injection SQL. Par exemple, voici un exemple de vulnérabilité de script intersite :
<?php $contents = file_get_contents($_GET['filename']); echo $contents; ?>
La solution est de ne jamais pointer vers un nom de fichier contenant des données corrompues. Insistez simplement pour filtrer les entrées et assurez-vous que les données sont filtrées avant qu'elles ne pointent vers un nom de fichier :
<?php $clean = array(); /* Filter Input ($_GET['filename']) */ $contents = file_get_contents($clean['filename']); ?>
Bien qu'il n'y ait aucune garantie que les données contenues dans $content soient totalement impeccables, cela donne une garantie raisonnable que le fichier que vous lisez est exactement le fichier que vous aviez l'intention de lire, et non celui spécifié par l'attaquant. Pour améliorer la sécurité de ce processus, vous devez également traiter $content comme une entrée et le filtrer avant utilisation.
<?php $clean = array(); $html = array(); /* Filter Input ($_GET['filename']) */ $contents = file_get_contents($clean['filename']); /* Filter Input ($contents) */ $html['contents'] = htmlentities($clean['contents'], ENT_QUOTES, 'UTF-8'); echo $html['contents']; ?>
Le processus ci-dessus fournit une méthode puissante pour empêcher diverses attaques et est recommandé pour une utilisation dans la programmation réelle.
Ce qui précède est le contenu des risques liés à la sécurité des fichiers à distance PHP. Pour plus de contenu connexe, veuillez prêter attention au site Web chinois PHP (www. php.cn) !