Objectifs du module :

  • Apprendre les techniques pour valider et sécuriser les données des utilisateurs.
  • Comprendre les risques liés aux attaques par injection (SQL, XSS, etc.) et comment les prévenir.
  • Savoir comment traiter les caractères spéciaux pour éviter des vulnérabilités courantes.

1. Validation des données côté serveur et côté client

Importance de la validation des entrées :

Chaque point d’entrée dans une application est une potentielle source de vulnérabilité. Valider les données en entrée permet de s’assurer qu’elles respectent des formats attendus, prévenant ainsi un certain nombre d’attaques.

Validation côté serveur :

Pourquoi ? Les données envoyées par le client ne sont jamais fiables. Même si une validation est faite côté client, elle peut être contournée. La validation côté serveur est donc impérative pour protéger les données.

Pratiques recommandées :

  • Valider systématiquement tous les champs utilisateurs (formulaires, API, etc.).
  • Utiliser des expressions régulières pour valider les formats de données (e-mails, numéros de téléphone, etc.).
  • Rejeter les entrées qui ne respectent pas les formats attendus.

Validation côté client :

Pourquoi ? Elle permet une meilleure expérience utilisateur en détectant et en corrigeant des erreurs avant l’envoi des données au serveur.

Pratiques recommandées :

  • Utiliser des fonctionnalités natives HTML5 pour valider des types d’entrées (ex. : input type="email").
  • Implémenter des règles de validation via JavaScript pour plus de flexibilité.
  • Ne jamais s’appuyer uniquement sur la validation côté client pour des raisons de sécurité.

2. Prévention des injections SQL, XSS, et autres attaques courantes

Les attaques par injection exploitent des failles dans la gestion des entrées et sorties des applications. Voici les principaux types d'attaques et les moyens de les prévenir :

a. Prévention des injections SQL

Description :
Une injection SQL se produit lorsque des entrées utilisateur non validées sont directement intégrées dans des requêtes SQL. Un attaquant peut ainsi injecter du code malveillant qui sera exécuté par la base de données.

Exemple d'attaque :
Un champ de formulaire de recherche permettant d’entrer ' OR 1=1 --, ce qui retourne tous les enregistrements d’une base de données.

Méthodes de prévention :

  • Utiliser des requêtes préparées avec des paramètres liés : SELECT * FROM users WHERE username = ?.
  • Éviter la concaténation des données utilisateur dans les requêtes SQL.
  • Utiliser des ORM (Object-Relational Mapping) qui encapsulent la création de requêtes SQL et réduisent le risque d’injections.

Vidéo de Fransosiche:

b. Prévention des attaques XSS (Cross-Site Scripting)

Description :
Le XSS se produit lorsque des données malveillantes sont injectées dans un site web et exécutées par le navigateur de la victime. Cela permet à un attaquant d’injecter du code JavaScript dans une page.

Exemple d'attaque :
Un champ de commentaire qui accepte du texte brut, et qui rend un script malveillant <script>alert('hacked!')</script> exécuté par le navigateur.

Méthodes de prévention :

  • Échapper les sorties HTML en désinfectant les données affichées à l’utilisateur (par exemple, transformer < en &lt;).
  • Filtrer les entrées pour s’assurer que seuls certains types de contenu sont autorisés (par exemple, uniquement du texte, pas de balises HTML).
  • Utiliser des bibliothèques de filtrage sécurisées comme DOMPurify pour JavaScript.

Vidéo de Fransosiche:

c. Prévention des attaques CSRF (Cross-Site Request Forgery)

Description :
Une attaque CSRF consiste à tromper un utilisateur authentifié pour qu’il exécute des actions non désirées sur une application web où il est connecté.

Exemple d'attaque :
Un lien malveillant envoyé par e-mail ou dans un site web tiers qui, lorsqu’il est cliqué, déclenche une action (comme changer un mot de passe) sur un autre site où l’utilisateur est déjà connecté.

Méthodes de prévention :

  • Utiliser des jetons CSRF : Inclure un token unique dans les formulaires pour valider l'origine de la requête.
  • Valider les requêtes entrantes pour s'assurer qu'elles proviennent de la bonne origine (référents HTTP).
  • Implémenter SameSite cookies qui empêchent l'envoi de cookies avec des requêtes cross-site.

Vidéo de Alphorm:

d. Autres attaques courantes (Command Injection, Directory Traversal, etc.)

Command Injection :
Survient lorsque des données utilisateur sont utilisées directement dans des commandes du système d’exploitation. Les entrées doivent toujours être validées et des appels systèmes sécurisés (comme exec() ou system()) doivent être évités.

Directory Traversal :
Cette attaque consiste à manipuler des chemins de fichiers pour accéder à des fichiers en dehors du répertoire autorisé (ex. : ../../etc/passwd). Il faut vérifier les chemins fournis par l’utilisateur et utiliser des mécanismes sécurisés comme realpath() pour gérer les fichiers.

Vidéo de UBIKA:

3. Filtrage et évasion des caractères spéciaux

Les caractères spéciaux peuvent introduire des vulnérabilités lorsque les entrées ne sont pas correctement filtrées ou échappées. Il est essentiel de bien gérer ces caractères pour prévenir les attaques comme l'injection SQL ou XSS.

Filtrage des caractères spéciaux :
Pour les entrées utilisateur, il est important de filtrer ou rejeter les caractères qui ne sont pas explicitement nécessaires. Par exemple, un champ de nom ne doit pas accepter les caractères de balises HTML ou des caractères potentiellement malveillants (<, >, ;, etc.).

Échapper les caractères spéciaux :

  • Dans les bases de données : Utiliser des fonctions spécifiques à la base de données pour échapper les caractères spéciaux dans les requêtes SQL.
  • Dans les sorties HTML : Utiliser des fonctions d’échappement spécifiques aux langages et frameworks pour empêcher le rendu de balises HTML injectées (&lt;, &gt;, &amp; pour remplacer <, >, et &).

Bibliothèques et frameworks :
Utiliser des bibliothèques éprouvées pour automatiser le filtrage et l’échappement des caractères spéciaux, comme HTMLPurifier pour PHP, ou des fonctions d’échappement natives dans des frameworks comme Django, Flask, ou Laravel.

Conclusion du Module :

La sécurisation des inputs et outputs est une pierre angulaire de la sécurité applicative. En validant systématiquement les entrées utilisateur, en échappant les sorties, et en appliquant des méthodes de prévention contre les injections et les attaques courantes, les développeurs peuvent significativement réduire la surface d'attaque de leurs applications.

Formateur

Bertrand LECLERCQ

Consultant DevSecOps & Data Engineer


Avec 25 ans d'expérience dans le développement logiciel et une certification en Data Engineering de l'École des Mines Paris - PSL, je suis passionné par la cybersécurité, le big data et le DevOps. J'aime partager mes connaissances et aider la communauté à renforcer sa posture de sécurité.

J'ai créé une base de vulnérabilités librement accessible et je me forme en continu sur des plateformes comme TryHackMe. Mon objectif ? Démocratiser la cybersécurité et permettre à chacun de mieux comprendre les enjeux.

J'ai une solide expertise dans la conception et le déploiement de solutions sécurisées, ainsi qu'une expérience éprouvée dans la gestion de projets complexes. Maîtrisant un large éventail de technologies (Python, Go, Java, Docker, Kubernetes, etc.), je suis convaincu que la sécurité doit être intégrée dès le début du cycle de développement.

Le projet NoHackMe vous permet d'effectuer une veille Cyber, vous permet de découvrir le monde de la Cybersécurité ainsi qu'une section formation Cyber

Soutenez No Hack Me sur Tipeee