Un des points inévitables en CGI est le traitement de formulaires. En Python, c'est aussi faisable.
Nous travaillons maintenant avec des données envoyées par l'utilisateur. Nous allons notamment les afficher à l'écran. Or, si le visiteur décide de mettre du HTML dans les données qu'il envoie, cela peut présenter une faille.
Prenons un cas concret. Si le visiteur entre le code suivant :
Code : HTML | <script type="text/javascript">alert('OLOL CMT G T PWNED');</script>
|
Une alerte s'affichera sur l'écran du visiteur ! Et rien ne l'empêche de se faire passer pour vous « Votre session va expirer. Entrez votre mot de passe à nouveau. », de le récupérer puis de se le faire envoyer par mail, le tout en JavaScript !
Pour pallier ce problème, nous allons utiliser une fonction fort pratique :
cgi.escape(). C'est un peu l'équivalent de
htmlspecialchars() en PHP : elle remplace les caractères
< et
> par
&lt; et
&gt;. De ce fait, le code JavaScript cité plus haut s'affichera tel quel, au lieu d'être exécuté. Notez que si vous utilisez une version de python supérieure à la 3.2 il vous faudra utiliser
html.escape() à la place de
cgi.escape(), car cette dernière est dépréciée.
Aussi,
prenez l'habitude de sécuriser toutes les données envoyées par le visiteur à l'aide de cette fonction.
Pour traiter un formulaire, nous devons tout d'abord importer le module CGI. Vous savez comment faire :
Code : Python
À partir de là, ça se corse.

On va créer une instance de la classe
cgi.FieldStorage(), qui contiendra le formulaire envoyé. Puis, on pourra en extraire les informations avec
instance.getvalue('nom'). Cela vous semble tordu ? En vérité, c'est très simple.
Code : Python 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | #!/usr/bin/python
import cgi
print 'Content-type: text/html'
print
formulaire = cgi.FieldStorage()
if formulaire.getvalue('nom') == None:
print '''
Veuillez remplir le formulaire :
<form action="formulaire.py" method="post">
<input type="text" name="nom" />
<input type="submit"></form>
'''
else:
print 'Ainsi, vous vous appelez',cgi.escape(formulaire.getvalue('nom')),' ?' # N'oubliez pas de sécuriser le code !
|
Ce code, enregistré dans un fichier
formulaire.py (autrement, il vous faudra le modifier, car le formulaire renvoie vers
formulaire.py), créera une instance de
cgi.FieldStorage() dans la variable formulaire.
Si
formulaire.getvalue('nom') == None, alors le champ
'nom' était vide, voire non envoyé.
On présente donc le formulaire au client. Autrement, on récupère la valeur du champ
'nom' avec
formulaire.getvalue('nom'), et on l'affiche tout en prenant soin de le sécuriser avec
cgi.escape().
Si le champ s'était appelé
'prenom', vous comprenez bien que l'on aurait récupéré sa valeur avec
formulaire.getvalue('prenom').
Vous voulez une bonne nouvelle ? Pour un formulaire envoyé avec GET (c'est-à-dire que les valeurs des champs se retrouvent dans l'URL, dans le style
page.py?var=valeur&var2=valeur2), c'est exactement pareil.
Ainsi, le script suivant enregistré sous
essai.py et appelé avec
essai.py?var=1&var2=2 affichera 'Var = 1 et Var2 = 2'.
Code : Python | #!/usr/bin/python
import cgi
print 'Content-type: text/html'
print
form = cgi.FieldStorage()
print 'Var = ',cgi.escape(form.getvalue('var')),' et Var2 = ',cgi.escape(form.getvalue('var2'))
|