La méthode POST

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.