flawopen.com/SQL Injection di Rust/sqlx
Apakah pemeriksaan query sqlx saat kompilasi mencegah SQL injection?
query! memvalidasi query literal terhadap skema database sebenarnya saat kompilasi; fitur ini tidak membuat query dinamis menjadi aman setelah dirangkai. Pisahkan nilai dari SQL menggunakan parameter terikat.
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?
Apa yang sebenarnya divalidasi pemeriksaan saat kompilasi
Makro query! SQLx 0.9 memerlukan literal string dan saat build memeriksa sintaks, tipe parameter terikat, serta tipe hasil terhadap skema database yang dikonfigurasi; atur DATABASE_URL atau gunakan metadata offline yang disimpan dalam version control. Contoh kode ini khusus PostgreSQL: placeholder-nya $1. SQLx merekomendasikan $1 untuk PostgreSQL dan SQLite; MySQL dan MariaDB memakai placeholder posisi ?. Fungsi runtime query() dapat mengikat nilai dengan .bind() jika struktur SQL tetap atau dikendalikan aplikasi. Di SQLx 0.9, string kueri dinamis harus diberikan melalui AssertSqlSafe; tipe itu hanya menyatakan kueri aman, bukan menyanitasi string. Jangan pernah memakainya untuk mengesahkan string yang berisi nilai tak tepercaya hasil interpolasi.
Cara memeriksa codebase
rg -n 'format!\s*\(|sqlx::query(_as)?\s*\(' --glob '*.rs'Pertanyaan umum
Utamakan query! jika persyaratan query literal dan skema saat build sesuai dengan proyek; macro ini menambahkan pemeriksaan SQL dan tipe saat kompilasi. query() dinamis juga aman jika setiap nilai di-bind dengan .bind(). Dalam kedua cara, jangan sisipkan data tak tepercaya ke sintaks SQL.
Referensi
- flawopen.com — SQL Injection di Rust
- Dokumentasi SQLx — makro query! dan placeholder per database
- Dokumentasi SQLx — AssertSqlSafe (pernyataan, bukan sanitasi)