FlawOpen

flawopen.com/SQL Injection/Un ORM suffit-il ?

Utiliser un ORM suffit-il à prévenir l'injection SQL ?

Page de référence
Réponse courte

Un ORM ressemble à une cuisine qui prépare les commandes depuis un formulaire : son constructeur habituel sépare les valeurs. Un raccourci SQL brut est une autre entrée, avec ses propres règles. Vérifiez l’API avant de faire confiance aux valeurs interpolées.

DANGEREUX — texte utilisateur dans le SQL de FromSqlRaw
var sql = $"SELECT * FROM dbo.Blogs WHERE Url = '{url}'";
var rows = await context.Blogs
    .FromSqlRaw(sql)
    .ToListAsync();
// User text is inserted into SQL before execution.
SÛR — lier avec FromSql (EF Core 7+)
var rows = await context.Blogs
    .FromSql($"SELECT * FROM dbo.Blogs WHERE Url = {url}")
    .ToListAsync();
// EF Core 7+: interpolation becomes a SQL parameter.

Le schéma, dans tous les ORM

Les constructeurs ORM et les API SQL brutes ne forment pas une frontière de sécurité uniforme. La documentation décrit la liaison sûre des valeurs avec Django raw(sql, params), SQLAlchemy text() et ses paramètres séparés, les marqueurs Rails, EF Core FromSql (7+) / FromSqlInterpolated, GORM Raw(sql, args...) et $queryRaw balisé de Prisma. Les API diffèrent : FromSqlRaw est sûr avec des paramètres séparés, mais pas si du texte utilisateur est inséré dans la chaîne SQL ; $queryRawUnsafe peut aussi lier des valeurs séparément, mais concaténer du texte non fiable reste dangereux. Le nom d’une méthode ne prouve pas comment elle traite les valeurs. Liez chaque donnée selon le mécanisme documenté. Les identifiants et la structure SQL ne sont pas paramétrables ; choisissez-les dans une liste fixe contrôlée par l’application. Les guides ci-dessous détaillent ces contrats.

Ce que « suffire » exige réellement

FAQ

Les méthodes SQL brutes sont-elles toujours dangereuses ?

Non. Certaines API SQL brutes lient les valeurs fournies séparément, et des API sûres reçoivent des valeurs interpolées comme paramètres. FromSql d’EF Core 7+ accepte un FormattableString interpolé ; FromSqlRaw exige des paramètres séparés. $queryRawUnsafe de Prisma peut aussi lier des valeurs, mais n’assainit pas le SQL construit. Vérifiez le contrat et gardez les valeurs non fiables hors de la structure SQL.

Références

À voir aussi Injection SQL (CWE-89) : fonctionnement et prévention dans chaque langage — flawopen.com Knex.js protège-t-il contre les injections SQL ? MyBatis ${} et #{} : prévenir la SQL Injection MySQLi vs PDO : prepared statements sûres NHibernate protège-t-il contre les injections SQL ? Injection NoSQL MongoDB : filtres sûrs Un ID numérique peut-il aussi provoquer une injection SQL ?