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.