La méthode POST offre un peu plus
de sécurité que la GET car elle n'apparait pas en clair
dans la barre de navigation. Toutefois, le nom des variables reste toujours
visible si on affiche la source de la page web. Afin de stopper bon nombre
de lamers, un webmaster pourra créer un script qui n'acceptera
les variables que si elles sont passées en POST. En un mot la méthode
POST c'est la discrétion. Si on tombe dans une situation d'un script
protégé, il s'uffira de le bluffer de la même façon
que l'on a vu dans le mag précédent.
Avant que vous vous posiez la question, oui j'ai installé le package
Easy PHP chez moi. Ca regroupe un interpreteur PHP, un serveur Apache
ainsi qu'une base MySQL.
Voici un exemple de script protégé qui affiche (dans le
cas d'un POST) la variable et sa valeur sous la forme POST[$variable]=$valeur.
<?php
if ($REQUEST_METHOD=='POST'){ //vérifie
que la méthode est POST
$var=$HTTP_POST_VARS;
// si c'est le cas on récupère les
données
while (list($indice,$valeur)=each($var))
echo "$REQUEST_METHOD"."[$indice]"." : $valeur<br>";
//et on les affiche
}
else echo "Désolé script protégé";
//sinon Bad Boy !!!
?>
Il faut savoir que la variable $HTTP_POST_VARS
est un tableau qui regroupe les données envoyées en POST.
Il existe une variable similaire pour GET (je vous laisse deviner comment
elle s'appelle :-). En PHP un tableau n'est pas forcément indicé
par des nombres. Par exemple si on envoie la variable var1 avec pour valeur
"hack". Alors on peut récupérer la variable de
cette façon : echo "$HTTP_POST_VARS['var1']"; affichera
"hack". En effet ici l'indice est var1 comme quoi le PHP est
super puissant. Ce langage est d'ailleurs un hybride du bash (langage
style batch mais sous UNIX) avec le langage C.
La fonction list n'est pas nécessaire à comprendre : elle
récupère tour à tour le couple (variable,valeur).
La méthode POST requiert deux lignes
d'en-tête supplémentaire : content-length et content-type.
Content-Type donne le type de données et Content-Length la longueur
totale de données en octets (en caractères car un caractère=un
octet ;-).
Dans notre cas la ligne spécifiant le type sera toujours : Content-Type:application/x-www-form-urlencoded
C'est ainsi que les navigateurs envoient les données par un formulaire.
Voici un exemple de POST :
POST /projet1/method.php
HTTP/1.1
host:127.0.0.1
// ne l'oubliez pas !!!
Content-Length:18 //
18 caractères
Content-Type:application/x-www-form-urlencoded
// format formulaire
//
Il faut laisser une ligne pour délimiter données et en-têtes
var1=arc&var2=hack //
les données formatées selon le stype http : variable1=valeur1&variable2=valeur2
etc.
HTTP/1.1 200 OK
Date: Wed, 11 Sep 2002 18:45:07 GMT
Server: Apache/1.3.20 (Win32) PHP/4.0.6
X-Powered-By: PHP/4.0.6
Transfer-Encoding: chunked
Content-Type: text/html
14
POST[var1] : arc<br> // réussi
!!!
POST[var2] : hack<br>
0
Les deux lignes d'en-têtes sont très importantes. Calculez
bien la longeur de la chaine de données avant de vous lancer car
le serveur lit vos caractères un par un et il ferme dès
qu'il a le nombre de caractères qu'on lui a dit. Si on ne mets
pas assez de caractères il va attendre qu'on en rajoute et là
aussi c'est la merde. Donc prenez votre temps !! L'ordre de Type/Length
n'a pas d'importance, g essayé les 2 cas et ça marche.