MySQL injection est un acte d'insertion déclaration MySQL dans une base de données à l'insu du propriétaire de la base de données . Il est généralement fait en exploitant les champs de saisie des utilisateurs qui ne sont pas protégées correctement . Au lieu de fournir véritable entrée que propriétaire de la base de données a demandé , l'utilisateur injecte une déclaration MySQL qui modifie le comportement de la requête de donner la capacité de l'utilisateur injection pour manipuler la base de données . MySQL injections
La meilleure façon de comprendre et d'apprendre ce injection MySQL doesis vraiment à jeter un oeil à un exemple . L'un des moyens populaires de l'aide MySQLinjections est de contourner les contrôles connexion à des sites Web. Voici un exemple de awebsite qui utilise le formulaire ci-dessous pour authentifier l'utilisateur :
Photos
après avoir appuyé soumettre des données entrées est ensuite envoyé à la page userlogin.php qui reçoit et passe par une requête sur la base de données pour vérifier le niveau d' accès utilisateur a et s'il est entré le nom d'utilisateur et mot de passe .
< ? $ username = $ _POST [ 'username' ] ; $ password = $ _POST [ 'password' ] ; $ query = " SELECT nom d'utilisateur , mot de passe des utilisateurs WHERE username = ' $ username' et le mot de passe = ' $ password '"; ? > Photos
Ce type de formulaire de connexion est grande ouverte à l'exploitation par des attaques par injection SQL . Pour accéder au site à tout utilisateur peut insérer du code ci-dessous : 'OR 1 = 1 - nom d'utilisateur et ' OR 1 = 1 pour mot de passe
requêtes va maintenant ressembler à ceci: $ query = " SELECT nom d'utilisateur . , mot de passe des utilisateurs WHERE username ='' OR1 = 1 - 'et password = '' OR 1 = 1 " ;
Cette requête sélectionnera nom d'utilisateur et mot de passe des utilisateurs , où les noms d'utilisateur ou mot de passe n'existent pas ( '' partie) ou si un égale un. Comme un égale un dans tous les cas, la sécurité de la base de données est compromise. Deux tirets avant apostrophe ont été ajoutés pour rendre MySQL ignorer apostrophe qui est désormais superflu . C'est juste un type d'attaque par injection MySQL. Une autre variante de cette attaque est de GetAccess à plus d'informations que l'utilisateur est autorisé à .
Maintenant, regardez un exemple où un propriétaire de base de données utilise suivant queryto obtenir des données pour affichage sur la page d'information du compte utilisateur .
< P > $ query = "SELECT * FROM utilisateurs WHERE username = '$ name' " ;
Si ce genre de requête n'est pas protégé utilisateur malveillant est capable de input'OR 1 = 1 - pour contourner les check nom d'utilisateur. $ query = "SELECT * FROM utilisateurs WHERE username = '' OR 1 = 1 - '"; . Cette requête va maintenant pas sélectionner uniquement les données de l'utilisateur, mais les données de tous les utilisateurs dans le tableau «utilisateurs»
< br >
protection contre MySQL injections
Il ya plusieurs façons de se protéger contre MySQL injections . En fait, les injections SQL sont des menaces que si le développeur a ignoré la menace et ont échoué dans la protection de son code. La meilleure façon de se protéger contre les injections en PHP et MySQL combinaison est d'utiliser la fonction PHP: " mysql_real_escape_string "
Revenons au premier exemple <$ username = $ _POST [ 'username' ] ; $ . . ? password = $ _POST [ 'password' ] ; $ query = " SELECT nom d'utilisateur , mot de passe des utilisateurs WHERE username = ' $ username' et le mot de passe = ' $ password '"; ? > Photos
Pour protéger contre les injections MySQL utilisations directes des entrées utilisateur doivent befiltered par " mysql_real_escape_string " . Fonction " mysql_real_escape_string " n'échappera tous les caractères spéciaux SQL suppression possibilité de changer le comportement de notre requête
<$ username = mysql_real_escape_string ( $ _POST [ 'username' ] ) ; . ? $ Password = mysql_real_escape_string ( $ _POST [ ,"'password' ] ) ; $ query = " SELECT nom d'utilisateur , mot de passe des utilisateurs WHERE username = ' $ username ' et '$ password' password = " ; ? >