Authentification & sécurité Web
#Authentification & sécurité Web
L'authentification est le processus de vérification de l'identité d'un utilisateur. La sécurité Web implique la protection des applications web contre diverses vulnérabilités.
#Identité, sessions, cookies, JWT
#Sessions
Une session est un mécanisme côté serveur pour suivre l'état d'un utilisateur. Un identifiant de session est généralement stocké dans un cookie.
Login (POST /login)
Le client envoie identifiants au serveur.
Exemple (Python/Flask)
1from flask import Flask, session, request, redirect, url_for2 3app = Flask(__name__)4app.secret_key = 'supersecretkey'5 6@app.route('/login', methods=['POST'])7def login():8 username = request.form['username']9 password = request.form['password']10 # Vérification des identifiants (simplifiée)11 if username == 'admin' and password == 'password':12 session['username'] = username13 return redirect(url_for('dashboard'))14 return 'Invalid credentials'
#Cookies
Les cookies sont de petits fichiers stockés par le navigateur. Ils peuvent être utilisés pour stocker des identifiants de session.
Sécurité des cookies
HttpOnly
: Empêche l'accès via JavaScript (protection contre XSS).Secure
: Cookie uniquement envoyé sur HTTPS.SameSite
: Protection contre CSRF (Strict/Lax).
#JWT (JSON Web Tokens)
JWT est un standard ouvert (RFC 7519) qui définit un moyen compact et autonome de transmettre des informations entre deux parties sous forme d'objets JSON.
Exemple (Python)
1import jwt2import datetime3 4SECRET_KEY = 'supersecretkey'5 6# Création d'un JWT7payload = {8 'user_id': 123,9 'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)10}11token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')12print(token)13 14# Vérification d'un JWT
Visualisateur JWT
{ "alg": "HS256", "typ": "JWT" }
—
#Vulnérabilités courantes et mitigations
#XSS (Cross-Site Scripting)
XSS permet à un attaquant d'injecter du script dans les pages web vues par d'autres utilisateurs.
Exemple de code vulnérable
1<!-- Page vulnérable à XSS -->2<p>Bonjour, {{ username }} !</p>
Si username
contient <script>alert('XSS')</script>
, le script sera exécuté.
Mitigation
- Échapper les sorties : utiliser des bibliothèques comme
htmlspecialchars
en PHP ouescape
dans les templates. - Utiliser des Content Security Policy (CSP).
#CSRF (Cross-Site Request Forgery)
CSRF force un utilisateur authentifié à exécuter des actions non désirées sur une application web.
Exemple
Une victime authentifiée visite un site malveillant qui contient :
1<img src="http://bank.com/transfer?to=attacker&amount=1000" width="0" height="0">
Cela déclenche un transfert d'argent sans le consentement de la victime.
Mitigation
- Utiliser des tokens CSRF : des jetons uniques pour chaque session utilisateur.
- Vérifier l'en-tête
Referer
ouOrigin
. - Utiliser
SameSite
pour les cookies.
#Injections (SQL, NoSQL, LDAP, etc.)
Les injections se produisent lorsque des données non fiables sont envoyées à un interpréteur en tant que commande ou requête.
Exemple d'injection SQL
1# Code vulnérable2query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"
Si username
est ' OR '1'='1
, la requête devient :
1SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '...'
Mitigation
- Utiliser des requêtes préparées (prepared statements).
- Valider et assainir les entrées.
- Limiter les privilèges de la base de données.
#Exercice : Identifier et corriger une vulnérabilité XSS
Voici un extrait de code HTML vulnérable à une attaque XSS. Identifiez la vulnérabilité et proposez une correction.
#Code vulnérable
1<!DOCTYPE html>2<html>3<head>4 <title>Page vulnérable</title>5</head>6<body>7 <h1>Bienvenue, <span id="username"></span> !</h1>8 <script>9 // Simuler la récupération du nom d'utilisateur depuis l'URL10 const urlParams = new URLSearchParams(window.location.search);11 const username = urlParams.get('username');12 document.getElementById('username').innerHTML = username;13 </script>14</body>
#Problème
Le code utilise innerHTML
pour insérer le nom d'utilisateur, ce qui permet à un attaquant d'injecter du script malveillant.
#Correction
Remplacez innerHTML
par textContent
pour empêcher l'exécution de code.
#Code corrigé
1<!DOCTYPE html>2<html>3<head>4 <title>Page sécurisée</title>5</head>6<body>7 <h1>Bienvenue, <span id="username"></span> !</h1>8 <script>9 // Simuler la récupération du nom d'utilisateur depuis l'URL10 const urlParams = new URLSearchParams(window.location.search);11 const username = urlParams.get('username');12 document.getElementById('username').textContent = username;13 </script>14</body>
#Bonnes pratiques générales
- Toujours valider et assainir les entrées utilisateur.
- Utiliser HTTPS partout.
- Mettre en place une politique de sécurité des contenus (CSP).
- Utiliser des bibliothèques et frameworks sécurisés et à jour.
- Effectuer des tests de sécurité réguliers.
- OWASP ZAP : Proxy d'interception et scanner de vulnérabilités.
- Burp Suite : Suite d'outils pour les tests de sécurité web.
- SonarQube : Analyse statique de code pour détecter les vulnérabilités.