Swift सबसे आगे: क्यों सुरक्षा कोई विकल्प नहीं, बल्कि ज़रूरत है
\nआप Swift में कोड लिखते हैं, परफॉरमेंस और कोड की खूबसूरती पर गर्व करते हैं। लेकिन क्या आपने कभी सोचा है कि आपका ऐप हमलों के लिए कितना संवेदनशील है? SQL इंजेक्शन और XSS (क्रॉस-साइट स्क्रिप्टिंग) सिर्फ किताबों की डरावनी कहानियां नहीं हैं। ये असली खतरे हैं जो आपके यूज़र्स का डेटा, आपकी प्रतिष्ठा और पैसे खर्च कर सकते हैं।
\nइस लेख में हम जानेंगे कि Swift ऐप (चाहे वह iOS क्लाइंट हो या Vapor पर सर्वर-साइड) को दो सबसे खतरनाक हमलों से कैसे बचाया जाए। कोई बेकार की बात नहीं — सिर्फ व्यावहारिक उदाहरण, तैयार समाधान और लाइव कोड। चलिए शुरू करते हैं!
\n\nSwift में SQL इंजेक्शन: हैकर्स डेटाबेस को कैसे 'बेवकूफ' बनाते हैं
\nकल्पना करें: एक यूज़र टेक्स्ट फील्ड में '; DROP TABLE Users; -- टाइप करता है। अगर आप इस स्ट्रिंग को सीधे SQL क्वेरी में डालते हैं, तो डेटाबेस डिलीट कमांड चला देगा। यह क्लासिक उदाहरण है।
Swift में यह कमजोरी अक्सर सर्वर फ्रेमवर्क (Vapor, Kitura) या Core Data और SQLite के असुरक्षित रैपर के साथ काम करते समय दिखती है।
\n\nखतरनाक उदाहरण: कैसे न करें
\nimport SQLite\n\nlet username = userInput.text // "admin' OR '1'='1"\nlet query = "SELECT * FROM users WHERE name = '\\(username)'"\ntry db.execute(query) // खतरा! हैक की गई क्वेरी\n\nयह कोड बैल के सामने लाल कपड़ा है। हमलावर किसी भी डेटा तक पहुंच सकता है या टेबल को नष्ट कर सकता है।
\n\nसही तरीका: पैरामीटराइज़्ड क्वेरी
\nसुनहरा नियम: यूज़र डेटा को कभी भी सीधे क्वेरी स्ट्रिंग में न डालें। पैरामीटराइज़ेशन का उपयोग करें।
\nimport SQLite\n\nlet db = try Connection("path/to/db.sqlite3")\nlet users = Table("users")\nlet name = Expression<String>("name")\n\nlet username = userInput.text // "admin' OR '1'='1"\nlet query = users.filter(name == username) // सुरक्षित\nlet result = try db.prepare(query)\n\nSQLite.swift लाइब्रेरी खुद स्पेशल कैरेक्टर्स को एस्केप करती है। Vapor के साथ Fluent का उपयोग करते समय मॉडल और फिल्टर का उपयोग करें:
\nimport Fluent\nimport Vapor\n\nstruct UserController: RouteCollection {\n func login(req: Request) async throws -> String {\n let input = try req.content.decode(LoginRequest.self)\n // Fluent अपने आप क्वेरी को पैरामीटराइज़ करता है\n let user = try await User.query(on: req.db)\n .filter(\\.$name == input.username)\n .first()\n return user?.name ?? "Not found"\n }\n}\n\nमहत्वपूर्ण: अगर आप Vapor में raw SQL का उपयोग करते हैं, तो पैरामीटर बाइंड करने के लिए SQLBind का उपयोग करें।
ORM और Core Data: सुरक्षा का भ्रम
\nकई डेवलपर्स मानते हैं कि Core Data या Fluent अपने आप इंजेक्शन से बचाते हैं। यह सच है — अगर आप स्ट्रिंग फॉर्मेटिंग के साथ NSExpression या raw SQL का उपयोग नहीं करते। लेकिन याद रखें: स्ट्रिंग इंटरपोलेशन से बना कोई भी NSPredicate जोखिम भरा है।
// खतरनाक\nlet predicate = NSPredicate(format: "name == %@", userInput) // सुरक्षित?\n// नहीं! अगर userInput में '%' है, तो सब्स्टीट्यूशन के जरिए इंजेक्शन हो सकता है।\n\nहमेशा वेरिएबल के साथ %@ का उपयोग करें, न कि %K का, और कभी भी \\() के जरिए स्ट्रिंग न डालें।
Swift में XSS हमले: जब हमलावर JavaScript डालता है
\nXSS एक हमला है जिसमें यूज़र के ब्राउज़र में दुर्भावनापूर्ण स्क्रिप्ट चलती है। iOS ऐप्स के लिए, XSS तब प्रासंगिक होता है जब HTML कंटेंट दिखाने के लिए WKWebView का उपयोग किया जाता है (जैसे न्यूज़ फीड या चैट में)।
असली परिदृश्य: HTML फॉर्मेटिंग वाला चैट
\nयूज़र लिखता है: नमस्ते! <script>alert('XSS')</script>. अगर आप इस संदेश को WebView में बिना प्रोसेस किए दिखाते हैं — स्क्रिप्ट चल जाएगी।
// खतरनाक\nlet html = "<div>\\(message.text)</div>"\nwebView.loadHTMLString(html, baseURL: nil)\n