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
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.
// Le texte utilisateur devient de la syntaxe SQL db.Raw(fmt.Sprintf( "SELECT * FROM users WHERE id = %s", userID, )).Scan(&user)
// 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.
- ✓Gardez la structure SQL fixe et transmettez chaque valeur utilisateur dans un argument de paramètre distinct.
- ✓Choisissez les noms de table, de colonne et de tri dynamiques dans des listes blanches définies par l’application.
- ✓Vérifiez les méthodes à fragments SQL comme
Raw,Exec,Order,SelectetTablepour repérer concaténation et formatage. - ✓Convertissez les identifiants numériques vers le type Go attendu et traitez les erreurs avant la requête.
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
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.
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
- GORM — méthodes exposées à l’injection SQL
- GORM — SQL brut et requêtes paramétrées
- flawopen.com — injection SQL en Go