FlawOpen

flawopen.com/Injection SQL en Go/GORM Raw SQL et injection SQL

GORM Raw() protège-t-il contre l’injection SQL ? Paramètres liés en Go

CWE-89: SQL InjectionPage de référence
Réponse courte

Imaginez le paramètre comme une enveloppe scellée pour une valeur : le pilote envoie cette valeur séparément des instructions SQL. GORM Raw() peut la lier en toute sécurité si le paramètre reste dans la requête et si la valeur est passée séparément. Formater une entrée utilisateur dans la chaîne SQL mélange l’enveloppe aux instructions et peut modifier la requête.

NON SÛR
// Le texte utilisateur devient de la syntaxe SQL
db.Raw(fmt.Sprintf(
  "SELECT * FROM users WHERE id = %s",
  userID,
)).Scan(&user)
SÛR
// Le pilote lie userID comme valeur
db.Raw(
  "SELECT * FROM users WHERE id = ?",
  userID,
).Scan(&user)

SQL brut GORM sûr et liaison de paramètres

GORM et database/sql de Go lient les valeurs lorsque les paramètres restent dans le SQL et que les arguments sont fournis séparément, par exemple db.Where("name = ?", userInput) ou db.Raw("SELECT ... WHERE id = ?", userID). Un paramètre représente une valeur, pas de la syntaxe SQL : les noms de table et de colonne, les tris et les opérateurs ne sont pas protégés par une liaison de valeur. Choisissez les identifiants dynamiques dans une liste blanche fixe. Des méthodes comme Order, Select, Table et Raw peuvent être vulnérables si l’entrée est concaténée dans leurs fragments SQL.

Rechercher dans le code

rg -n --glob '*.go' '\.(Raw|Exec|Order|Select|Table)\s*\(' . rg -n --glob '*.go' 'fmt\.(Sprintf|Sprint)' .

FAQ sur GORM Raw SQL et les paramètres

Les méthodes chaînables de GORM sont-elles toujours sûres ?

Non. Les conditions qui transmettent les valeurs séparément, comme Where("name = ?", input), utilisent la liaison de paramètres. Concaténer l’entrée dans la condition ou la fournir comme syntaxe SQL brute peut encore injecter une requête. Certaines méthodes acceptent des identifiants ou fragments SQL non échappés ; vérifiez leurs arguments et utilisez des listes blanches pour la structure dynamique.

Un paramètre peut-il lier un nom de table ou de colonne ?

Non. Les paramètres représentent des valeurs. Pour un identifiant ou un tri dynamique, choisissez parmi des options fixes définies par l’application et insérez uniquement la constante validée dans la structure SQL.

Sources officielles et références

À voir aussi Injection SQL (CWE-89) : fonctionnement et prévention dans chaque langage — flawopen.com Échapper les guillemets suffit-il contre SQL Injection ? Utiliser un ORM suffit-il à prévenir l'injection SQL ? 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 ?