flawopen.com/Injection SQL en Rust/sqlx
La vérification des requêtes sqlx à la compilation empêche-t-elle les injections SQL ?
query! vérifie une requête littérale par rapport au schéma réel de la base pendant la compilation ; cela ne rend pas sûre après coup une requête assemblée dynamiquement. Séparez les valeurs du SQL à l’aide de paramètres liés.
let user_id: String = read_user_input();
let q = format!(
"SELECT id FROM users WHERE id = '{}'",
user_id
);
// Representative only: data and SQL syntax are mixed.
// Never pass user-influenced SQL as AssertSqlSafe.
let user_id: &str = read_user_input();
// PostgreSQL; query! checks the configured schema.
sqlx::query!(
"SELECT id FROM users WHERE id = $1",
user_id
).fetch_one(&pool).await?
Ce que vérifie réellement le contrôle à la compilation
La macro query! de SQLx 0.9 exige une chaîne littérale et vérifie la syntaxe, les types des paramètres et ceux du résultat par rapport au schéma configuré lors de la compilation ; configurez DATABASE_URL ou des métadonnées hors ligne versionnées. Cet exemple cible PostgreSQL : le marqueur est $1. SQLx recommande $1 pour PostgreSQL et SQLite ; MySQL et MariaDB utilisent des marqueurs positionnels ?. La fonction d’exécution query() peut lier des valeurs avec .bind() lorsque la structure SQL est fixe ou contrôlée par l’application. Avec SQLx 0.9, une chaîne dynamique doit passer par AssertSqlSafe ; ce type affirme seulement que la requête est sûre, il ne nettoie pas la chaîne. Ne l’utilisez jamais pour valider une chaîne contenant des valeurs non fiables interpolées.
Comment examiner votre base de code
rg -n 'format!\s*\(|sqlx::query(_as)?\s*\(' --glob '*.rs'Questions fréquentes
Préférez query! si ses exigences de requête littérale et de schéma disponible à la compilation conviennent au projet ; elle ajoute la vérification du SQL et des types. Une requête dynamique query() est également sûre si toutes les valeurs sont liées avec .bind(). Dans les deux cas, n’interpolez jamais des données non fiables dans la syntaxe SQL.
Références
- flawopen.com — Injection SQL en Rust
- Documentation SQLx — macro query! et marqueurs par moteur
- Documentation SQLx — AssertSqlSafe (assertion, pas assainissement)