Manuel PHP
Précédent | Chapitre 4. Sécurité | Suivant

# Utilisation des variables HTTP

Une fonctionnalité de PHP qui peut être utilisée pour améliorer la sécurité est de configurer PHP en inactivant l'option register_globals. En supprimant la possibilité que les variables envoyées par les internautes soient injectées automatiquement dans le script PHP, vous pouvez restreindre la quantité de variables non-protégées. Les intrus devront prendre beaucoup plus de temps pour corrompre les mécanismes d'envoi de données, et vos variables internes seront nettement mieux protégées.

Bien que cela augmente d'autant les efforts à fournir pour écrire un script PHP, les bénéfices peuvent en être nettement plus interessants.

Exemple 4-8. Travailler avec register_globals actif
    <?php
      if ($username) {
    // attention, cette valeur peut être parasitée via GET/POST/COOKIES
        $good_login = 1;
      }
    if ($good_login == 1) {
    // attention, cette valeur peut être parasitée via GET/POST/COOKIES
        fpassthru ("/données/très/très/sensibles/index.html");
    }
    ?>

Exemple 4-9. Travailler avec register_globals actif
    <?php
      if($HTTP_COOKIE_VARS["username"]){
    // ne peut provenir que d'un cookie, corrompu ou pas
        $good_login = 1;
    // Impossible à parasiter
        fpassthru ("/données/très/très/sensibles/index.html");
      }
    ?>

En utilisant intelligemment ceci, il est même possible de détecter les tentatives de corruption. Si vous savez à l'avance d'où la variable doit venir (GET ou POST ou COOKIE), vous pouvez tester les données. Même si cela ne vous garantit pas contre la corruption de ces données, cela impose aux pirates de bien savoir comment corrompre les données.

Exemple 4-10. Détection de corruption de variables
    <?php
      if ($HTTP_COOKIE_VARS['username'] &&
          !$HTTP_POST_VARS['username'] &&
          !$HTTP_GET_VARS['username'] ) {
        // D'autres vérifications pour vérifier l'origine du nom d'utilisateur fourni
        $good_login = 1;
        fpassthru ("/données/très/très/sensibles/index.html");
      } else {
       mail("admin@example.com", "Tentative de piratage", $HTTP_SERVER_VARS['REMOTE_ADDR']);
       echo "Problème de sécurité, l'administrateur est alerté.";
       exit;
      }
    ?>

Bien entendu, inactiver l'option register_globals ne signifie pas que votre code devient ouvert à tous. Mais il faut aussi vérifier toutes les données qui vous sont fournies par les utilisateurs, et plutôt deux fois qu'une.

Précédent | Sommaire | Suivant
Rapport d'erreur | Niveau supérieur | Données transmises par les internautes