le Journal du Floyd

De la sécurité en matière de formulaire.

l auteur de ce journal

En prenant le tramway, de bon matin, je croise une ancienne collègue de travail. Bah tiens, toi qui es dans la partie, j' ai un pote coiffeur qui a un site web très joli mais son livre d' or pullule de spams et autres cochonneries. Comment c'est-y-qu' on fait, hein, vas-y dis moi ?! Pour sécuriser? Et d' une, quand on y connait rien, on ne touche pas, c'est comme la plomberie le dimanche, cela peut mal tourner. On évite de croire aux logiciels qui te produisent des sites web au design qui déchire. On ne fait pas bricoler sa soupe, pour ne pas dire sa merde, par un bricolo, ou le fils du copain du mari à ma soeur. Et de deux, je n' aime toujours pas les coiffeurs. Pour tous les autres, qui voudraient sécuriser leurs livres d' or ou formulaires, voici quelques tipps. Pas de grands cours web ennuyeux à mourir, une sorte de vulgarisation, attention c' est un peu grossier voire violent et un peu technique. Donc les âmes sensibles, passez votre chemin.

la base

Bon un livre d' or, c'est un formulaire en html, rien de plus, rien de moins. Donc des élements html form, input et textarea.

<form method="post" action="securisation.php" >
<input name="prenom" type="text" />
<input name="nom" type="text" />
<input name="email" type="text" />
<input name="astuce" type="text" id="astuce" />
<textarea name="texte" > </textarea>
<input type="submit" value=" poster mon commentaire à la con " />
</form>

Jusque là, tout va très bien madame la marquise. J' explique plus loin le but de l'élément "astuce". Et ensuite ? Bah, cela devient rapidement compliqué. Si tout le monde peut remplir ou laisser une trace, on autorise aussi les malveillants et autres cafards. Et bientôt, tous les jours, il faudra effectuer une purge. Pas prêts à jouer les femmes de ménage tous les jours ou bien?

Ne pas laisser la moindre chance

Donc pas de Javascript pour commencer. Mais du PHP. Bah oui on sécurise côté serveur, pas côté client. Le formulaire se met en méthode post, pas get. Avec get, le malveillant peut rajouter des paramètres au niveau de l' url. Tu n'as pas compris ? Pas grave, tu mets post et puis c'est tout. Sinon Google est ton meilleur ami. Premièrement, on se connait pas mais tu vas déjà me donner ton adresse IP afin que je la vérifie :

<?php
$ip = $_SERVER['REMOTE_ADDR'];
if(filter_var($ip, FILTER_VALIDATE_IP) {
echo 'autorisé à continuer';
}
else {
echo 'va t\'en vilain spammeur!';
}
?>

Le code peut être inséré en tout de début du document securisation.php par exemple. Chaque champ est récupérable dans une variable en PHP => $_REQUEST['name'], ou aussi $_POST['name']. Donc , par exemple, $_REQUEST['prenom']. Le vilain spammeur, même s' il a une adresse IP valide, peut chercher à insérer son propre programme dans un des champs. Un simple script php ou html. Pas de souci, on purge:

<?php
$nouvelle_valeur_du_prenom = strip_tags($_REQUEST['prenom']);
?>

Dans la vraie vie, personne ne s' appelle D2R2 ou C-3PO même si on est fan de Star Wars. Puis il faut reconnaître que les prénoms ont une longueur limitée. Il n'existe pas de prénoms ou de noms, même composés, qui fassent 50 pages. Je vais donc contrôler la longueur de chaque élement et le contenu. Je n'ai pas d' humour, donc les plaisanteries ne seront pas permises non plus. Pour la longueur:

<?php
$longueur=strlen($nouvelle_valeur_du_prenom);
if($longueur<=30) {
echo 'autorisé à continuer';
}
else {
echo 'va t\'en vilain plaisantin!';
}
?>

30 caractères pour le prénom, 40 pour le nom, un peu plus quand même pour le texte. Ce sont juste des valeurs indicatives, tu fais ce que tu veux. Pour le contenu, je fais appel aux expressions régulières. Exemple:

<?php
$syntaxe = '#^[[:alpha:][:blank:]-]+$#';
if(preg_match($syntaxe, $nouvelle_valeur_du_prenom)) {
echo 'autorisé à continuer';
}
else {
echo 'va t\'en vilain plaisantin!';
}
?>

Et pour l' adresse email alors? 2 possibilités. Une expression régulière ou la fonction PHP qui va bien. Je préfère la fonction qui sera moins gourmande en ressource que l'expression régulière.

<?php
$syntaxe_email = '#^[[:alnum:]\.-_/:]+\.[[:alpha:]]{2,6}$#';
if(preg_match($syntaxe_email, $_REQUEST['email'])) {
echo 'autorisé à continuer';
}
else {
echo 'va t\'en vilain plaisantin!';
}
?>

ou bien

<?php
if (filter_var($_REQUEST['email'],FILTER_VALIDATE_EMAIL)) {
echo 'autorisé à continuer';
}
else {
echo 'va t\'en vilain plaisantin!';
}
?>

Les spammeurs utilisent aussi, entre autres, les adresses emails du destinataire. Une simple vérification que l'adresse email entrée n' est pas la tienne, et c' est tout bon.

<?php
if ($_REQUEST['email']!=mon_email@gogole.com) {
echo 'autorisé à continuer';
}
else {
echo 'va t\'en vilain plaisantin!';
}
?>

Bon, c'est tout là? Ben non. Je n'autorise pas non plus les caractères spéciaux. Oui, je sais, je ne suis pas drôle. C'est important pour ceux dont les livres d' or sont reliés avec une base de données. Je pourrais aussi évoquer la PDO. Euh non, ce n' est pas sale mais je ne veux parler ici que de la sécurité du formulaire.

<?php
$re_nouvelle_valeur_du_prenom = htmlspecialchars($nouvelle_valeur_du_prenom);
?>

Tu peux aussi utiliser htmlspecialentities. Pour en savoir plus sur ces 2 fonctions, bah, read the fucking manual! Maintenant cerise sur le cageot, j' explique l'utilité de l'input astuce. Les spams automatiques, les machines quoi, remplissent tous les champs. Tu vas dire, ouais mais l' input, il va se voir, les gens vont mettre des conneries dedans. Euh non, y a le CSS pour cela. Le code CSS n'est pas reconnu par les robots, je cache mon input à la vue de tous:

#astuce {
visibility:hidden;
}

Vérification en PHP que le champ est vide

<?php
if (empty($_REQUEST['astuce'])) {
echo 'autorisé à continuer';
}
else {
echo 'va t\'en vilain spammeur!';
}
?>

Il reste aussi la possibilité de mettre un captcha. Mais oui, les trucs que tu dois remplir, chiffres et lettres mélangés. C' est obligé de faire chier les visiteurs de ton site? Quoi, j' en ai un sur mon site. Oui, m'emmerdes pas. Sérieusement, tout captcha n'est qu'une formule mathématique, et si toi, tu n' as jamais été bon en maths, d' autres le sont pour toi. Donc tôt ou tard, tout captcha est soluble, et ailleurs que dans l' eau. Je ne te livre pas de code tout fait. Oh, puis quoi encore? A toi de peaufiner, d' améliorer, tout est perfectible. Bonne chance et rendez-vous au tas de sable!