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

Comment empêcher l'injection SQL en PHP

墨辰丷
墨辰丷original
2018-05-25 11:00:436834parcourir

Cet article présente principalement comment empêcher l'injection SQL en PHP. Il a une très bonne valeur de référence

1. Qu'est-ce qu'une attaque par injection SQL ?

L'attaque dite par injection SQL se produit lorsque l'attaquant insère des commandes SQL dans un Formulaire Web. Saisissez une chaîne de requête pour une demande de domaine ou de page afin d'inciter le serveur à exécuter une commande SQL malveillante. Dans certains formulaires, le contenu saisi par l'utilisateur est directement utilisé pour construire (ou affecter) des commandes SQL dynamiques, ou est utilisé comme paramètres d'entrée pour des procédures stockées. De tels formulaires sont particulièrement vulnérables aux attaques par injection SQL. Les processus d'attaque par injection SQL courants incluent :

⑴ Une application Web ASP.NET possède une page de connexion. Cette page de connexion contrôle si l'utilisateur est autorisé à accéder à l'application. Entrez un nom et un mot de passe. ⑵ Le contenu saisi dans la page de connexion sera directement utilisé pour construire des commandes SQL dynamiques, ou directement utilisé comme paramètres de procédures stockées. Voici un exemple d'application ASP.NET construisant une requête :

⑶ Le l'attaquant est dans l'utilisateur. Entrez quelque chose comme "' ou '1'='1" dans les zones de saisie du nom et du mot de passe.
 System.Text.StringBuilder query = new System.Text.StringBuilder("SELECT * from Users WHERE login = '")。Append(txtLogin.Text)。Append("' AND password='")。Append(txtPassword.Text)。Append("'");

⑷ Une fois le contenu saisi par l'utilisateur soumis au serveur, le serveur exécute le code ASP.NET ci-dessus pour construire la commande SQL pour interroger l'utilisateur , mais parce que l'attaquant a entré le contenu est très spécial, donc la commande SQL finale devient : SELECT * from Users WHERE login = '' ou '1'='1' AND password = '' ou '1'='1'.

⑸ Le serveur exécute une requête ou une procédure stockée pour comparer les informations d'identité saisies par l'utilisateur avec les informations d'identité enregistrées sur le serveur.

⑹ La commande SQL ayant effectivement été modifiée par une attaque par injection, l'identité de l'utilisateur ne peut pas être véritablement authentifiée, le système autorisera donc de manière incorrecte l'attaquant.

Si un attaquant sait que l'application utilisera directement le contenu saisi dans le formulaire pour les requêtes d'authentification, il tentera de saisir des chaînes SQL spéciales pour falsifier la requête et modifier son original fonction pour inciter le système à accorder l’accès. Selon l'environnement du système, les dommages qu'un attaquant peut causer sont également différents, qui sont principalement déterminés par les autorisations de sécurité de l'application pour accéder à la base de données. Si le compte de l'utilisateur dispose de droits d'administrateur ou d'autres droits relativement avancés, l'attaquant peut effectuer diverses opérations sur les tables de la base de données qu'il souhaite effectuer, notamment l'ajout, la suppression ou la mise à jour de données, voire la suppression directe de la table.

2. Comment l'empêcher ?

Heureusement, il n'est pas particulièrement difficile d'empêcher les applications ASP.NET d'être piratées par des attaques par injection SQL. vous utilisez Avant de construire la commande SQL à partir du contenu d’entrée du formulaire, filtrez simplement tout le contenu d’entrée. Le filtrage des entrées peut être effectué de différentes manières.

(1) Pour construire dynamiquement des requêtes SQL, la technologie suivante peut être utilisée :

Premièrement : Remplacez les guillemets simples, c'est-à-dire remplacez tous les guillemets simples par deux guillemets simples pour empêcher les attaquants de modifier la signification des commandes SQL. En regardant à nouveau l'exemple précédent, "SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'" obtiendra évidemment le même "SELECT * from Users WHERE login = '' ou '1'='1' AND password = '' ou '1'='1'" des résultats différents.

Deuxièmement : Supprimez tous les traits d'union dans le contenu des entrées utilisateur pour empêcher les attaquants de construire des classes telles que "SELECT * from Users WHERE login = 'mas' — — AND password =''" et d'autres requêtes, car la seconde moitié de ce type de requête a été commentée et n'est plus valide. L'attaquant a seulement besoin de connaître un nom de connexion d'utilisateur légal et n'a pas du tout besoin de connaître le mot de passe de l'utilisateur. Accédez-y.

Troisième : Limiter les autorisations du compte de base de données utilisé pour exécuter les requêtes. Utilisez différents comptes d'utilisateurs pour effectuer des opérations de requête, d'insertion, de mise à jour et de suppression. En isolant les opérations pouvant être effectuées par différents comptes, il évite que l'endroit initialement utilisé pour exécuter la commande SELECT soit utilisé pour exécuter la commande INSERT, UPDATE ou DELETE.

(2) Utilisez des procédures stockées pour exécuter toutes les requêtes. La manière dont les paramètres SQL sont transmis empêchera les attaquants d'utiliser des guillemets simples et des traits d'union pour mener des attaques. En outre, il permet également de restreindre les autorisations de la base de données pour autoriser uniquement l'exécution de procédures stockées spécifiques. Toutes les entrées utilisateur doivent être conformes au contexte de sécurité de la procédure stockée appelée, de sorte que les attaques par injection soient difficiles à produire.

(3) Limiter la longueur de la saisie du formulaire ou de la chaîne de requête. Si le nom de connexion de l'utilisateur ne comporte qu'un maximum de 10 caractères, n'acceptez pas plus de 10 caractères saisis dans le formulaire. Cela augmentera considérablement la difficulté pour les attaquants d'insérer du code nuisible dans les commandes SQL.

(4) Vérifiez la légalité de la saisie de l'utilisateur et assurez-vous que le contenu saisi ne contient que des données légales. L'inspection des données doit être effectuée à la fois côté client et côté serveur - la validation côté serveur est effectuée pour compenser la sécurité fragile du mécanisme de validation côté client.

Côté client, il est tout à fait possible pour un attaquant d'obtenir le code source de la page web, de modifier le script qui vérifie la légalité (ou de supprimer directement le script), puis soumettre du contenu illégal via le formulaire modifié au serveur. Par conséquent, la seule façon de garantir que l’opération de vérification a réellement été effectuée est d’effectuer également une vérification côté serveur. Vous pouvez utiliser de nombreux objets de validation intégrés, tels que RegularExpressionValidator, qui peuvent générer automatiquement des scripts côté client pour la validation, et bien sûr, vous pouvez également insérer des appels de méthode côté serveur. Si vous ne trouvez pas d'objet de validation prêt à l'emploi, vous pouvez en créer un vous-même via CustomValidator.

(5) Cryptez et enregistrez le nom de connexion, le mot de passe et d'autres données de l'utilisateur. Chiffrer les données saisies par l'utilisateur puis les comparer avec les données enregistrées dans la base de données équivaut à « stériliser » les données saisies par l'utilisateur. Les données saisies par l'utilisateur n'ont plus de signification particulière pour la base de données, cela empêche donc. empêcher les attaquants d'injecter des commandes SQL. La classe System.Web.Security.FormsAuthentication possède un HashPasswordForStoringInConfigFile, qui est très approprié pour nettoyer les données d'entrée.

(6) Vérifiez le nombre d'enregistrements renvoyés par la requête qui extrait les données. Si le programme exige qu'un seul enregistrement soit renvoyé, mais que l'enregistrement effectivement renvoyé comporte plusieurs lignes, il sera traité comme une erreur.

(7) Utilisation d'instructions préparées

Ce qui précède est tout le contenu de ce article, j'espère qu'il sera utile à l'étude de chacun.


Recommandations associées :

Explication détaillée de l'exemple de code de construction de point d'injection php

Exemples d'injection php

Compréhension approfondie de l'injection d'objets PHP Outil d'injection php Outil d'analyse d'injection de site Web php Injection manuelle php

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