Aller au contenu

Base

Côté client

  • Utiliser les validations côté client
  • Éviter l’injection HTML (XSS) : toujours échapper les contenus dynamiques
  • Limiter les informations exposées : pas de données sensibles dans le DOM, les URL ou le localStorage.

Côté serveur

  • Validation des entrées : Toujours nettoyer et filtrer les données entrantes.

  • Prévention des injections SQL : Utiliser des requêtes préparées.

  • Authentification sécurisée : Hashage des mots de passe, jamais de mot de passe en clair

  • Limiter les messages d’erreur : Pas de détails en production.

Sécurisation de formulaire

Un formulaire accessible sans authentification doit être protégé contre un usage abusif par des robots.

Il faut pouvoir distinguer la soumission d'un formulaire par un être humain d'un robot.

Utilisation de Captcha

Captcha

  • requiert une librairie ou une API (exemple: reCaptcha de Google, hCaptcha, FriendlyCaptcha)

  • problème accessibilité: lecture difficile des caractères déformés => présence parfois de la possibilité d'écouter la lecture des caractères

  • nécessite une opération supplémentaire de l'utilisateur

  • protection non fiable dans le temps => nécessité de mettre à jour régulièrement la librairie

Sécurisation sans Captcha

Aucune méthode de sécurisation n'est fiable à 100%, il faut diversifier les précautions comme:

Champ "honeypot"

Ajout d'un champ avec label masqué (par CSS en feuille de style externe !)

Le champ de saisie est un champ factice uniquement destiné à tromper les robots. Il sera masqué visuellement et en le remplissant, le robots destiné à vous spammer se trahira lui-même.

<?php 
    /*fichier contact.php*/    
    (...)
      if (!empty($_POST['info'])) {
        $message .= "Requête refusée : trop d\infos !<br>";
        $valid = false;
      }
    (...)
?>
(...)
    <form method="post" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>">
        <label class="info"><span></span><input type="text" name="info" value=""/></label>  
        <label><span>Votre nom d'utilisateur:</span><input type="text" name="newuser" value=""/></label>
        <label><span>Votre adresse courriel:</span><input type="courriel" name="email" value=""/></label>
        <button type="submit" name="buttNewUser">Envoyer</button>
    </form>
(...)

/*fichier style.css*/
(...)
label.info {
    display: none;
}
(...)

Vérification HTTP_REFERER

Vérification de l'adresse qui soumet la requête (attention: dépendance de l'adresse d'hébergement !)

<?php
    /*fichier contact.php*/
    (...)
    function checkOrigin($url){
        $urlSegments = explode("/", $url);
        return (count($urlSegments) > 3 && 
                $urlSegments[2].'/'.$urlSegments[3] === '192.168.128.13/~p150107') ? true : false;
    }
    (...)
    if (!checkOrigin($_SERVER['HTTP_REFERER'])) {
        $message .= "Requête refusée : origine incorrecte !<br>";
        $valid = false;
    }
    (...) 

Filtrage HTML / hyperliens

Vérification de la présence d'hyperlien ou de code HTML dans les champs textes

<?php 
    /*fichier contact.php*/
    (...)
    $data = $_POST['newuser'].$_POST['email'];
    if ($data != strip_tags($data)) {
        $message .= "Requête refusée : texte avec balises !<br>";
        $valid = false;
    }
    (...)

Javascript

  • Refuser une soumission moins de 10s après l'affichage du formulaire
  • Créer les champs de formulaire à la volée

  • Facile à contourner par des robots modernes ou via des outils headless comme Puppeteer

  • Injuste pour utilisateurs très rapides ou avec auto-remplissage

CSRF Token

Qu'est-ce qu'une attaque CSRF ?

Une attaque CSRF (Cross-Site Request Forgery), ou falsification de requête inter-sites, consiste à tromper un site web pour qu’il exécute une action à la place d’un utilisateur authentifié, sans son consentement.

Elle exploite deux éléments :

  • Le fait que le navigateur envoie automatiquement les cookies de session avec chaque requête.
  • L’absence de mécanisme de vérification de l’origine de la requête

*Contre-mesures *

  • Utiliser des CSRF Tokens (jetons aléatoires, uniques par formulaire).
  • Refuser les requêtes POST sans ce jeton valide.
  • Ajouter une vérification d'origine (header Origin ou Referer).
  • En complément : limiter la durée des sessions, vérifier les actions sensibles.

Exemples

Formulaire de contact d’un site public

Le pirate intègre un script dans un site tiers qui soumet le formulaire à répétition.

Cela génère du spam, surcharge le serveur ou exécute une injection si le formulaire est mal filtré.

But de l’attaque : exploiter l’ouverture du formulaire (sans authentification) pour saturer ou manipuler le système.

Contre-mesures : Champ honeypot / Temporisation JS / Filtrage HTML

Uilisateur connecté

Un utilisateur est connecté à son compte sur un site de vente en ligne.

  • Il visite un site malveillant dans un autre onglet
  • Ce site envoie automatiquement une requête POST vers le site marchand, modifiant l’adresse de livraison enregistrée.
  • Le site de vente, utilisant les cookies de session, pense que la requête est légitime.
  • Lors de la prochaine commande, les produits sont envoyés à l’adresse du pirate.

But de l’attaque : détourner une commande ou provoquer une fraude logistique

Contre-mesure : intégrer un CSRF Token dans tous les formulaires liés aux données sensibles

Tableau comparatif

🛡️ Méthode ✅ Efficacité ♿ Accessibilité ⚙️ Simplicité d'implémentation Remarques critiques
CAPTCHA Moyenne à forte Faible Moyenne à faible Dépendance à un tiers, accessibilité médiocre
Champ "honeypot" Moyenne Excellente Très simple Contournable par bots avancés, mais très utile combiné à d'autres
Vérification HTTP_REFERER Faible Excellente Simple Facile à falsifier, ne doit pas être utilisé seul
Temps minimum de soumission Faible à moyenne Bonne Moyenne Injuste pour les utilisateurs rapides ou avec auto-remplissage
Champs dynamiques JS Moyenne Moyenne à bonne Moyenne Inefficace si JS désactivé, utile combiné à d’autres techniques
CSRF Token Forte Excellente Moyenne Indispensable pour les formulaires authentifiés
Filtrage HTML / hyperliens Moyenne Excellente Moyenne Bonne mesure de base, mais ne protège pas contre les bots
  • Aucune méthode n’est parfaite seule : combinaison recommandée
  • Accessibilité doit toujours être prise en compte

OWASP

Allez plus loin :

OWASP – Open Worldwide Application Security Project

  • Organisation à but non lucratif fondée en 2001.

  • Objectif : améliorer la sécurité des logiciels dans le monde entier.

  • Fournit des ressources gratuites et ouvertes à tous (développeurs, architectes, enseignants…).

Ressources principales :

  • OWASP Top 10 : Classement des 10 risques de sécurité applicative les plus critiques.

  • Cheat Sheet Series : Fiches pratiques pour appliquer les bonnes pratiques de sécurité.

  • ZAP : Outil gratuit d’analyse de vulnérabilités web (scanner proxy).

  • ASVS (Application Security Verification Standard) : Guide d’audit de sécurité logiciel.

  • Juice Shop : Application volontairement vulnérable pour l’apprentissage.

Référence officielle >>