Aller au contenu principal

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.

Étape 1/4

Login (POST /login)

Le client envoie identifiants au serveur.

Client
Navigateur
Serveur
App + Session store
Astuce: utiliser HttpOnly, Secure et SameSite (Lax/Strict) sur le cookie de session. Pour API cross-site, préférez des jetons non-cookie et/ou un flux OAuth.

Exemple (Python/Flask)

pythonpython
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)

pythonpython
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

Header
{
  "alg": "HS256",
  "typ": "JWT"
}
JWT
Token = base64url(header).base64url(payload).base64url(HMAC-SHA256(signingInput, secret))

#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

htmlhtml
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 ou escape 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 :

htmlhtml
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 ou Origin.
  • 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

pythonpython
1# Code vulnérable2query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"

Si username est ' OR '1'='1, la requête devient :

sqlsql
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

htmlhtml
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é

htmlhtml
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.
Outils de sécurité
  • 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.