Je vais parler vite fais d'une méthode très répendue : Le Cross scripting. C'est une méthode qui consiste à attaquer un site à partir d'un autre site, pour par exemple envoyer des données aux scripts du site cible. J'ai eu affaire à un serveur cet après midi qui était utiliser pour envoyer des doses très massives de spams. En effet un script PHP servant à envoyer des mails à partir du site a été utiliser pour envoyer des mails en tous genres à tout le monde. Une série de PCs, sûrement infestés par un vers manipulés par un spammeur se sont mis à envoyer des requêtes POST à ce script qui lui envoyait des mails à qui mieux mieux.
Ce qui est dommage dans l'histoire c'est qu'il est relativement simple de protéger ses scripts contre du cross scripting aussi banal. Je ne dis pas que ma méthode est infaillible ni rien mais elle aurait empêchée cette attaque là, et je vous la conseille à tous elle vous évitera au moins les attaques de bas niveau qui sont les plus courantes (entendez par là les attaques du hacker de bââââse de 16 ans tout boutonneux ou d'un robot qui cherche des failles tout seul).
Donc ...
Lorsqu'un de vos script PHP reçoit une requête POST il reçoit les données de 3 façons en fonction de votre configuration :

  • dans des variables globales (register_globals=on)
  • dans $HTTP_POST_VARS (PHP4)
  • dans $_POST (versions récentes de PHP)

De plus vous avez à votre disposition des variables globales de paramètres du serveur stockées dans :

  • $HTTP_SERVER_VARS (PHP4)
  • $_SERVER (versions récentes de PHP)

Bref, quand un site distant vous envoie une requête votre server sait d'où vient cette requête. La provenance s'appelle le REFERER (oui, je suis sûr que vous avez déjà entendu ce mot quelque part... vos statistiques par exemple ? ;-)). Bref ce qui vous reste à faire c'est tout bêtement comparer votre REFERER avec votre nom d'hôte local $_SERVER['SERVER_NAME']... Pas compliqué quand même, si ??? Bon allez un bout de code exemple :

$from = $_SERVER["HTTP_REFERER"];
$from = preg_replace("/^http:\/\/(.*?)\/.*$/", "$1", $from);
if ($from != $_SERVER["HTTP_SERVER"]) {
  die "Crossscripting attempt from $from!!!";
}

Capiche ??? Bon j'espère que vous ne vous ferez pas avoir vous ;-)