• 6 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 29/03/2023

Empêchez les attaques par injection SQL

Qu'est-ce qu'une injection SQL ?

Une injection SQL consiste à modifier un paramètre d'entrée que l'on sait être transmis à une instruction SQL brute pour que l'instruction SQL soit exécutée différemment de ce qui était prévu. Pour clarifier cette définition qui, je l'admets volontiers, peut paraître un peu floue, prenons un exemple.

Supposons que vous disposiez d'une base de données contenant deux tables. La première est nommée DonneesNonSensibles : elle contient des données que vous pourriez rendre publiques. L'autre est nommée DonneesSensibles : elle contient les données personnelles des utilisateurs que vous devez protéger.

Disons que vous disposez également d'un endpoint d'API qui accepte en tant que paramètre un identifiant et l'utilise pour récupérer des données dans la table DonneesNonSensibles.

SELECT * FROM DonneesNonSensibles WHERE Id=[valeur transmise]

Créons maintenant un appel à l'endpoint d'API et transmettons la valeur de l'identifiant :

https://mon-endpoint-api.com?Id=23

Cette requête retournera l'enregistrement de la table DonneesNonSensibles dont l'identifiant est 23. Mais que se passerait-il si vous injectiez du texte supplémentaire dans l'URL ?

https://mon-endpoint-api.com?Id=23;drop%20table%20DonneesSensibles

Si votre application n'est pas protégée contre les injections SQL, voici la requête qui sera exécutée :

SELECT * FROM DonneesNonSensibles WHERE Id=23;DROP TABLE DonneesSensibles

Cette attaque est catastrophique, car elle va supprimer toutes les données personnelles de vos utilisateurs de la base de données. Si le pirate connaît le nom de vos autres tables, il pourrait aussi les supprimer de votre base de données.

Empêchez les attaques par injection SQL

Heureusement qu'il est très simple de bloquer ce type d'attaque. Quelques règles suffisent :

  1. Utilisez toujours les procédures de routage .NET lorsque vous créez des endpoints d'API et que vous incluez des entrées utilisateur dans la construction des URL. Le routage .NET standard contribue fortement à l'élimination de ces attaques.

  2. Paramétrez les entrées utilisateurs pour toute API qui accepte des instructions SQL. Vous pouvez inclure des espaces réservés de paramètres dans la chaîne de requête, puis fournir des valeurs de paramètre sous forme d'arguments supplémentaires. Toutes les valeurs de paramètre que vous fournissez sont automatiquement converties en DbParameter, ce qui permet de les contrôler et de les valider efficacement. Par exemple, le bloc de code ci-dessous passe un seul paramètre à une procédure stockée. La valeur fournie est encapsulée dans un paramètre, et le nom du paramètre généré est inséré à la place de l'espace réservé {0} :

var utilisateur = "utilisateurlambda";
var blogs = db.Users
   .FromSql("EXECUTE dbo.GetUserProfile {0}", utilisateur)
   .ToList();

La même requête peut être exécutée avec une interpolation de chaîne, syntaxe prise en charge à partir d'EF Core 2.0 :

var utilisateur = "utilisateurlambda";
var blogs = db.Users
 .FromSql($"EXECUTE dbo.GetUserProfile {utilisateur}")
   .ToList();

Vous pouvez aussi créer un DbParameter pour la requête et la fournir sous forme de valeur de paramètre. Cette méthode vous permet d'utiliser des paramètres nommés dans la chaîne de la requête SQL :

var utilisateur = new SqlParameter("utilisateur", "utilisateurlambda");
var blogs = db.Users
   .FromSql("EXECUTE dbo.GetUserProfile @utilisateur”, utilisateur)
   .ToList();

Toutes ces méthodes offrent une protection suffisante contre les attaques par injection SQL. Pensez à les utiliser dès que vous créez et exécutez des requêtes SQL dans votre code.

En résumé 

Vous avez découvert les différents types d'attaques intersites utilisées par les pirates pour injecter du code malveillant sur des sites Web, mais aussi comment les redirections ouvertes sont utilisées pour inciter les utilisateurs à fournir des informations sensibles. Vous avez également vu comment protéger vos applications .NET Core contre ces attaques.

De plus, vous avez découvert l’injection SQL, une technique utilisée par les pirates pour injecter des instructions SQL brutes dans les paramètres passés aux requêtes sur des bases de données. Enfin, vous avez appris deux règles simples permettant de protéger vos applications contre ces attaques :

  1. Utilisez toujours les procédures de routage .NET lorsque vous créez des endpoints d'API.

  2. Paramétrez toujours les entrées d'utilisateurs.

Maintenant que vous avez terminé la première partie de ce cours, il est temps de tester vos connaissances. Vous êtes prêt ? L'heure est venue de répondre à votre premier quiz !

Exemple de certificat de réussite
Exemple de certificat de réussite