flawopen.com/SQL Injection di Python/SQLAlchemy
Apakah SQLAlchemy text() aman dari SQL Injection?
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.
stmt = text(
f"SELECT id FROM users WHERE id = {user_id}"
)
rows = conn.execute(stmt)
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
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
- Tutorial SQLAlchemy 2.0 — Mengirim Parameter
- Tutorial SQLAlchemy 2.0 — Ekspresi SQL dan SQL tekstual
- OWASP — Pencegahan SQL Injection
- flawopen.com — SQL Injection di Python