Protéger son site contre les différentes attaques

Il arrive souvent de se lever le matin et de découvrir que son site Internet a été ravagé par des robots pendant la nuit (ou même la journée ! Un robot ne dors pas). En règle générale ces attaques sont ciblées sur les blogs, les Pastebin ou encore les forums créés par vous même, pour faire des actions qu'ils n'auraient pas dû faire.
En général, c'est pour poster un message de publicité, ou faire l'andouille sur un formulaire de contact et donc envoyer plusieurs centaines de mails… c'est à ce moment là que l'hébergeur s'énerve, heureusement FranceServ Hébergement est protégé pour ce type d'attaque, mais ce n'est pas une raison pour laisser des robots faire ce qu'ils ne doivent pas !

Il existe aussi une autre forme d'attaques, ce sont les attaques par injection SQL (XSS - Cross-site scripting) et les attaques se basant sur les failles CSRF (Cross-site request forgery).

La protection contre l'envoi des formulaire par un robot (dans le but du spam)

La protection avec un champ caché

C'est cette technique la plus simple à mettre en place.
Les robots remplissent tous les champs, il suffit donc de mettre un champ qu'il ne faut surtout pas remplir et de vérifier son contenu en PHP.
L'utilisateur normal aura aussi l'envie de remplir le champ, il faut donc caché le champ en CSS.

Le fichier commenter.html :

<!DOCTYPE html>
<html>
  <head>
    <title>test</title>
    <!-- On cache le champ en CSS -->
    <style>
      input .use{display:none;}
    </style>
  </head>
  <body>
    <form action="./bar.php" method="post">
      <p>
        Nom : <input type="text" name="name" required/><br>
        Commentaire :<br>
        <textarea name="comment"></textarea><br>
        <!-- Le champ caché est tout à fait normal : -->
        <input type="text" name="user" class="use" />
        <input type="submit" value="Poster mon commentaire" />
      </p>
    </form>
</html>

Le fichier commenter.php :

<?php
if(isset($_POST['name'], $_POST['comment'], $_POST['user'])){ //Si le formulaire a bien été envoyé
   if(!empty($_POST['user'])){ //si le champ user a été remplie -> c'est un robot
      exit('Hello my bot, you are stupid.');
   }
 
   //...
   //On peut poster le message (après avoir fait les vérifications
   //sur les champs normaux bien sûr !)
   //...
}
?>

La protection du formulaire avec un captcha

Capture d'un reCaptchaVoici encore une autre méthode, vous avez surement déjà entendu ce nom, ou du moins vous connaissez les images avec des caractères qu'il faut recopier ? Ça s'appelle un captcha.

L'utilisation d'un captcha peut être assez simple, il suffit d'afficher une image dynamique et de demander à l'utilisateur de rentrer les caractères qui sont sur cette image, et d'ensuite de vérifier si l'image correspond ou non aux caractères rentrés dans le formulaire.

Utiliser la librairie de Google - reCaptcha

Google a créé une librairie qui permet de se protéger des robots (aussi bien pour les formulaires que pour cacher son adresse e-mail). Aller sur le site de la librairie reCaptcha

Première étape : Trouver votre clé privé et publique

A quoi servent elles ? La clé publique est utile pour le code coté serveur (PHP) qui servira à votre script à demander si le captcha entré par l'utilisateur est correct, La clé publique sera elle coté client, dans le JavaScript, et servira au navigateur coté client pour aller chercher un captcha. Commencez par vous crée un compte ou vous identifier avec un compte Google, puis allez dans My Accouts puis dans Add a New Site :

Tutoriel Capture 1

Indiquez lui l'adresse du site ou sera inséré le captcha, puis validez :

Tutoriel Capture 2

Ensuite, rendez vous sur la page de formulaire, puis incluez ce code là ou le captcha sera placer :

  <script type="text/javascript"
     src="http://www.google.com/recaptcha/api/challenge?k=Votre clé publique">
  </script>
  <noscript><!-- Pour les navigateurs qui désactivent ou ne supportent pas Javascript, on se sert d'une iframe. -->
     <iframe src="http://www.google.com/recaptcha/api/noscript?k=Votre clé publique"
         height="300" width="500" frameborder="0"></iframe><br>
     <textarea name="recaptcha_challenge_field" rows="3" cols="40">
     </textarea>
     <input type="hidden" name="recaptcha_response_field"
         value="manual_challenge">
  </noscript>

(Code reprit de http://code.google.com/intl/fr/apis/recaptcha/docs/display.html ou vous aurez aussi un code en Ajax) Puis coté serveur, commencez par télécharger la librairie ici : http://code.google.com/p/recaptcha/downloads/list (prenez le recaptcha-php-1.11.zip pour le php) puis mettez ce code dans la page qui traitera le formulaire qui contient le captcha (dans certains cas, ça peut être la même page pour le formulaire et pour son traitement):

  <?php
  require_once('recaptchalib.php');
  $privatekey = "Votre clé privé";
  $resp = recaptcha_check_answer ($privatekey,
                                $_SERVER["REMOTE_ADDR"],
                                $_POST["recaptcha_challenge_field"],
                                $_POST["recaptcha_response_field"]);
 
  if (!$resp->is_valid) {
    // Ce qu'il se passe si le rentré captcha est invalide
    die ("Le captcha n'a pas été rentré correctement, veuillez réessayer.");
  } else {
    // Votre code pour captcha correctement rentré
  }
  ?>