SQL Échantillon d'injection SQL


Exemple

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.