FlawOpen

flawopen.com/Rust में SQL injection/sqlx

क्या sqlx की compile-time query जाँच SQL injection रोकती है?

संदर्भ पृष्ठ
संक्षिप्त उत्तर

query! compile के समय literal query को वास्तविक database schema से जाँचता है; यह dynamically जोड़ी गई query को बाद में सुरक्षित नहीं बनाता। Values को bound parameters से SQL से अलग रखें।

असुरक्षित — input को SQL में जोड़ें
let user_id: String = read_user_input();
let q = format!(
  "SELECT id FROM users WHERE id = '{}'",
  user_id
);
// Representative only: data and SQL syntax are mixed.
// Never pass user-influenced SQL as AssertSqlSafe.
सुरक्षित — query! से value bind करें
let user_id: &str = read_user_input();
// PostgreSQL; query! checks the configured schema.
sqlx::query!(
  "SELECT id FROM users WHERE id = $1",
  user_id
).fetch_one(&pool).await?

Compile-time जाँच वास्तव में क्या सत्यापित करती है

SQLx 0.9 का query! मैक्रो स्ट्रिंग लिटरल मांगता है और बिल्ड के समय कॉन्फ़िगर किए गए डेटाबेस स्कीमा के विरुद्ध सिंटैक्स, बाइंड पैरामीटर के प्रकार और परिणाम के प्रकार जांचता है; DATABASE_URL सेट करें या संस्करण-नियंत्रित ऑफलाइन मेटाडेटा उपयोग करें। यह कोड उदाहरण PostgreSQL के लिए है, इसलिए प्लेसहोल्डर $1 है। SQLx PostgreSQL और SQLite के लिए $1, जबकि MySQL और MariaDB के लिए स्थितिगत ? प्लेसहोल्डर सुझाता है। SQL संरचना स्थिर या एप्लिकेशन-नियंत्रित होने पर रनटाइम query() में .bind() से मान बांधे जा सकते हैं। SQLx 0.9 में डायनामिक क्वेरी स्ट्रिंग को AssertSqlSafe के जरिए देना होता है; यह केवल सुरक्षा का दावा करता है, स्ट्रिंग को sanitize नहीं करता। अविश्वसनीय इंटरपोलेट किए गए मान वाली स्ट्रिंग को सुरक्षित घोषित करने के लिए इसका उपयोग कभी न करें।

Codebase की जाँच कैसे करें

rg -n 'format!\s*\(|sqlx::query(_as)?\s*\(' --glob '*.rs'

अक्सर पूछे जाने वाले प्रश्न

क्या query() के बजाय हमेशा query! macro उपयोग करना चाहिए?

यदि literal query और build-time schema की शर्तें आपके project में संभव हों तो query! पसंद करें; इससे compile-time SQL और type जाँच मिलती है। Dynamic query() भी सुरक्षित है जब हर value .bind() से bind हो। दोनों ही स्थितियों में untrusted data को SQL syntax में न जोड़ें।

संदर्भ

यह भी देखें SQL इंजेक्शन (CWE-89): यह कैसे काम करता है और हर भाषा में इसे कैसे रोकें — flawopen.com क्या stored procedures SQL injection से सुरक्षित हैं? क्या TypeORM QueryBuilder SQL Injection से सुरक्षित है? Django ORM और SQL Injection: सुरक्षित तरीके Doctrine ORM में SQL Injection: सुरक्षित queries EF Core FromSqlRaw: सुरक्षित पैरामीटरयुक्त SQL FastAPI SQL इंजेक्शन: Pydantic क्या रोकता है और क्या नहीं