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 ControlContrô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 DesignPrivacy by Design, threat modeling en phase conception
- A05 — Security MisconfigurationDé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 FailuresVérifier checksums, CI/CD avec signature
- A09 — Logging FailuresLogger les accès sensibles, NE PAS logger les mots de passe
- A10 — SSRFValider 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