Comment empêcher l'injection SQL en PHP

Comment empêcher l'injection SQL en PHP

Ce tutoriel vous aidera à empêcher l'injection de SQL dans PHP. Dans ce tutoriel d'abord, vérifiez un exemple de base du processus d'injection SQL. Comment les utilisateurs peuvent-ils voler des données sur votre site Web à l'aide de l'injection SQL? Ce tutoriel comprend également des méthodes pour empêcher l'injection SQL à l'aide de pilotes PHP-Mysqli et PHP-PDO.

Exemple d'injection SQL simple

Par exemple, A a un site Web pour la banque. Vous avez fourni une interface Web aux clients bancaires pour afficher leur numéro de compte et leur solde. Votre site Web bancaire utilise une URL comme http: // Exemple.com / get_account_details.php?account_id = 102 pour récupérer les détails de la base de données.

Par exemple get_account_details.php avoir du code quelque chose comme ci-dessous.

$ accoud = $ _get ['account_id']; $ query = "Select CompteDumber, Balance From Comptes Where AccountId = $ compteID";
12$ compteID = $ _get ['account_id']; $ query = "select accountNumber, Balance From Comptes Where AccountId = $ accoudID";

Clients AccountID est passé via la chaîne de requête en tant que compte_id. Comme l'URL ci-dessus, si l'ID du compte d'un utilisateur 102 et qu'il est passé dans la chaîne de requête. Le script PHP créera une requête comme ci-dessous.

$ query = "select compteNumber, solde from comptes où compteId = 102";
1$ query = "select compteNumber, solde from comptes où compteId = 102";
Détails récupérés pour le compte spécifié.

Les détails du nombre de comptes et du solde sont récupérés pour CompteID 102 et fournis aux clients comme indiquant dans la capture d'écran ci-dessus.

Supposons, supposons un autre scénario - un client trop intelligent a dépassé Account_id comme 0 ou 1 = 1 Dans la chaîne de requête. Que se passera-t-il maintenant? Le script PHP créera une requête comme ci-dessous et exécutée dans la base de données.

$ Query = "Select AccountNumber, Solde From Comptes Where AccountId = 0 ou 1 = 1";
1$ Query = "Select AccountNumber, Solde From Comptes Where AccountId = 0 ou 1 = 1";
Détails récupérés pour tous les comptes

Regardez la requête créée par le script et le résultat renvoyé par la base de données. Vous pouvez voir que cette requête a renvoyé tout le numéro des comptes et le solde disponible.

C'est ce qu'on appelle l'injection SQL. C'est le scénario simple, il peut y avoir un certain nombre de méthodes pour faire des injections SQL. Un tutoriel ci-dessous vous aidera à empêcher l'injection SQL à l'aide de PHP MySQLI Driver et PHP PDO pilote.

#1. Utilisation du pilote PHP-Mysqli

Vous pouvez utiliser des instructions préparées au conducteur PHP-Mysqli pour éviter ce type d'injections SQL. Utilisez ci-dessous le code PHP qui empêchera l'injection SQL.

$ accoud = $ _get ['account_id']; if ($ stmt = $ mysqli-> prépare ('select compterNumber, solde from comptes où compteId = ?')) $ stmt-> bind_param ("s", $ accoudId); $ stmt-> execute (); $ result = $ stmt-> get_result (); while ($ row = $ result-> fetch_assoc ()) // faire quelque chose ici $ stmt-> close ();
12345678910111213141516$ accoud = $ _get ['account_id']; if ($ stmt = $ mysqli-> prépare ('select compterNumber, solde from comptes où compteId = ?')) $ stmt-> bind_param ("s", $ accoudId); $ stmt-> execute (); $ result = $ stmt-> get_result (); while ($ row = $ result-> fetch_assoc ()) // faire quelque chose ici $ stmt-> close ();

# 2. Utilisation du pilote PHP-PDO

Vous pouvez utiliser des instructions PHP-PDO Préparez pour éviter ce type d'injections SQL. Utiliser le code PHP ci-dessous qui résoudra les injections SQL au-dessus.

$ accoud = $ _get ['account_id']; if ($ stmt = $ pDo-> Préparer ('select compterNumber, Balance From Comptes Where AccountId =: AccountId')) $ stmt-> EXECUTE (array ('name' => $ name)); foreach ($ stmt comme $ row) // faire quelque chose ici $ stmt-> close ();
123456789101112$ accoud = $ _get ['account_id']; if ($ stmt = $ pDo-> Préparer ('select compterNumber, Balance From Comptes Where AccountId =: AccountId')) $ stmt-> EXECUTE (array ('name' => $ name)); foreach ($ stmt comme $ row) // faire quelque chose ici $ stmt-> close ();