Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

contributions:protection_antispam [2013/04/22 17:43] (Version actuelle)
Ligne 1: Ligne 1:
 +====== 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 [[http://pastebin.franceserv.fr|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 [[:mail#les_protections_et_limitations|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 ([[http://fr.wikipedia.org/wiki/Cross-site_scripting|XSS - Cross-site scripting]]) et les attaques se basant sur les failles [[http://fr.wikipedia.org/wiki/CSRF|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 :
 +<code 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>
 +</code>
 +Le fichier commenter.php :
 +<code 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 !)
 +   //...
 +}
 +?>
 +</code>
 +
 +
 +==== La protection du formulaire avec un captcha ====
 +{{ http://www.archive-host.com/files/1473847/eb45c585e6b8d7f43712977d1b949d328fab647b/Modern-captcha.jpg|Capture d'un reCaptcha}}Voici 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 [[http://fr.wikipedia.org/wiki/Captcha|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 ===
 +{{ http://www.archive-host.com/files/1473876/eb45c585e6b8d7f43712977d1b949d328fab647b/smallCaptchaSpaceWithRoughAlpha.png}}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). [[http://www.google.com/recaptcha|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 :
 +
 +{{http://img813.imageshack.us/img813/7604/capture1k.png?500*200|Tutoriel Capture 1}}
 +
 +Indiquez lui l'adresse du site ou sera inséré le captcha, puis validez :
 +
 +{{http://img37.imageshack.us/img37/2647/capture2r.png?500*200|Tutoriel Capture 2}}
 +
 +Ensuite, rendez vous sur la page de formulaire, puis incluez ce code là ou le captcha sera placer :
 +<code html>
 +  <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>
 +(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):
 +<code php>
 +  <?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é
 +  }
 +  ?>
 +</code>