Maison  >  Article  >  développement back-end  >  Comment empêcher l'injection SQL en PHP

Comment empêcher l'injection SQL en PHP

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼original
2019-09-27 16:15:353162parcourir

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn