FlawOpen

flawopen.com/Injection SQL en Rust/sqlx

La vérification des requêtes sqlx à la compilation empêche-t-elle les injections SQL ?

Page de référence
Réponse courte

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.

NON SÛR — interpoler l’entrée dans SQL
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.
SÛR — lier une valeur avec query!
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

Faut-il toujours préférer la macro query! à query() ?

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

À voir aussi Injection SQL (CWE-89) : fonctionnement et prévention dans chaque langage — flawopen.com Les procédures stockées empêchent-elles l’injection SQL ? TypeORM QueryBuilder protège-t-il des injections SQL ? Django ORM et SQL Injection : bonnes pratiques Injection SQL dans Doctrine ORM : requêtes sûres EF Core FromSqlRaw : SQL paramétré sûr FastAPI et SQL Injection : limites de Pydantic