Accéder au contenu principal

Bloc 3 SLAM — Cybersécurité

OWASP Top 10, protection des données, RGPD et bonnes pratiques de sécurité applicative

🛡️ OWASP Top 10 — Aide-mémoire

  • A01 — Broken Access Control
    Contrôle d'accès défaillant — vérifier les droits côté serveur
  • A02 — Cryptographic Failures
    password_hash(PASSWORD_ARGON2ID) / HTTPS obligatoire
  • A03 — Injection SQL
    PDO + prepare() + bindParam() — JAMAIS de concaténation
  • A04 — Insecure Design
    Privacy by Design, threat modeling en phase conception
  • A05 — Security Misconfiguration
    Désactiver debug en prod, headers HTTP sécurisés (HSTS, CSP)
  • A06 — Vulnerable Components
    composer update --dry-run, npm audit fix
  • A07 — Auth Failures
    session_regenerate_id(true) après login, tokens JWT signés
  • A08 — Software Integrity Failures
    Vérifier checksums, CI/CD avec signature
  • A09 — Logging Failures
    Logger les accès sensibles, NE PAS logger les mots de passe
  • A10 — SSRF
    Valider et filtrer toutes les URLs fournies par l'utilisateur

💻 Exemples de Code Sécurisé

1. Connexion PDO et requêtes préparées

db_secure.php
php
<?php
// Connexion PDO sécurisée
$dsn = 'mysql:host=localhost;dbname=btssio;charset=utf8mb4';
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $user, $password, $options);

// Requête préparée — protection injection SQL
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->bindParam(':email', $email, PDO::PARAM_STR);
$stmt->execute();
$user = $stmt->fetch();

// Hachage sécurisé du mot de passe
$hash = password_hash($plainPassword, PASSWORD_ARGON2ID);
$valid = password_verify($plainPassword, $hash);

2. Headers HTTP de sécurité

security_headers.php
php
<?php
// Headers de sécurité HTTP — à placer en début de chaque page
header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
header('X-Content-Type-Options: nosniff');
header('X-Frame-Options: DENY');
header('Content-Security-Policy: default-src \'self\'');
header('Referrer-Policy: strict-origin-when-cross-origin');
header('Permissions-Policy: camera=(), microphone=(), geolocation=()');

// Protection CSRF — génération du token
session_start();
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

3. Validation et sanitisation

validation.php
php
<?php
// Validation et sanitisation des entrées
function sanitizeInput(string $input): string {
    $input = trim($input);
    $input = stripslashes($input);
    return htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
}

// Validation email
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if (!$email) {
    throw new InvalidArgumentException('Email invalide');
}

// Upload sécurisé — vérification MIME type réel
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($_FILES['upload']['tmp_name']);
$allowed = ['image/jpeg', 'image/png', 'application/pdf'];
if (!in_array($mimeType, $allowed)) {
    throw new RuntimeException('Type de fichier non autorisé');
}

✅ Quiz de Validation

Question 1 / 7

Une requête SQL construite en concaténant directement les entrées utilisateur expose à quelle type de faille ?

🎤 Préparation à l'Oral

🎤Simulateur d'Oral

Expliquez la différence entre authentification et autorisation.

Question 1 / 7