FlawOpen

flawopen.com/SQL Injection/Um ORM basta?

Usar um ORM basta para prevenir injeção SQL?

Página de referência
Resposta rápida

Um ORM é como uma cozinha que prepara pedidos a partir de um formulário: o construtor normal mantém os valores separados. Um atalho de SQL bruto é outra entrada, com regras próprias. Verifique a API exata antes de confiar em valores interpolados.

INSEGURO — texto do usuário no 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.
SEGURO — vincule com 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.

O padrão, em todo ORM

Construtores de consulta ORM e APIs de SQL bruto não formam uma única fronteira de segurança. A documentação oficial mostra vinculação segura em Django raw(sql, params), SQLAlchemy text() com parâmetros separados, condições com placeholders no Rails, EF Core FromSql (7+) / FromSqlInterpolated, GORM Raw(sql, args...) e $queryRaw com template tag no Prisma. As APIs brutas variam: FromSqlRaw é seguro com parâmetros separados, mas não se texto do usuário for inserido na string SQL; $queryRawUnsafe também pode vincular valores separadamente, mas concatenar texto não confiável continua inseguro. O nome do método não comprova como ele trata os valores. Vincule cada dado pelo mecanismo documentado. Identificadores SQL e estrutura da consulta não podem ser parâmetros; escolha-os de uma lista fixa controlada pela aplicação. Os guias abaixo mostram cada contrato.

O que "basta" realmente exige

FAQ

Métodos de SQL bruto são sempre inseguros?

Não. Algumas APIs de SQL bruto vinculam valores fornecidos separadamente, e APIs seguras podem receber valores interpolados como parâmetros. FromSql do EF Core 7+ aceita um FormattableString interpolado; FromSqlRaw exige parâmetros separados. $queryRawUnsafe do Prisma também pode vincular valores, mas não sanitiza o texto SQL que você montar. Verifique o contrato do método e mantenha valores não confiáveis fora da estrutura SQL.

Referências

Veja também SQL Injection (CWE-89): como funciona e como evitar em todas as linguagens — flawopen.com Knex.js é seguro contra SQL Injection? MyBatis ${} vs #{}: evitar SQL Injection MySQLi vs PDO: prepared statements seguros NHibernate protege contra SQL Injection? MongoDB NoSQL Injection: filtros de consulta seguros String de IDs numéricos também pode causar SQL Injection?