Recherche…


Introduction

L'injection SQL est une tentative d'accéder aux tables de base de données d'un site Web en injectant du code SQL dans un champ de formulaire. Si un serveur Web ne protège pas contre les attaques par injection SQL, un pirate peut amener la base de données à exécuter le code SQL supplémentaire. En exécutant leur propre code SQL, les pirates peuvent mettre à niveau l’accès à leur compte, consulter les informations privées de quelqu'un d’autre ou apporter d’autres modifications à la base de données.

Échantillon d'injection SQL

En supposant que l'appel du gestionnaire de connexion de votre application Web ressemble à ceci:

https://somepage.com/ajax/login.ashx?username=admin&password=123

Maintenant, dans login.ashx, vous lisez ces valeurs:

strUserName = getHttpsRequestParameterString("username");
strPassword = getHttpsRequestParameterString("password");

et interrogez votre base de données pour déterminer si un utilisateur avec ce mot de passe existe.

Donc, vous construisez une chaîne de requête SQL:

txtSQL = "SELECT * FROM Users WHERE username = '" + strUserName + "' AND password = '"+ strPassword +"'";

Cela fonctionnera si le nom d'utilisateur et le mot de passe ne contiennent pas de devis.

Cependant, si l'un des paramètres contient un devis, le SQL qui est envoyé à la base de données ressemblera à ceci:

-- strUserName = "d'Alambert";
txtSQL = "SELECT * FROM Users WHERE username = 'd'Alambert' AND password = '123'";

Cela entraînera une erreur de syntaxe, car la citation après le d dans d'Alambert termine la chaîne SQL.

Vous pouvez corriger cela en échappant aux guillemets dans le nom d'utilisateur et le mot de passe, par exemple:

strUserName = strUserName.Replace("'", "''");
strPassword = strPassword.Replace("'", "''");

Cependant, il est plus approprié d'utiliser les paramètres:

cmd.CommandText = "SELECT * FROM Users WHERE username = @username AND password = @password";

cmd.Parameters.Add("@username", strUserName);
cmd.Parameters.Add("@password", strPassword);

Si vous n'utilisez pas de paramètres et que vous oubliez de remplacer quote par une seule des valeurs, un utilisateur malveillant (aka hacker) peut l'utiliser pour exécuter des commandes SQL sur votre base de données.

Par exemple, si un attaquant est mauvais, il / elle définira le mot de passe pour

lol'; DROP DATABASE master; -- 

et alors le SQL ressemblera à ceci:

"SELECT * FROM Users WHERE username = 'somebody' AND password = 'lol'; DROP DATABASE master; --'";

Malheureusement pour vous, il s'agit d'un code SQL valide, et la base de données l'exécutera!

Ce type d'exploitation s'appelle une injection SQL.

Un utilisateur malveillant peut faire bien d'autres choses, comme voler l'adresse électronique de chaque utilisateur, voler le mot de passe de chacun, voler des numéros de carte de crédit, voler une quantité de données dans votre base de données, etc.

C'est pourquoi vous devez toujours échapper à vos ficelles.
Et le fait que vous oubliez invariablement de le faire tôt ou tard est exactement la raison pour laquelle vous devez utiliser des paramètres. Parce que si vous utilisez des paramètres, votre framework de langage de programmation fera tout ce qui est nécessaire pour vous échapper.

échantillon d'injection simple

Si l'instruction SQL est construite comme ceci:

SQL = "SELECT * FROM Users WHERE username = '" + user + "' AND password ='" + pw + "'";
db.execute(SQL);

Un pirate pourrait alors récupérer vos données en donnant un mot de passe comme pw' or '1'='1 ; l'instruction SQL qui en résultera sera:

SELECT * FROM Users WHERE username = 'somebody' AND password ='pw' or '1'='1'

Celui-ci passera la vérification du mot de passe pour toutes les lignes de la table Users car '1'='1' est toujours vrai.

Pour éviter cela, utilisez les paramètres SQL:

SQL = "SELECT * FROM Users WHERE username = ? AND password = ?";
db.execute(SQL, [user, pw]);


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow