FlawOpen

flawopen.com/Referensi/Injeksi SQL FastAPI

Apakah FastAPI mencegah injeksi SQL secara default?

Panduan Python & API
Jawaban singkat

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

Rentan: interpolasi mengubah teks SQL
# 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()
Aman: SQLAlchemy mengikat nilai secara terpisah
# :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

Referensi

Lihat juga SQL Injection (CWE-89): cara kerja dan cara mencegahnya di setiap bahasa — flawopen.com GORM Raw SQL: Cegah Injeksi SQL di Go Apakah Escape Tanda Kutip Cukup untuk Mencegah SQL Injection? Apakah memakai ORM cukup untuk mencegah SQL Injection? Apakah Knex.js aman dari SQL Injection? MyBatis ${} vs #{}: mencegah SQL Injection MySQLi vs PDO: prepared statement yang aman