flawopen.com/Rust में SQL injection/sqlx
क्या sqlx की compile-time query जाँच SQL injection रोकती है?
query! compile के समय literal query को वास्तविक database schema से जाँचता है; यह dynamically जोड़ी गई query को बाद में सुरक्षित नहीं बनाता। Values को bound parameters से 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.
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'अक्सर पूछे जाने वाले प्रश्न
यदि literal query और build-time schema की शर्तें आपके project में संभव हों तो query! पसंद करें; इससे compile-time SQL और type जाँच मिलती है। Dynamic query() भी सुरक्षित है जब हर value .bind() से bind हो। दोनों ही स्थितियों में untrusted data को SQL syntax में न जोड़ें।
संदर्भ
- flawopen.com — Rust में SQL injection
- SQLx दस्तावेज़ — query! मैक्रो और डेटाबेस प्लेसहोल्डर
- SQLx दस्तावेज़ — AssertSqlSafe (दावा, sanitization नहीं)