Utiliser correctement les formulaires de contact sur les Pages Perso de Free

Les Pages Perso Chez Free

Par Al, le , dans Créer ses pages perso. / Dernière modification : le par Al. (merci à a@a.a et mithril94)
Tags : MySQL, PostgreSQL, Sécurité, Tutoriaux, Apache, Fonction mail(), PHP

De très nombreuses Pages Persos hébergées sur les serveurs de Free proposent des formulaires de contact pour joindre des contacts précis ou l'administrateur du site. Afin de garantir un bon fonctionnement du formulaire et ne pas gêner les autres utilisateurs du service, il faut suivre quelques règles simples pour réaliser un formulaire de contact robuste, sécurisé et résistant aux robots spammeurs.

Ce billet est un complément à Éviter le spam sur les sites perso et L'art et la manière d'envoyer des mails depuis les pages perso de Free… (à lire également, si se n'est pas encore fait). Par ailleurs, une petite lecture de Protection des forums et des formulaires contre les robots spammeurs peut être utile pour augmenter la sécurité de vos formulaires.

Les bonnes pratiques

Voici quelques conseils pour réaliser vos formulaires de contact, tout en évitant de devenir un pourvoyeur de spam et autres messages non désirés :

  • Le formulaire de contact doit être protégé par un captcha. C'est la base minimum requise, mais d'autres systèmes antispam peuvent (doivent) être utilisés en complément ;
  • Protégez et filtrez les données envoyées par les utilisateurs par des fonctions PHP (pas par des scripts Javascript), afin de limiter les risques d'injection de code malicieux via vos formulaires ou les URL de ceux-ci. Attention : la vérification des champs du formulaire par Javascript n'est pas suffisante : un robot ou une personne malveillante peut facilement passer outre le code de vérification Javascript. Les contrôles validant réellement le formulaire doivent toujours se faire sur le serveur, et donc en PHP ;
  • Utilisez un champ caché dans votre formulaire et contrôlez sa valeur par PHP. Si elle ne correspond pas, c'est qu'un robot a tenté de passer outre le formulaire. Si la valeur correspond à ce que vous attendez, un visiteur humain, qui n'a pas pu voir le champ caché, est à l'origine du message. Vous trouverez plus d'informations sur ce billet du blog de Totof.

Mais attention, pour éviter que le courriel envoyé par votre formulaire ne finisse dans la boite spam de votre correspondant, soit refusé ou pire, ne soit jamais envoyé il faut veiller au respect des points suivants :

  • Pas plus de 2 000 mails envoyés / semaine (cela inclut les tentatives de spam, les flood, les messages non remis… si les formulaires ne sont pas correctement configurés et protégés cela peut aller vite) ;
  • Pas plus de 20 destinataires et/ou appels de la fonction mail par exécution de script PHP ;
  • Pas (ou peu) de pièces jointes ;
  • Ne pas inclure de contenus pouvant être assimilés à du spam (nombreux liens…) ;
  • Protection de vos formulaires par des captcha et autres systèmes antispam efficaces ;
  • Protégez et filtrez les données envoyées par les utilisateurs par des fonctions PHP (pas javascript), afin de limiter les risques d'injection de scripts dangereux via vos formulaires ou les URL de ceux-ci ;
  • Sécurisez correctement votre compte afin qu'il ne soit pas le relai de script d'envoi massif de spam ;
  • Ne spécifiez pas tous les en-têtes, uniquement les principaux (cf. le code d'exemple de cette page) car, si vous écrasez les en-têtes automatiquement insérés par les serveurs d'envoi par les vôtres, il y a de grandes chances que l'email ne passe pas, alors que la fonction mail() était bien codée, le contenu et le format correct, et que l'exécuteur PHP à bien remis l'email au serveur perso1, en charge des envois depuis les PP ;
  • Format mime text/plain ou multipart (text/html + text/plain), n'envoyez jamais de courriel au format text/html uniquement ; le jeu de caractères doit être us-ascii, iso-8859-1, iso-8859-15, utf-8 ;
  • Utiliser la fonction mailFree() en lieu et place de la fonction mail() standard de PHP. Ainsi, si le courriel n'est pas envoyé, votre script PHP pourra le détecter et prévenir l'utilisateur de vous contacter par un autre moyen ou de réessayer un peu plus tard. Cette fonction est incluse dans le formulaire de contact décrit un peu plus loin dans ce document ;
  • De manière générale, évitez d'envoyer des messages « inutiles » tel que les notifications d'exécution de tâches diverses, des emails de notification diverses et non essentielles, etc. Bref, n'envoyer des messages que lorsque cela est vraiment utile afin de ne pas engorger les serveurs. Il ne faut jamais oublier que les PP de Free, c'est plus de deux millions de sites !

Les Scripts

Nous proposons un formulaire de contact adapté au Pages Perso de Free (vérification de la bonne exécution de la fonction mail() par la fonction mailFree() pour prévenir l'utilisateur de la réussite de l'envoi du message) associé à des systèmes de protection contre les robots spammeurs par captcha : cryptographp ou Captcha94, identifiants de session et champ de contrôle masqué. Ces systèmes anti-spam ne nécessitent pas d'accès à des ressources externes à votre compte et fonctionneront correctement sur votre site. Le premier système de captcha est cependant sensiblement plus « lourd » que le second. Nous proposons également les fichiers nécessaires au fonctionnement du script CGI de Free (Form2mail.pl) – à titre d'archive – permettant l'envoi par courriel du résultat de tout type de formulaires (cf. fin du billet).

Ces quatre scripts sont ⬇︎ disponibles en téléchargement ici, il vous suffit d'adapter les valeurs correspondantes à votre site (adresse de courriel, adresse du site, texte des champs et du message, ajout d'un lien facultatif vers un fichier CSS, etc.) puis de le placer sur votre site dans un répertoire spécifique ou à la racine. Un simple lien vers ce script dans votre menu permettra à vos visiteurs de vous contacter en toute simplicité, sans quitter leur navigation. Vous pouvez également les intégrer à d'autres scripts de votre site via la fonction PHP include(), en retirant les éléments HTML inutiles. Les scripts de génération des captchas et des identifiants de session reposant sur les sessions, n'oubliez pas de créer un répertoire /sessions/ à la racine de votre compte.

Les fonctionnalités

  • protection des champs de saisie contre les injections de code ;
  • ré-affichage des informations saisies par l'utilisateur en cas d'erreur de saisie ;
  • captcha ou champ caché modifié par Javascript (+ identifiant de session en champ caché) ;
  • information de l'utilisateur en cas de problème d'envoi, l'invitant à réessayer ;
  • possibilité d'inclusion dans d'autres scripts (en retirant les sections de code html non nécessaires) ;
  • possibilité de stylisation par CSS (balises HTML5 standards).

La configuration

Pour configurer les scripts (à l'exception du formulaire correspondant à form2mail), il suffit simplement de remplacer l'adresse de courriel factice présente dans le code source du script PHP par l'adresse de courriel correspondant à celle de votre site et « Moi » par votre nom ou celui de votre site. C'est à cette adresse que seront expédiés les emails envoyés depuis les formulaires.

$email_webmaster = 'Moi <monlogin@free.invalid>';

Par ailleurs, il faut veillez à configurer correctement les fonctions include();, afin que celles-ci correspondent au chemin de votre installation (notamment si vous utilisez plusieurs formulaires sur votre site).

Le fonctionnement

Les scripts de formulaire en PHP permettent d'afficher un formulaire limitant les injections de code, les valeurs des champs obligatoires (adresse email et message) sont vérifiées et le formulaire ne pourra être soumis que si tous les champs obligatoires sont correctement remplis. En cas d'erreur dans les valeurs saisies par les utilisateurs, le formulaire retourne les valeurs précédemment saisies afin de permettre leur correction.

Si l'exécuteur PHP n'est pas à même de remettre le courriel au serveur d'envoi des pages perso de Free, un message d'erreur invitant l'utilisateur à réessayer est affiché, grâce à la fonction mailFree().

Configuration des champs cachés modifiés par Javascript

Un champ caché contenant un identifiant de session et (éventuellement) un code de contrôle – modifié par javascript lorsque l'utilisateur entre son adresse de courriel en sélectionnant le champ correspondant – ajoutent une sécurité supplémentaire lors de la soumission du formulaire. Nous vous invitons à modifier/différencier la valeur du champ de contrôle et la valeur de contrôle réelle (nombre, mot, lettres aléatoires, etc.) de cet exemple.

Pour supprimer le contrôle additionnel par Javascript, il suffit de retirer les sections de code suivantes des scripts de formulaire utilisant un captcha (il ne faut en aucun cas supprimer cet élément de contrôle du formulaire sans captcha).

Dans le corps du formulaire :

<p><input type="hidden" name="control" id="control" value="ValeurDeControleFactice" /></p>

Dans les balises <head></head> de la page :

<script type="text/javascript">
$(function(){
$('#email_expediteur').bind('focus', function(){
$("#control").val('ValeurDeControleReelle');
});
});
</script>

Dans la fonction PHP de contôle des valeurs retournées par l'utilisateur :

 && $_POST['control'] = ValeurDeControleReelle

Formulaire de contact par PHP et Captcha

Si vous souhaitez vous affranchir du script de Free afin de disposer de d'avantage de souplesse, le plus simple et de réaliser un formulaire de contact via un script PHP avec une protection contre les spammeurs, par captcha par exemple. Ce script sera alors en charge de vérifier le captcha et de faire parvenir le mail à son destinataire.

Le formulaire de contact

Le formulaire de contact proposé est un formulaire simple, dont les champs de saisie accessibles à l'utilisateur sont assainis et protégés contre les injections de code ou de scripts. Il se décompose en différentes parties : gestion des erreurs de saisie et protection des données envoyées par l'utilisateur, inclusion des systèmes de contrôle et de protection puis traitement des données et envoi de l'email proprement dit.

Les systèmes de captcha

Les champs du formulaire sont protégés contre les injections de code par des utilisateurs peu scrupuleux mais il est nécessaire de protéger également la fonction d'envoi des courriels des « moulinettes » des robots spammeurs. Il est possible de différencier les utilisateurs légitimes de vos formulaires des multiples robots qui scannent les sites à la recherches de failles à exploiter. Parmi les nombreux systèmes existant, nous proposons un formulaire PHP associé à deux systèmes de captcha anti-spam reposant sur PHP et Javascript : Cryptographp et Captcha94.

Il est possible d'utiliser ces systèmes de protection sur tous les types de formulaires utilisés sur votre site. Vous pouvez trouver les explications pour les implémenter sur les sites Web des développeurs, ainsi que dans le code source des fichiers proposés au téléchargement.

Cryptographp

Cryphographp est un système anti-spam développé entre 2006 et 2007 par Sylvain Brison. Il est fortement personnalisable et repose sur un ensemble de police de caractères que vous pouvez modifier/ajouter par vous même pour générer une image. Vous trouverez toutes les informations nécessaires à sa personnalisation sur le site web du développeur et dans le code source, largement commenté. Cryptographp est un « dinosaure » dans le monde des captcha, mais il est encore résistant face aux robots spammeurs.

Captcha94

Captcha94 est un autre système anti-spam développé très récemment par un utilisateur des pages perso, mithril94. Très léger, ce système anti-spam est totalement personnalisable (via CSS et de nombreux paramètres) et en évolution constante pour offrir de nombreuses options et alternatives d'utilisation. Vous pouvez joindre le développeur sur les forums Usenet des Pages Perso de Free. Toutes les informations nécessaires à sa personnalisation sont présentées sur le site web du développeur et dans le code source, également amplement commenté.

Autres possibilités

Ces formulaire disposent de champs cachés validant des identifiants de sessions uniques. Il est parfaitement possible d'intégrer à ces formulaires d'autres systèmes de protection, tel que des champs cachés ne devant pas être modifiés (à l'image de l'un des formulaires proposés dans le « kit ») ou des tests de Turing. Vous pourrez trouver des exemples dans un autre billet de ce site, concernant la protection des sites contre les robots spammeurs.

Form2mail

Depuis de nombreuses années, Free propose un script permettant de créer facilement et rapidement un formulaire de contact pour les sites personnels de ces utilisateurs. Ce script, largement répandu, n'est plus maintenu par la société Free et risque d'être abandonné prochainement. Il est donc préférable d'utiliser un formulaire de contact indépendant pour vos sites. Toutefois, afin de permettre à chacun de choisir, ce script est également disponible – à titre d'archive – en téléchargement, il vous suffit d'adapter les valeurs correspondantes à votre site (adresse de courriel, adresse du site, texte des champs et du message, ajout d'un lien facultatif vers un fichier CSS) puis de le placer sur votre site dans un répertoire spécifique ou à la racine. Un simple lien vers la page contact.php dans votre menu permettra à vos visiteurs de vous contacter en toute simplicité depuis votre site.

Lors de la soumission du formulaire de contact, vous recevrez un courriel à l'adresse email correspondant à votre site (si votre site est http://monsite.free.fr/, le message sera envoyé à l'adresse monsite@free.fr), au format texte brut. Ce message contiendra les valeurs du formulaire, l'URL de la page du formulaire ainsi que l'adresse IP de l'émetteur du message. Il est possible d'utiliser ce script pour tout type de formulaires, quels qu'en soient les champs utilisés, mais il est impossible de joindre des documents à vos messages. Une fois le formulaire envoyé, le visiteur est redirigé vers la page result.html, dans le même répertoire que le script du formulaire.

Note : Le script Form2mail ne fonctionne que si le visiteur précise la page d'origine dans sa requête (le Referer). Si vous avez configuré votre navigateur ou votre pare-feu pour masquer celui-ci, vous recevrez une erreur du type : L'URL n'est pas valide. Vous devrez ajouter une exception ou modifier vos réglages de sécurité (navigateur et anti-virus/firewall) afin de permettre le fonctionnement correct du script.