1. Injection SQL
Problème : Insertion de requêtes SQL malveillantes via des entrées utiliasteur, compromettant les bases de données.
Protections :
- Privilégier les requêtes paramétrées avec PDO ou MySQLi
- Éviter la concaténation directe dans les requêtes SQL
// Exemple avec PDO
$connexion = new PDO('mysql:host=serveur;dbname=ma_base', 'identifiant', 'motdepasse');
$requete = $connexion->prepare('SELECT * FROM clients WHERE email = :email');
$requete->bindValue(':email', $_POST['email']);
$requete->execute();
$donnees = $requete->fetchAll();
2. Cross-Site Scripting (XSS)
Problème : Exécution de scripts malveillants dans le navigateur des utilisateurs via du contenu non filtré.
Protections :
- Échapper systématiquement les sorties HTML
- Implémenter une politique de sécurité de contenu (CSP)
// Échappement des données
print htmlspecialchars($contenu_utilisateur, ENT_QUOTES | ENT_HTML5, 'UTF-8');
3. Cross-Site Request Forgery (CSRF)
Problème : Forçage des utilisateurs à exécuter des actions non désirées via leur session authentifiée.
Protectinos :
- Utiliser des jetons anti-CSRF uniques par session
- Valider l'origine des requêtes critiques
// Génération et vérification de jeton
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!hash_equals($_SESSION['jeton_csrf'], $_POST['jeton'])) {
exit('Requête invalide');
}
}
$_SESSION['jeton_csrf'] = bin2hex(random_bytes(32));
4. Inclusion de fichiers
Problème : Chargement non contrôlé de fichiers locaux ou distants via des paramètres utilisateur.
Protections :
- Restreindre les inclusions avec une liste blanche
- Configurer open_basedir dans php.ini
// Validation par liste blanche
$fichiers_autorises = ['accueil.php', 'contact.php'];
$fichier = basename($_GET['fichier']);
if (in_array($fichier, $fichiers_autorises, true)) {
include __DIR__ . "/$fichier";
}
5. Détournement de session
Problème : Vol d'identifiants de session pour usurper des comptes utilisateurs.
Protections :
- Activer les flags Secure et HttpOnly pour les cookies
- Régénérer les identifiants de session après authentification
// Configuration sécurisée
session_set_cookie_params([
'httponly' => true,
'secure' => true
]);
session_start();
session_regenerate_id();
6. Validation des entrées
Problème : Exploitation de données non validées pour des attaques diverses (commandes système, uploads malveillants).
Protections :
- Filtrer et valider strictement toutes les entrées
- Contrôler les types MIME des fichiers uploadés
// Validation d'email
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if (!$email) {
throw new Exception('Format email invalide');
}
// Restrictions d'upload
$extensions_permises = ['jpg', 'png'];
$extension = pathinfo($_FILES['fichier']['name'], PATHINFO_EXTENSION);
if (in_array($extension, $extensions_permises, true)) {
move_uploaded_file($_FILES['fichier']['tmp_name'], 'chemin_securise/fichier.' . $extension);
}
7. Configuration serveur
Problème : Exposition d'informations sensibles via des paramètres PHP inadaptés.
Protections :
- Désactiver l'affichage des erreurs en production (display_errors=Off)
- Maintenir PHP et ses dépendances à jour
Bonnes praitques fondamentales
- Principe du moindre privilège pour les comptes de base de données
- Hachage robuste des mots de passe (password_hash/password_verify)
- Audits réguliers avec outils comme OWASP ZAP
- Formation continue sur les risques OWASP Top 10