Introduction : Pourquoi PHP est-il si perfide pour les débutants ?
PHP reste l'un des langages les plus populaires pour le développement web, mais son faible seuil d'entrée conduit souvent à la formation de mauvaises habitudes. Les développeurs débutants, inspirés par la simplicité de la syntaxe, oublient souvent la sécurité, les performances et les normes modernes. Dans cet article, nous allons analyser les principales erreurs des développeurs PHP débutants, qui peuvent transformer votre code en cauchemar pour la maintenance et en vulnérabilité pour les attaques.
Nous ne nous contenterons pas d'énumérer les problèmes — vous verrez des exemples de code en PHP avec des erreurs et leurs versions corrigées. Cela vous aidera à appliquer immédiatement les bonnes pratiques.
1. Ignorer la sécurité : injections SQL et XSS
L'erreur la plus critique est de faire confiance aux données utilisateur. Les débutants insèrent souvent des variables directement dans les requêtes SQL ou les affichent sur la page sans filtrage.
Erreur : Concaténation dans les requêtes SQL
Exemple classique de vulnérabilité :
// INCORRECT : vulnérabilité aux injections SQL
$id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $id";
$result = mysqli_query($link, $query);
Un attaquant peut passer ?id=1 OR 1=1 et obtenir toutes les données de la table.
Solution : Requêtes préparées (PDO)
Utilisez PDO ou mysqli avec des expressions préparées :
// CORRECT : PDO avec requête préparée
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute(['id' => $_GET['id']]);
$result = $stmt->fetchAll();
Erreur : Affichage des données sans échappement (XSS)
Si vous affichez des données de la base ou de $_GET directement, vous risquez une attaque XSS :
// INCORRECT : vulnérabilité XSS
echo "Bonjour, " . $_GET['name'];
Solution : htmlspecialchars
Échappez toujours la sortie :
// CORRECT : échappement HTML
echo "Bonjour, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');
2. Utilisation de constructions et fonctions obsolètes
De nombreux tutoriels vieux de 10 ans enseignent l'utilisation des fonctions mysql_* ou des balises courtes. Ce n'est pas seulement dangereux, mais cela peut aussi ne pas fonctionner sur les hébergements modernes.
Erreur : Fonctions mysql_*
// INCORRECT : extension obsolète
$link = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('test', $link);
Cette extension a été supprimée de PHP 7, et le code plantera simplement avec une erreur.
Solution : Passage à PDO ou MySQLi
// CORRECT : PDO - approche moderne et sécurisée
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
Erreur : Balises courtes
// INCORRECT : peut être désactivé dans php.ini
<? echo "Hello"; ?>
Solution : Uniquement les balises complètes
// CORRECT : utilisez toujours <?php
<?php echo "Hello"; ?>
3. Mauvaise gestion des formulaires et des données
Les développeurs débutants oublient souvent de vérifier si le formulaire a été soumis et utilisent $_REQUEST au lieu de tableaux superglobaux spécifiques.
Erreur : Absence de vérification de la méthode d'envoi
// INCORRECT : le code s'exécute même avec une requête GET
$name = $_POST['name'];
// ... traitement
Solution : Vérification de REQUEST_METHOD
// CORRECT : vérifions que le formulaire a été soumis
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = $_POST['name'] ?? '';
// ... validation et traitement
}
Erreur : Utilisation de $_REQUEST
Le tableau superglobal $_REQUEST combine GET, PO