flawopen.com/संदर्भ/FastAPI SQL इंजेक्शन
क्या FastAPI डिफ़ॉल्ट रूप से SQL इंजेक्शन रोकता है?
Pydantic जाँचता है कि कोई मान घोषित इनपुट प्रकार से मेल खाता है या नहीं; यह SQL को दोबारा नहीं लिखता और Python स्ट्रिंग को डेटाबेस पैरामीटर में नहीं बदलता। सत्यापित name: str भी अनुरोधकर्ता के नियंत्रण वाला पाठ है। सत्यापन को पार्सल के लेबल की जाँच समझें: इससे मान का प्रकार पता चलता है। पैरामीटर बाइंडिंग उस मान को SQL निर्देश-पत्र से अलग सीलबंद रखने जैसी है। SQL टेम्पलेट स्थिर रखें और मान SQLAlchemy के माध्यम से अलग भेजें।
FastAPI का असुरक्षित और सुरक्षित तरीका
# 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()
पैरामीटर बाइंडिंग किन चीज़ों को नहीं ढकती
बाउंड पैरामीटर डेटा मान के लिए होता है, तालिका नाम, कॉलम नाम, SQL ऑपरेटर या क्रम दिशा के लिए नहीं। यदि अनुरोध को सॉर्ट फ़ील्ड चुनना हो, तो विकल्प को पहले से तय SQLAlchemy कॉलम अभिव्यक्तियों की अनुमति-सूची से जोड़ें; अनुरोध की कच्ची स्ट्रिंग SQL में न जोड़ें। पैरामीटराइज़ेशन प्राधिकरण का विकल्प भी नहीं है: अनुरोधकर्ता कौन-सी पंक्तियाँ पढ़ सकता है, इसे सीमित करें और डेटाबेस खाते को केवल आवश्यक अनुमतियाँ दें।
रोकथाम जाँच-सूची
- ✓अनुरोध डेटा को SQLAlchemy
text()या कच्ची डेटाबेस निष्पादन स्ट्रिंग में कभी इंटरपोलेट न करें। - ✓नामित बाइंड पैरामीटर लें और मान अलग पास करें, जैसे
db.execute(query, {"name": name})। - ✓डायनेमिक तालिका, कॉलम या सॉर्ट विकल्पों के लिए इनपुट को ज्ञात SQLAlchemy अभिव्यक्तियों की निश्चित अनुमति-सूची से जोड़ें।
- ✓पंक्ति-स्तरीय प्राधिकरण अलग से जाँचें और डेटाबेस खाते को केवल एंडपॉइंट के लिए आवश्यक अनुमतियाँ दें।
- ✓जब SQLAlchemy
select()क्वेरी को स्पष्ट रूप से व्यक्त करे, तो उसे प्राथमिकता दें; ORM का उपयोग असुरक्षित कच्चे SQL को सुरक्षित नहीं बनाता।
संदर्भ
- FastAPI — SQL (रिलेशनल) डेटाबेस
- SQLAlchemy — पैरामीटर भेजना और टेक्स्ट SQL
- OWASP — SQL इंजेक्शन रोकथाम चीट शीट