Maison > Article > développement back-end > Comment empêcher l'injection SQL en PHP
Exemple d'injection SQL simple
Par exemple, A a un site Web bancaire. Une interface Web a été mise à disposition des clients de la banque pour consulter leurs numéros de compte et leurs soldes. Le site Web de votre banque utilise des URL telles que http://example.com/get_account_details.php?account_id=102 pour extraire les détails de la base de données.
Par exemple, le code pour get_account_details.php ressemble à ceci :
$accountId = $_GET['account_id']; $query = "SELECT accountNumber, balance FROM accounts WHERE accountId = $accountId";
Le customer accountId est transmis en tant que account_id via la chaîne de requête. Identique à l'URL ci-dessus, si l'identifiant de compte de l'utilisateur est 102 et qu'il est transmis dans la chaîne de requête. Le script Php créera la requête ci-dessous.
$query = "SELECT accountNumber, balance FROM accounts WHERE accountId = 102";
accountId 102 obtient le numéro de compte et les détails du solde et les fournit au client.
Recommandations associées : "tutoriel php"
Supposons un autre scénario dans lequel le client intelligent a transmis le account_id, tout comme la chaîne de requête 0 OU 1=1. Que se passe-t-il maintenant ? Le script PHP créera la requête ci-dessous et l'exécutera sur la base de données.
$query = "SELECT accountNumber, balance FROM accounts WHERE accountId = 0 OR 1=1";
Affichez la requête créée à partir des résultats renvoyés par le script et la base de données. Vous pouvez voir que cette requête renvoie tous les comptes et soldes disponibles.
C'est ce qu'on appelle l'injection SQL. C'est un moyen simple, mais il existe de nombreuses façons d'effectuer une injection SQL. Voyons comment utiliser le pilote PHP MySQLi et le pilote PHP PDO pour empêcher l'injection SQL.
Utilisation du pilote PHP-MySQLi
Vous pouvez utiliser les instructions préparées par le pilote PHP-MySQLi pour éviter ces types d'injections SQL.
Le code PHP pour empêcher l'injection SQL est le suivant :
$accountId = $_GET['account_id']; if ($stmt = $mysqli->prepare('SELECT accountNumber, balance FROM accounts WHERE accountId = ?')) { $stmt->bind_param("s", $accountId); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // do something here } $stmt->close(); }
Utilisez le pilote PHP-PDO
Vous pouvez utiliser l'instruction de préparation du pilote PHP-PDO pour évitez ces types d’injections SQL.
Le code PHP pour résoudre le problème d'injection SQL ci-dessus est le suivant :
$accountId = $_GET['account_id']; if ($stmt = $pdo->prepare('SELECT accountNumber, balance FROM accounts WHERE accountId = :accountId')) { $stmt->execute(array('name' => $name)); foreach ($stmt as $row) { // do something here } $stmt->close(); }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!