API'nin Tüm Kullanıcı Şifrelerini Sızdırdığını Haftalar Sonra Fark Ettim
Anas Issath'ın yazısında anlatılan olay basit ama tehlikeli: bir FastAPI endpoint'i, kullanıcı verisi döndürürken veritabanındaki HER ALANI istemeden açığa çıkarıyor.
Endpoint'in kodu zararsız görünüyor. Kullanıcıyı getir, döndür. Frontend'in ihtiyacı olan name, email var. Kimse sorgulamıyor. Ama haftalarca sonra, birisi tarayıcının ağ sekmesini açıp JSON yanıtına bakıyor, ve donup kalıyor. Şifre hash'i, is_admin bayrağı, internal_notes alanı. Veritabanındaki her sütun, her istekte client'a gidiyor.
Sorun şu: endpoint tam olarak söylendiği gibi davranıyor. Hiç hata yok. Ama sen ona "user nesnesini döndür" dediğinde, ORM (SQLAlchemy, Tortoise vb.) tüm alanları ekliyor. Güvenlik kontrol mekanizması yok.
Çözüm bir satır: Pydantic model'i kullan. Sadece açığa çıkarmak istediğin alanları tanımla.
1from pydantic import BaseModel23class UserResponse(BaseModel):4id: int5username: str6email: str78class Config:9from_attributes = True1011@app.get("/users/{user_id}", response_model=UserResponse)12async def get_user(user_id: int):13user = await db.get_user(user_id)14return userArtık dönen JSON sadece id, username, email içeriyor. password_hash, is_admin, internal_notes gidiyor. Pydantic response_model'i, döndürdüğün nesneyi otomatik filtreler.
Bu tür hata, geliştirme sırasında hiç göze çarpmıyor çünkü frontend'in ihtiyacı olan veri var. Ama adli bilişim veya siber güvenlik açısından bakınca, hassas veri sızıntısı demek. Hacker'lar bu tür açıkları otomatik araçlarla tarar.
Kuralı basit tut: veritabanı şeması ≠ API yanıtı. Her endpoint için açık bir response model yaz. Hiçbir istisna yok.
0 yorum