FlawOpen

flawopen.com/SQL Injection di Rust/sqlx

Apakah pemeriksaan query sqlx saat kompilasi mencegah SQL injection?

Halaman referensi
Jawaban singkat

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.

TIDAK AMAN — sisipkan input ke 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.
AMAN — bind nilai dengan 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?

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

Haruskah selalu menggunakan macro query! daripada query()?

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

Lihat juga SQL Injection (CWE-89): cara kerja dan cara mencegahnya di setiap bahasa — flawopen.com Apakah stored procedure kebal terhadap SQL injection? Apakah TypeORM QueryBuilder aman dari SQL Injection? Django ORM SQL Injection: pola aman Injeksi SQL Doctrine ORM: kueri aman EF Core FromSqlRaw: SQL berparameter yang aman Injeksi SQL FastAPI: Yang Dicegah dan Tidak Dicegah Pydantic