FlawOpen

flawopen.com/SQL Injection di Python/SQLAlchemy

Apakah SQLAlchemy text() aman dari SQL Injection?

Panduan referensi
Jawaban singkat

Parameter terikat seperti kartu nilai tersegel pada formulir kueri: SQLAlchemy meneruskan pernyataan SQL dan pemetaan parameternya ke DBAPI di bawahnya, sehingga nilai tetap di luar ekspresi SQL yang dirangkai kode Anda. Driver DBAPI menangani pengikatan khusus basis data, jadi cara pengiriman di jaringan dapat berbeda. text() menerima teks SQL, tetapi tidak menyaring atau membuat parameter untuk nilai yang sudah Anda interpolasikan ke dalam teks tersebut.

TIDAK AMAN — interpolasikan input ke SQL
stmt = text(
  f"SELECT id FROM users WHERE id = {user_id}"
)
rows = conn.execute(stmt)
DIPERKUAT — ikat nilai dan batasi struktur SQL
stmt = text(
  "SELECT id FROM users WHERE id = :id"
)
rows = conn.execute(stmt, {"id": user_id})

# Bind values, not identifiers. Choose any
# selectable column from a fixed application map.
columns = {"name": users.c.name,
           "created": users.c.created_at}
column = columns.get(requested_sort, users.c.created_at)
stmt = select(users.c.id).order_by(column)
rows = conn.execute(stmt)

Fungsi text() dan batasnya

text() membuat konstruksi SQL tekstual; ia tidak membersihkan string yang sudah berisi input hasil interpolasi. Nyatakan placeholder nilai dalam SQL, lalu kirim nilai secara terpisah ke Connection.execute() atau Session.execute(). API ekspresi Core SQLAlchemy mengikat nilai literal Python bila sesuai, tetapi fragmen tekstual tetap merupakan sintaks SQL. Parameter tidak dapat menggantikan nama tabel, kolom, atau arah pengurutan. Petakan struktur pilihan pengguna ke ekspresi SQLAlchemy tetap. Parameterisasi mencegah SQL Injection, tetapi tidak menggantikan otorisasi atau validasi aturan bisnis.

Cara mengaudit codebase

rg -n 'text\(|\.execute\(' --glob '*.py' .

Pertanyaan umum

Apakah query builder Core dan ORM SQLAlchemy selalu aman?

Keduanya mengikat nilai Python dalam konstruksi ekspresi normal, tetapi keamanan bergantung pada cara statement dibuat. Tinjau SQL tekstual, konstruksi SQL literal, dan identifier dinamis. Tidak ada API yang dapat membuat string SQL aman setelah input digabungkan ke dalamnya.

Referensi

Lihat juga SQL Injection (CWE-89): cara kerja dan cara mencegahnya di setiap bahasa — flawopen.com Apakah pemeriksaan query sqlx saat kompilasi mencegah SQL injection? 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