Maison >développement back-end >tutoriel php >Exposition au code source de sécurité PHP (2)

Exposition au code source de sécurité PHP (2)

黄舟
黄舟original
2017-02-20 09:40:271751parcourir



Code source exposé

Votre serveur WEB doit être capable de lire votre code source et de l'exécuter. Cela signifie que lorsque le code écrit par n'importe qui est exécuté par le serveur, il peut également lire votre code source. Sur un hébergement mutualisé, le plus gros risque est que le serveur WEB étant partagé, du code PHP écrit par d'autres développeurs puisse lire des fichiers arbitraires.

 <?php
 
  header(&#39;Content-Type: text/plain&#39;);
  readfile($_GET[&#39;file&#39;]);
 
  ?>


En exécutant le script ci-dessus sur l'hôte où réside votre code source, un attaquant peut amener le serveur WEB à lire et afficher n'importe quel fichier en spécifiant la valeur du fichier sous forme de chemin complet et de nom de fichier. Par exemple, en supposant que le script s'appelle file.php et se trouve sur l'hôte example.org, le contenu du fichier /path/to/source.php peut être exposé en accédant au lien suivant :

http://www.php.cn/

Bien sûr, pour que ce code simple fonctionne, un attaquant devrait savoir exactement où se trouve votre code source, mais un attaquant pourrait écrire un script plus complexe qui lui permettrait de parcourir l'intégralité du système de fichiers. Pour de tels scripts, consultez les exemples plus loin dans ce chapitre.

Il n’existe pas de solution parfaite à ce problème. Comme indiqué au chapitre 5, vous devez considérer que tout votre code source est public, même le code stocké en dehors de votre répertoire d'accueil Web.

La meilleure approche consiste à conserver toutes les données sensibles dans une base de données. Bien que cela ajoute une couche supplémentaire de complexité à l’écriture de code, c’est le meilleur moyen d’empêcher que vos données sensibles ne soient exposées. Malheureusement, il y a un autre problème. Comment enregistrer votre mot de passe d'accès à la base de données ?

Veuillez consulter un fichier nommé db.inc enregistré en dehors du répertoire principal du site Web :

 <?php
 
  $db_user = &#39;myuser&#39;;
  $db_pass = &#39;mypass&#39;;
  $db_host = &#39;localhost&#39;;
 
  $db = mysql_connect($db_host, $db_user,
$db_pass);
 
  ?>


Si le chemin d'accès au fichier est connu (ou deviné), il est possible qu'un autre utilisateur de votre serveur accède au fichier et obtienne l'accès à la base de données, de sorte que toutes les données que vous enregistrez dans la base de données seront exposées.

La meilleure solution à ce problème est d'enregistrer les autorisations d'accès à votre base de données dans un fichier qui ne peut être lu que par les administrateurs système au format suivant :

 SetEnv DB_USER "myuser"
  SetEnv DB_PASS "mypass"


SetEnv est une commande Apache Le fichier ci-dessus permet de créer deux variables d'environnement Apache qui représentent respectivement le nom d'utilisateur et le mot de passe de votre base de données. Bien entendu, la clé de cette astuce est que seuls les administrateurs système peuvent lire le fichier. Si vous ne pouvez pas vous connecter en tant qu'administrateur système, vous pouvez restreindre la lecture du fichier uniquement par vous-même, ce qui constitue une méthode de protection similaire à celle ci-dessus.

 $ chmod 600 db.conf
  $ ls db.conf
  -rw-------  1 chris chris 48 May 21 12:34
db.conf


Cela empêche efficacement les scripts malveillants d'accéder à vos données, il n'y a donc aucun risque significatif pour la sécurité des données sensibles contenues dans la base de données.

Pour que ce fichier fonctionne, vous devez pouvoir accéder à ses données via PHP. Pour atteindre cet objectif, vous devez écrire les phrases d'inclusion suivantes dans httpd.conf :

  Include "/path/to/db.conf"


Il est à noter que cette déclaration doit être insérée dans la zone VirtualHost, sinon d'autres utilisateurs pourront obtenir le contenu correspondant.

Étant donné que le processus parent d'Apache s'exécute en tant qu'administrateur système (doit se lier au port 80), il est capable de lire le fichier de configuration, mais le processus enfant qui gère les requêtes du serveur (exécutant des scripts PHP) ne peut pas lire le fichier.

Vous pouvez accéder à ces deux variables via le tableau super global $_SERVER, donc dans db.inc, il vous suffit de référencer la variable $_SERVER au lieu d'indiquer les autorisations de la base de données :

<?php
 
  $db_user = $_SERVER[&#39;DB_USER&#39;];
  $db_pass = $_SERVER[&#39;DB_PASS&#39;];
  $db_host = &#39;localhost&#39;;
 
  $db = mysql_connect($db_host, $db_user,
$db_pass);
 
  ?>


Si le fichier est exposé, l'accès à la base de données ne sera pas compromis. Il s’agit d’une amélioration majeure de la sécurité pour l’hébergement partagé, et c’est également une méthode de défense approfondie pour l’hébergement indépendant.

Notez que lorsque vous utilisez la technique ci-dessus, les droits d'accès à la base de données se trouvent dans le tableau super public $_SERVER. Cela nécessite également d'empêcher les visiteurs ordinaires d'exécuter phpinfo() pour afficher ou pour toute autre raison entraînant l'exposition du contenu de $_SERVER.

Bien sûr, vous pouvez utiliser cette technique pour protéger n'importe quelle information (pas seulement l'accès à une base de données), mais je trouve plus pratique de sauvegarder la plupart des données dans une base de données, d'autant plus que cette technique nécessite l'assistance de votre hébergeur.

Ce qui précède est le contenu de PHP Security-Source Code Exposure (2). Pour plus de contenu connexe, veuillez faire 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