Donc vous avez votre script qui marche impec, testé sur votre serveur, et tout. Vous indiquez l'adresse de votre avatar dans votre forum préféré, et…
Échec. Le serveur veut absolument « une image », donc un nom qui se finit en .jpg, .png ou .gif. Pas moyen de lui passer ce fichu script qui se termine par .php…
Pas de panique ! Il existe deux manières de contourner ce problème !
La manière « barbare » : le paramètre inutile
Elle s'appelle ainsi parce qu'elle n'est ni subtile, ni délicate, mais très simple très efficace. Disons, dans 9 cas sur 10.
Il s'agit de passer un paramètre inutile à votre script, et de lui donner la valeur
.jpg,
.png ou
.gif. Au lieu d'indiquer :
exemple.com/avatar.php
comme adresse d'image, ce qui ne va pas fonctionner, on passe :
exemple.com/avatar.php?inutile=.jpg
Et là, tout le monde est content :
- Le système de protection qui va voir une adresse en .jpg, et en déduire que c'est une image valide.
- Le script, qui va recevoir un paramètre (ici « inutile » avec la valeur « .jpg ») dont il se fiche totalement, vu qu'il ne le récupère jamais.
Le gros avantage de cette méthode, c'est qu'elle se fait en 10 secondes sans rien toucher sur votre serveur.
La manière « agent double » : le dossier déguisé en fichier
Elle s'appelle ainsi parce qu'elle fonctionne comme un agent double : le dossier se fait passer pour un fichier pour obtenir ce qu'il veut, et c'est très efficace.
Cette technique ne fonctionne que si vous avez un seul avatar dans le dossier.
Ici, on va se servir de cette propriété intéressante des serveurs web :
Citation : Les règles des serveurs webQuand on donne l'adresse d'un dossier à un serveur web, il va automatiquement chercher le fichier index.php ou index.html qu'il y a dedans.
Et qu'est-ce qui m'empêche d'appeler mon dossier
avatar.jpg ? Eh bien… rien !
On va devoir toucher un peu à la structure de notre avatar. Il faut :
- Mettre tous les fichiers (images, script) dans un même dossier que l'on appellera par exemple avatar.jpg.
- Renommer le script en index.php.
Puis vous indiquez à votre site l'adresse suivante :
exemple.com/avatar.jpg
Le site va voir une image, donc va être content et accepter votre avatar. Le serveur, lui, va regarder ce qu'est
avatar.jpg et comme c'est un dossier, il va automatiquement appeler :
exemple.com/avatar.jpg/index.php
ce qui va renvoyer votre image.
L'avantage de cette solution, c'est qu'elle marche sur n'importe quel serveur ; l'inconvénient est qu'elle ne fonctionne plus, ou plus exactement qu'elle nécessite de sérieuses modifications du code, quand on veut faire plusieurs avatars à partir du même set d'images.
La manière « ninja » : le fichier .htaccess
Elle s'appelle ainsi parce qu'elle est subtile, discrète et très, très efficace. En fait, elle ne peut pas échouer.
La première étape, c'est de déclarer qu'on utilise un
vrai fichier image, on indique comme adresse quelque chose du genre :
exemple.com/avatar.jpg
Sauf qu'on va dire à Apache que ce fichier
avatar.jpg n'est pas une image, mais notre fichier
avatar.php, et ce grâce aux directives htaccess.
Pour ce faire, il faut créer un fichier nommé
.htaccess dans le même dossier que votre fichier PHP, qui contient les deux lignes :
Code : Apache | RewriteEngine on
RewriteRule ^avatar\.jpg$ avatar.php [L]
|
En fait, on se sert du module de réécriture d'URL d'Apache (ligne 1), et on lui demande de réécrire
avatar.jpg (ce que voit le client) en
avatar.php (ce qui va être fait sur le serveur).
Je ne détaillerai pas ceci en profondeur, vous pouvez
trouver les informations de base sur les fichiers .htaccess ici et trouver les informations sur la réécriture d'URL un peu partout sur Internet.
L'avantage de cette technique est qu'elle est imparable : le client, donc le système de protection, n'a aucun moyen de savoir que vous ne lui passez pas une « vraie » image.
Les inconvénients sont que la technique nécessite le
ModRewrite activé sur le serveur Apache, et qu'il faut créer le .htaccess en plus.
Les cas pathologiques
Il existe quelques administrateurs paranoïaques, qui ont entendu parler
des failles CSRF et qui ont mis en place des techniques un peu violentes pour s'en prémunir.
Nous allons voir ici deux de ces techniques, et ce qu'on peut faire face à de tels cas.
Le site télécharge l'image et ne se sert que de la version locale
Tout est dans le titre : quand vous donnez une URL, le site télécharge une copie de l'image, et la stocke sur son propre serveur. L'image que voient les visiteurs est celle stockée sur le serveur.
Là, vous avez perdu : il est totalement impossible de faire un avatar aléatoire avec une telle « protection ».
A priori c'est le cas :
- Des avatars sur les forums Xooit.
Les signatures ne semblent pas affectées : je n'ai pas essayé personnellement mais, si j'ai bien compris, la « technique ninja » fonctionne.
Si quelqu'un a plus d'informations, merci de les partager dans les commentaires. De même, si quelqu'un connaît d'autres plates-formes ou sites connus qui fonctionnent de cette manière, signalez-le-moi que je puisse tenir cette liste à jour.
Le site vérifie qu'il n'y a pas de redirection
Et sa variante :
le site enregistre l'URL sur laquelle on redirige au lieu de l'URL que l'on donne.
Or, tout le fonctionnement repose sur ces fameuses redirections, d'où : problème.
Il faut savoir que le site ne peut vérifier cette redirection qu'à l'enregistrement — ou alors doit déployer des moyens complètement déments, qu'aucun webmaster sain d'esprit ne mettra en place.
La parade fonctionne donc en deux étapes :
- On fournit une vraie image exemple.com/avatar.jpg au formulaire. Le site la vérifie, et enregistre l'URL telle quelle dans sa base, puisqu'il a vérifié qu'il s'agissait bien d'une vraie image.
- Une fois l'enregistrement effectué, on supprime notre vraie image exemple.com/avatar.jpg et on se sert de la « technique ninja » pour faire correspondre exemple.com/avatar.jpg à notre fichier .php.
Personnellement je n'ai jamais vu ce genre de cas ; si quelqu'un connaît des plates-formes / sites connus qui fonctionnent de cette manière, merci de me le signaler en commentaire, que je puisse en faire une liste ici.