flawopen.com/Referensi/Injeksi SQL FastAPI
Apakah FastAPI mencegah injeksi SQL secara default?
Pydantic memeriksa apakah nilai cocok dengan tipe masukan yang dinyatakan; Pydantic tidak menulis ulang SQL atau mengubah string Python menjadi parameter basis data. name: str yang sudah divalidasi tetap merupakan teks yang dikendalikan pemanggil. Anggap validasi seperti memeriksa label paket: jenis nilai yang diterima dipastikan, sedangkan pengikatan parameter menyegel nilai di luar lembar instruksi SQL. Pertahankan templat SQL tetap dan kirim nilai secara terpisah melalui SQLAlchemy.
Pola FastAPI yang rentan dan aman
# A string type check does not make input safe inside SQL syntax
@app.get("/users")
def get_users(name: str, db: Session = Depends(get_db)):
query = text(f"SELECT * FROM users WHERE name = '{name}'")
return db.execute(query).fetchall()
# :name is a bind parameter; the value is passed separately
@app.get("/users")
def get_users(name: str, db: Session = Depends(get_db)):
query = text("SELECT * FROM users WHERE name = :name")
return db.execute(query, {"name": name}).fetchall()
Hal yang tidak ditangani pengikatan parameter
Parameter terikat mewakili nilai data, bukan nama tabel, nama kolom, operator SQL, atau arah pengurutan. Jika permintaan harus memilih kolom pengurutan, petakan pilihan tersebut ke daftar izin tetap berisi ekspresi kolom SQLAlchemy; jangan sisipkan string permintaan mentah ke SQL. Parameterisasi juga tidak menggantikan otorisasi: batasi baris yang boleh dibaca pemanggil dan berikan akun basis data hanya hak yang dibutuhkan endpoint.
Daftar periksa pencegahan
- ✓Jangan pernah menginterpolasi data permintaan ke SQLAlchemy
text()atau string eksekusi basis data mentah. - ✓Gunakan parameter terikat bernama dan kirim nilainya secara terpisah, misalnya
db.execute(query, {"name": name}). - ✓Untuk pilihan tabel, kolom, atau pengurutan dinamis, petakan masukan ke daftar izin tetap berisi ekspresi SQLAlchemy yang dikenal.
- ✓Periksa otorisasi tingkat baris secara terpisah dan berikan akun basis data hanya hak yang diperlukan endpoint.
- ✓Utamakan ekspresi SQLAlchemy
select()bila dapat menyatakan kueri dengan jelas; penggunaan ORM tidak membuat SQL mentah yang tidak aman menjadi aman.
Referensi
- FastAPI — Basis Data SQL (Relasional)
- SQLAlchemy — Mengirim parameter dan SQL tekstual
- OWASP — Lembar Pencegahan Injeksi SQL