flawopen.com/Injeção SQL em Go/GORM Raw SQL e injeção SQL
GORM Raw() é seguro contra injeção SQL? Vinculação de parâmetros em Go
Pense no placeholder como um envelope fechado para um valor: o driver envia o valor separado das instruções SQL. GORM Raw() pode vincular o valor com segurança se o placeholder ficar na consulta e o valor for passado como argumento. Formatar entrada do usuário dentro da string SQL mistura o envelope às instruções e pode alterar a consulta.
// Entrada controlada pelo usuário vira sintaxe SQL db.Raw(fmt.Sprintf( "SELECT * FROM users WHERE id = %s", userID, )).Scan(&user)
// O driver vincula userID como valor db.Raw( "SELECT * FROM users WHERE id = ?", userID, ).Scan(&user)
SQL Raw seguro e vinculação de parâmetros no GORM
GORM e database/sql do Go vinculam valores quando os placeholders permanecem no SQL e os argumentos são passados separadamente, por exemplo db.Where("name = ?", userInput) ou db.Raw("SELECT ... WHERE id = ?", userID). Um placeholder representa um valor, não sintaxe SQL: nomes de tabelas, colunas, direções de ordenação e operadores não ficam seguros ao vinculá-los como valores. Escolha identificadores dinâmicos de uma allowlist fixa. Métodos como Order, Select, Table e Raw podem permitir injeção se a entrada do usuário for concatenada em seus fragmentos SQL.
- ✓Mantenha a estrutura SQL fixa e passe cada valor controlado pelo usuário em um argumento de placeholder separado.
- ✓Escolha nomes dinâmicos de tabela, coluna e ordenação em allowlists fixas mantidas pela aplicação.
- ✓Revise métodos de fragmento SQL como
Raw,Exec,Order,SelecteTableem busca de concatenação ou formatação. - ✓Converta identificadores numéricos para o tipo Go esperado e trate erros antes da consulta.
Como procurar no código
rg -n --glob '*.go' '\.(Raw|Exec|Order|Select|Table)\s*\(' .
rg -n --glob '*.go' 'fmt\.(Sprintf|Sprint)' .Perguntas frequentes sobre GORM Raw SQL e vinculação de parâmetros
Não. Condições que passam valores separadamente, como Where("name = ?", input), usam vinculação de parâmetros. Concatenar a entrada na condição ou passá-la como sintaxe SQL bruta ainda permite injeção. Alguns métodos aceitam identificadores ou fragmentos SQL que não são escapados; revise os argumentos e use allowlists para a estrutura dinâmica.
Não. Placeholders representam valores de dados. Para identificadores ou direções de ordenação dinâmicos, escolha opções fixas definidas pela aplicação e insira somente a constante validada na estrutura SQL.
Fontes oficiais e referências
- GORM — métodos sujeitos a injeção SQL
- GORM — SQL Raw e consultas parametrizadas
- flawopen.com — injeção SQL em Go