5.1 Sécurité
5 Sécurité
Manuel PHP
. Considérations générales . Binaires CGI . Module Apache . Sécurité des fichiers . Sécurité des bases de données . Rapport d'erreurs ->Utilisation des variables super-globales . Données transmises par les internautes . Masquer PHP . Etre à jour
|
5.1.7 Utilisation des variables super-globales
Une fonctionnalité de PHP qui peut être utilisée pour
améliorer la sécurité est de configurer PHP en désactivant 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.
Travailler avec register_globals = on |
<?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"); } ?>
|
Travailler avec register_globals = off |
<?php if($_COOKIE["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.
Détection de corruption de variables |
<?php if ($_COOKIE['username'] && !$_POST['username'] && !$_GET['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", $_SERVER['REMOTE_ADDR']); echo "Problème de sécurité, l'administrateur est alerté."; exit; } ?>
|
Bien entendu, désactiver 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.
|