<पी> इन दिनों, ऐसे कई तरीके हैं जिनसे हमलावर आपके एप्लिकेशन से समझौता करने का प्रयास कर सकते हैं। और साइबर हमलों में निरंतर वृद्धि के कारण, सुरक्षित मोबाइल एप्लिकेशन - और विस्तार से, सुरक्षित कोडिंग - की मांग कभी अधिक नहीं रही। <पी> इसलिए यदि आप एक iOS डेवलपर हैं, तो आपको ऐप विकास के हर चरण में सुरक्षा को प्राथमिकता देना भी सीखना चाहिए। <पी> स्विफ्ट, एप्पल की आधुनिक प्रोग्रामिंग भाषा, ढेर सारे टूल और फ्रेमवर्क प्रदान करती है जो सुरक्षा बढ़ाते हुए विकास को सरल बनाते हैं, लेकिन केवल तभी जब सही तरीके से उपयोग किया जाए। <पी> यह लेख स्विफ्ट-आधारित iOS ऐप्स में 10 सामान्य सुरक्षा कमियों का पता लगाता है और उन्हें कम करने के लिए व्यावहारिक रणनीतियाँ प्रदान करता है। आवश्यकताएँ
<पी> गोता लगाने से पहले, आपको इसकी आवश्यकता होगी:- <पी> स्विफ्ट और आईओएस विकास का कार्यसाधक ज्ञान।
- <पी> Xcode तक पहुंच.
- <पी> iOS ऐप्स सर्वर के साथ कैसे संचार करते हैं इसकी बुनियादी समझ।
- <पी> टर्मिनल/कमांड लाइन की बुनियादी बातों से परिचित।
हम क्या कवर करेंगे:
- स्विफ्ट आईओएस अनुप्रयोगों में सबसे प्रचलित सुरक्षा जाल क्या हैं?
- 1. असुरक्षित डेटा संग्रहण
- 2. कमजोर नेटवर्क संचार
- 3. अनुचित इनपुट सत्यापन
- 4. हार्डकोडिंग रहस्य
- 5. अपर्याप्त प्रमाणीकरण और प्राधिकरण
- 6. असुरक्षित लॉगिंग और त्रुटि प्रबंधन
- 7. कोड अस्पष्टता और रिवर्स इंजीनियरिंग को नजरअंदाज करना
- 8. असुरक्षित तृतीय-पक्ष लाइब्रेरी
- 9. अपर्याप्त बायोमेट्रिक और मल्टी-फैक्टर प्रमाणीकरण
- 10. आवधिक सुरक्षा परीक्षण की अवहेलना
स्विफ्ट iOS अनुप्रयोगों में सबसे प्रचलित सुरक्षा जाल क्या हैं?
<पी> स्विफ्ट और आईओएस मजबूत सुरक्षा सुविधाएँ प्रदान करते हैं, लेकिन गलतियाँ फिर भी होती हैं। सबसे आम जाल और उन्हें ठीक करने के तरीके निम्नलिखित हैं:1. असुरक्षित डेटा संग्रहण
<पी> डेवलपर्स द्वारा की जाने वाली सबसे आम गलतियों में संवेदनशील डेटा को असुरक्षित रूप से संग्रहीत करना है। पासवर्ड, टोकन या यहां तक कि व्यक्तिगत उपयोगकर्ता डेटा को गलती से यूजरडिफॉल्ट्स या स्थानीय स्टोरेज में अनएन्क्रिप्टेड रूप में छोड़ा जा सकता है। पी> <पी> जबकि UserDefaults छोटी मात्रा में डेटा के लिए सुविधाजनक है, यह संवेदनशील डेटा के लिए सुरक्षित नहीं है क्योंकि डिवाइस से छेड़छाड़ होने पर यह हमलावरों के लिए आसानी से पहुंच योग्य है।कैसे ठीक करें:
<पी> संवेदनशील डेटा को सुरक्षित रूप से संग्रहीत करने के लिए किचेन सर्विसेज एपीआई का उपयोग करें। किचेन डेटा को एन्क्रिप्ट करता है और इसे डिवाइस से जोड़ता है ताकि इसे अन्य अनधिकृत एप्लिकेशन या उपयोगकर्ताओं द्वारा एक्सेस न किया जा सके। <पी> आप स्विफ्ट में लाइब्रेरी जैसे किचेनएक्सेस या अंतर्निहित SecItemAdd और SecItemCopyMatching फ़ंक्शन का उपयोग करके क्रेडेंशियल्स को सुरक्षित रूप से संग्रहीत कर सकते हैं। <पी> उदाहरण के लिए, आप किचेन में उपयोगकर्ता पासवर्ड कैसे संग्रहीत कर सकते हैं ताकि यह सुनिश्चित हो सके कि संवेदनशील डेटा सुरक्षित रूप से संग्रहीत है:do {
try keychain.set("userPassword123", key: "userPassword")
} catch {
print("Error saving to Keychain: \(error)")
}
<पी> पर्दे के पीछे, जब आप keychain.set("userPassword123", key: "userPassword") पर कॉल करते हैं तो क्या होता है किचेनमैनेजर क्लास के अंदर जो स्टोरेज के लिए Apple के मूल सुरक्षा ढांचे का उपयोग करता है: import Security
class KeychainManager {
func set(_ value: String, key: String) throws {
// 1. Convert string to Data
guard let data = value.data(using: .utf8) else {
throw NSError(domain: "KeychainManager", code: -1)
}
// 2. Build the query dictionary
let query: [String: Any] = [
// Store as password
kSecClass as String: kSecClassGenericPassword,
// Your app's bundle identifier
kSecAttrService as String: "com.yourapp.keychain",
// "userPassword"
kSecAttrAccount as String: key,
// "userPassword123" encrypted
kSecValueData as String: data,
kSecAttrAccessible as String: kSecAttrAccessibleAfterFirstUnlock
]
// 3. Save to keychain (iOS encrypts it automatically)
let status = SecItemAdd(query as CFDictionary, nil)
// 4. Check if successful
guard status == errSecSuccess else {
throw NSError(domain: "KeychainManager", code: Int(status))
}
}
}
<पी> जब यह फ़ंक्शन चलता है, तो iOS स्ट्रिंग मान, जैसे "userPassword123" को एन्क्रिप्टेड बाइनरी डेटा में परिवर्तित करता है और इसे डिवाइस के किचेन डेटाबेस में सुरक्षित रूप से संग्रहीत करता है। प्रविष्टि प्रदान की गई कुंजी (उदाहरण के लिए, "यूजरपासवर्ड") के तहत सहेजी जाती है, और केवल आपका ऐप ही इसे एक्सेस कर सकता है। <पी> पर्दे के पीछे, किचेन मजबूत सुरक्षा सुविधाओं का लाभ उठाता है, जिसमें डिवाइस-विशिष्ट कुंजियों का उपयोग करके हार्डवेयर-समर्थित एन्क्रिप्शन, फेस आईडी या टच आईडी के माध्यम से वैकल्पिक बायोमेट्रिक सुरक्षा और ऐप-स्तरीय अलगाव शामिल है ताकि यह सुनिश्चित किया जा सके कि कोई अन्य ऐप आपके संग्रहीत क्रेडेंशियल्स को पढ़ या संशोधित नहीं कर सके। 2. कमजोर नेटवर्क संचार
<पी> नेटवर्क पर संवेदनशील डेटा संचारित करना कमजोरियों से ग्रस्त एक अन्य क्षेत्र है। अनएन्क्रिप्टेड HTTP कनेक्शन का उपयोग करने से आपका ऐप मैन-इन-द-मिडिल (MITM) हमलों के संपर्क में आ जाता है, जिससे हमलावरों को ट्रांज़िट में डेटा को रोकने और संशोधित करने की अनुमति मिलती है। पी> <पी> समस्या :जब डेटा आपके ऐप और सर्वर के बीच एक असुरक्षित कनेक्शन पर यात्रा करता है, तो उसी नेटवर्क (जैसे सार्वजनिक वाई-फाई) पर हमलावर:- <पी> संवेदनशील जानकारी (पासवर्ड, व्यक्तिगत डेटा, भुगतान विवरण) पढ़ें
- <पी> अनुरोधों और प्रतिक्रियाओं को संशोधित करें
- <पी> अपने वैध सर्वर का प्रतिरूपण करें
कैसे ठीक करें:
<पी> 1. हमेशा HTTPSका उपयोग करेंHTTPS पारगमन में सभी डेटा को एन्क्रिप्ट करता है, जिससे यह हमलावरों के लिए अपठनीय हो जाता है। iOS का ऐप ट्रांसपोर्ट सिक्योरिटी (ATS) डिफ़ॉल्ट रूप से असुरक्षित HTTP कनेक्शन को ब्लॉक करके इसे लागू करता है:
// ❌ INSECURE - HTTP connection (blocked by ATS by default)
let url = URL(string: "http://api.example.com/login")
// ✅ SECURE - HTTPS connection
let url = URL(string: "https://api.example.com/login")
<पी> जब तक अत्यंत आवश्यक न हो आप अपनी Info.plist में ATS अपवाद जोड़ने से बचना चाहेंगे। यदि कोई तृतीय-पक्ष API केवल HTTP का समर्थन करता है, तो अपग्रेड करने या अधिक सुरक्षित विकल्प खोजने के लिए उनसे संपर्क करें। <पी> 2. प्रमाणपत्र पिनिंग (उन्नत सुरक्षा) लागू करें पी> <पी> HTTPS के साथ भी, आपका ऐप अभी भी परिष्कृत MITM हमलों के प्रति संवेदनशील हो सकता है। उदाहरण के लिए, एक हमलावर किसी उपयोगकर्ता के डिवाइस पर (मैलवेयर या सोशल इंजीनियरिंग के माध्यम से) एक धोखाधड़ी प्रमाणपत्र स्थापित कर सकता है, और वैध प्रतीत होने वाले HTTPS ट्रैफ़िक को रोक सकता है। हमलावर के नकली प्रमाणपत्र पर डिवाइस द्वारा भरोसा किया जाएगा, जिससे उन्हें "सुरक्षित" संचार को डिक्रिप्ट करने और पढ़ने की अनुमति मिलेगी। <पी> सर्टिफिकेट पिनिंग से इसका समाधान यह हो जाता है कि आपका ऐप केवल आपके विशिष्ट सर्वर के प्रमाणपत्र पर भरोसा करता है, अन्य सभी को अस्वीकार कर देता है - भले ही वे अन्यथा मान्य हों। <पी> सर्टिफिकेट पिनिंग कैसे काम करती है: पी> <पी> आपका ऐप अपेक्षित प्रमाणपत्र (या इसकी सार्वजनिक कुंजी हैश) संग्रहीत करता है और प्रत्येक कनेक्शन के दौरान इसे मान्य करता है: class SecureNetworkManager: NSObject, URLSessionDelegate {
// Store your server's certificate hash
// Get this by running: openssl x509 -in certificate.crt -pubkey -noout | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64
private let expectedPublicKeyHash = "YOUR_CERTIFICATE_HASH_HERE"
func urlSession(
_ session: URLSession,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void
) {
// Step 1: Check if this is a server trust challenge (certificate validation)
guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust,
let serverTrust = challenge.protectionSpace.serverTrust
else {
// Not a certificate challenge; use default handling
completionHandler(.performDefaultHandling, nil)
return
}
// Step 2: Validate that the server's certificate matches our pinned certificate
if isValidServerTrust(serverTrust) {
// Certificate matches - proceed with the connection
completionHandler(.useCredential, URLCredential(trust: serverTrust))
} else {
// Certificate doesn't match - reject the connection to prevent MITM attack
completionHandler(.cancelAuthenticationChallenge, nil)
}
}
// Validates the server's certificate against our pinned hash
private func isValidServerTrust(_ serverTrust: SecTrust) -> Bool {
// Extract the server's certificate
guard let serverCertificate = SecTrustGetCertificateAtIndex(serverTrust, 0) else {
return false
}
// Get the public key from the certificate
let serverPublicKey = SecCertificateCopyKey(serverCertificate)
guard let publicKey = serverPublicKey else {
return false
}
// Convert the public key to data and hash it
var error: Unmanaged<CFError>?
guard let publicKeyData = SecKeyCopyExternalRepresentation(publicKey, &error) as Data? else {
return false
}
// Hash the public key using SHA-256
let publicKeyHash = SHA256.hash(data: publicKeyData)
let publicKeyHashString = Data(publicKeyHash).base64EncodedString()
// Compare with our expected hash
return publicKeyHashString == expectedPublicKeyHash
}
}
<पी> यह कोड चरण-दर-चरण क्या करता है: - <पी>
urlSession(_:didReceive:completionHandler:)- जब भी आपका ऐप HTTPS कनेक्शन बनाता है तो इस विधि को कॉल किया जाता है। iOS पूछता है:"क्या मुझे इस सर्वर के प्रमाणपत्र पर भरोसा करना चाहिए?" - <पी> प्रमाणीकरण विधि की जाँच करें - हम सत्यापित करते हैं कि यह एक सर्वर ट्रस्ट चुनौती (प्रमाणपत्र सत्यापन) है, किसी अन्य प्रकार का प्रमाणीकरण नहीं।
- <पी> प्रमाणपत्र सत्यापित करें - हम
isValidServerTrust()पर कॉल करते हैं , जो:- <पी> कनेक्शन से सर्वर का प्रमाणपत्र निकालता है
- <पी> उस प्रमाणपत्र से सार्वजनिक कुंजी प्राप्त करता है
- <पी> SHA-256 का उपयोग करके सार्वजनिक कुंजी को हैश करता है
- <पी> हैश की तुलना हमारे संग्रहीत, अपेक्षित हैश से करता है
- निर्णय लें:
- <पी> यदि हैश मेल खाता है, तो सर्वर वैध है।
.useCredentialके साथ आगे बढ़ें . - <पी> यदि हैश मेल नहीं खाता है, तो हमारे पास संभावित MITM हमला है।
.cancelAuthenticationChallengeके साथ रद्द करें .
3. अनुचित इनपुट सत्यापन
<पी> कुछ डेवलपर्स सही इनपुट सत्यापन की उपेक्षा करते हैं, जिससे SQL इंजेक्शन, रिमोट कोड निष्पादन और डेटा भ्रष्टाचार सहित कई कमजोरियां पैदा होती हैं। <पी> जबकि स्विफ्ट के पास मजबूत टाइपिंग समर्थन है, कुछ डेवलपर्स उपयोगकर्ता इनपुट या एपीआई प्रतिक्रियाओं को साफ नहीं करते हैं। रीयल-टाइम एपीआई ईमेल सत्यापन को शामिल करने से यह सुनिश्चित होता है कि उपयोगकर्ता संग्रहीत या संसाधित होने से पहले वैध, उचित रूप से स्वरूपित ईमेल पते प्रदान करते हैं, जिससे सुरक्षा जोखिम और डेटा गुणवत्ता के मुद्दे दोनों कम हो जाते हैं।कैसे ठीक करें:
<पी> इनपुट सत्यापन दुर्भावनापूर्ण डेटा के विरुद्ध आपकी रक्षा की पहली पंक्ति है। अपने iOS एप्लिकेशन को सुरक्षित रखने का तरीका यहां बताया गया है: <पी> 1. पैटर्न के साथ उपयोगकर्ता इनपुट को मान्य करें पी> <पी> प्रसंस्करण से पहले हमेशा नियमित अभिव्यक्तियों या पूर्वनिर्धारित पैटर्न का उपयोग करके उपयोगकर्ता इनपुट को मान्य करें। उदाहरण के लिए, ईमेल पते स्वीकार करते समय:func isValidEmail(_ email: String) -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
let emailPredicate = NSPredicate(format: "SELF MATCHES %@", emailRegex)
return emailPredicate.evaluate(with: email)
}
// Only accept properly formatted data
guard isValidEmail(userEmail) else {
// Reject invalid input
return
}
<पी> यह सुनिश्चित करता है कि केवल उचित रूप से स्वरूपित डेटा ही स्वीकार किया जाता है, जिससे विकृत या दुर्भावनापूर्ण इनपुट को आपके सिस्टम में प्रवेश करने से रोका जा सके। <पी> 2. एपीआई प्रतिक्रियाओं को स्वच्छ करें पी> <पी> बाहरी डेटा पर कभी भरोसा न करें. एपीआई प्रतिक्रियाओं का उपयोग करने से पहले उन्हें हमेशा सत्यापित और स्वच्छ करें: if let userAge = apiResponse["age"] as? Int,
userAge >= 0 && userAge <= 150 {
// Safe to use
user.age = userAge
} else {
// Handle invalid data appropriately
throw ValidationError.invalidAge
}
<पी> 3. पैरामीटरयुक्त क्वेरीज़ (सबसे महत्वपूर्ण) का उपयोग करें पी> <पी> सबसे खतरनाक गलती स्ट्रिंग संयोजन के माध्यम से डेटाबेस क्वेरी बनाना है। इस असुरक्षित कोड पर विचार करें: // ❌ NEVER DO THIS - Vulnerable to SQL Injection
let username = userInput // Could be: "admin' OR '1'='1"
let query = "SELECT * FROM users WHERE username = '\(username)'"
database.execute(query)
<पी> यदि कोई दुर्भावनापूर्ण उपयोगकर्ता अपने उपयोगकर्ता नाम के रूप में admin' या '1'='1 दर्ज करता है, तो क्वेरी बन जाती है: SELECT * FROM users WHERE username = 'admin' OR '1'='1'
<पी> यह केवल एक के बजाय डेटाबेस में सभी उपयोगकर्ताओं को लौटाएगा, जो संभावित रूप से संवेदनशील डेटा को उजागर करेगा। सुरक्षित समाधान पैरामीटरयुक्त क्वेरीज़ का उपयोग करता है: // ✅ SAFE - Using parameterized queries
let query = "SELECT * FROM users WHERE username = ?"
database.execute(query, withArgumentsIn: [username])
<पी> इस दृष्टिकोण में, ? एक प्लेसहोल्डर है जिसे डेटाबेस एक पैरामीटर के रूप में मानता है, SQL कमांड के भाग के रूप में नहीं। उपयोगकर्ता नाम मान को withArgumentsIn में अलग से पास किया जाता है सरणी. <पी> इसका मतलब यह है कि भले ही कोई उपयोगकर्ता admin' OR '1'='1 जैसे SQL कोड को इंजेक्ट करने का प्रयास करता है , डेटाबेस खोज के लिए संपूर्ण स्ट्रिंग को एक शाब्दिक उपयोगकर्ता नाम के रूप में मानेगा - निष्पादन योग्य SQL कोड के रूप में नहीं। डेटाबेस इंजन स्वचालित रूप से किसी भी विशेष वर्ण से बच जाता है, जिससे SQL इंजेक्शन का जोखिम पूरी तरह समाप्त हो जाता है। <पी> क्वेरी संरचना को डेटा से अलग करके, पैरामीटरयुक्त क्वेरीज़ यह सुनिश्चित करती हैं कि उपयोगकर्ता इनपुट आपके SQL कथनों के इच्छित तर्क को कभी नहीं बदल सकता। 4. हार्डकोडिंग रहस्य
<पी> स्रोत कोड में हार्ड-कोडित एपीआई कुंजी, क्रेडेंशियल या निजी टोकन एक और गंभीर सुरक्षा गलती है। हमलावर रिवर्स-इंजीनियरिंग टूल का उपयोग करके संकलित बायनेरिज़ से ऐसे रहस्य निकाल सकते हैं, विशेष रूप से जनता के लिए जारी किए गए ऐप्स के लिए। <पी> एक बार उजागर होने के बाद, इन क्रेडेंशियल्स का उपयोग आपकी बैकएंड सेवाओं तक पहुंचने के लिए किया जा सकता है, जिससे संभावित रूप से डेटा उल्लंघन या अनधिकृत शुल्क लग सकते हैं।समस्या - हार्डकोडेड रहस्य:
// NEVER DO THIS
class APIClient {
private let apiKey = "1234567890abcdef"
private let secretToken = "sk_live_51H..."
func makeRequest() {
// These secrets are embedded in your binary
let headers = ["Authorization": "Bearer \(apiKey)"]
}
}
<पी> कैसे ठीक करें: पी> <पी> संवेदनशील क्रेडेंशियल को कभी भी सीधे अपने कोड में संग्रहीत न करें। यहां सुरक्षित विकल्प हैं: <पी> समाधान 1:रनटाइम पर बैकएंड से रहस्य प्राप्त करें पी> <पी> सबसे सुरक्षित तरीका यह है कि ग्राहक पर कभी भी रहस्य न रखें। इसके बजाय, उपयोगकर्ताओं को प्रमाणित करें और अपने बैकएंड को अधिकृत एपीआई कॉल करने दें: class APIClient {
private var sessionToken: String?
// User logs in and receives a temporary session token
func authenticateUser(email: String, password: String) async throws {
let response = try await backend.login(email: email, password: password)
// Store only a temporary, user-specific session token
self.sessionToken = response.sessionToken
}
// Backend handles the actual API calls with the real API key
func fetchUserData() async throws -> UserData {
guard let token = sessionToken else {
throw AuthError.notAuthenticated
}
// Your backend receives this request, validates the session token,
// then uses its own API keys to fetch data from third-party services
return try await backend.getUserData(sessionToken: token)
}
}
<पी> यह कैसे काम करता है: पी> <पी> आपका ऐप कभी भी वास्तविक एपीआई कुंजी नहीं जानता है। जब किसी उपयोगकर्ता को डेटा की आवश्यकता होती है, तो आपका ऐप सत्र टोकन के साथ आपके बैकएंड सर्वर पर एक अनुरोध भेजता है। आपका बैकएंड टोकन को मान्य करता है, फिर वास्तविक तृतीय-पक्ष एपीआई कॉल करने के लिए अपनी स्वयं की सुरक्षित रूप से संग्रहीत एपीआई कुंजियों का उपयोग करता है। इस तरह, वास्तविक रहस्य आपके सर्वर को कभी नहीं छोड़ते। <पी> समाधान 2:पर्यावरण चर या कॉन्फ़िगरेशन फ़ाइलें (केवल विकास) पी> <पी> विकास परिवेश के लिए, .xcconfig फ़ाइलों का उपयोग करें जिन्हें संस्करण नियंत्रण से बाहर रखा गया है: // Secrets.xcconfig (add to .gitignore!)
API_KEY = your_dev_api_key_here
API_SECRET = your_dev_secret_here
// Access in your code through Info.plist
class Config {
static let apiKey: String = {
guard let key = Bundle.main.object(forInfoDictionaryKey: "API_KEY") as? String else {
fatalError("API_KEY not found in configuration")
}
return key
}()
}
<पी> महत्वपूर्ण :यह दृष्टिकोण केवल गैर-उत्पादन वातावरण के लिए उपयुक्त है! कभी भी अपने ऐप के साथ प्रोडक्शन एपीआई कुंजी न भेजें, यहां तक कि कॉन्फिग फाइलों में भी। 5. अपर्याप्त प्रमाणीकरण और प्राधिकरण
<पी> क्लाइंट-साइड प्रमाणीकरण और प्राधिकरण जांच पर भरोसा करना जोखिम भरा है। हमलावर ऐप/रनटाइम के साथ ज़बरदस्ती या छेड़छाड़ करके ऐप को इन जांचों को बायपास करने और अनधिकृत तरीके से एक्सेस करने का कारण बन सकते हैं।कैसे ठीक करें:
- <पी> प्रमाणीकरण और प्राधिकरण क्लाइंट-साइड के बजाय सर्वर साइड पर करें।
- <पी> प्रमाणित उपयोगकर्ता लॉगिन के लिए JWT (JSON वेब टोकन) या OAuth 2.0 का उपयोग करें।
- <पी> टोकन चोरी की संभावना को कम करने के लिए टोकन समाप्ति और ताज़ा तर्क को लागू करने की आवश्यकता है।
let request = URLRequest(url: apiURL)
request.setValue("Bearer \(jwtToken)", forHTTPHeaderField: "Authorization")
6. असुरक्षित लॉगिंग और त्रुटि प्रबंधन
<पी> व्यापक और असुरक्षित लॉगिंग प्रथाओं, साथ ही अनदेखे अपवादों के कारण उपयोगकर्ता नाम, पासवर्ड और एपीआई कुंजी सहित संवेदनशील जानकारी उजागर हो सकती है।कैसे ठीक करें:
- <पी> संवेदनशील जानकारी को सावधानीपूर्वक लॉग करें।
- <पी> नियंत्रित त्रुटि प्रबंधन लागू करें और उपयोगकर्ता द्वारा प्रस्तुत संदेशों में न्यूनतम मात्रा में जानकारी प्रदान करें।
- <पी> सुरक्षित लॉगिंग लाइब्रेरी लागू करें जो व्यक्तिगत डेटा को छुपाएं या एन्क्रिप्ट करें।
do {
try someRiskyOperation()
} catch {
// Log error securely
Logger.log("Operation failed: \(error.localizedDescription)")
}
7. कोड अस्पष्टता और रिवर्स इंजीनियरिंग को नजरअंदाज करना
<पी> संवेदनशील व्यावसायिक तर्क, एल्गोरिदम या छिपे रहस्यों को उजागर करने के लिए स्विफ्ट बायनेरिज़ को रिवर्स-इंजीनियर किया जा सकता है। हमलावर आपके ऐप को डीकंपाइल करने और यह आंतरिक रूप से कैसे काम करता है इसका विश्लेषण करने के लिए हॉपर डिस्सेबलर, क्लास-डंप, या आईडीए प्रो जैसे टूल का उपयोग करते हैं। इस जोखिम को अक्सर कम करके आंका जाता है, खासकर छोटे ऐप्स के लिए, लेकिन कोई भी ऐप निशाना बन सकता है। <पी> इसका मतलब यह है कि जब आप एक स्विफ्ट ऐप संकलित करते हैं, तो परिणामी बाइनरी में शामिल होता है:- <पी> कक्षा के नाम और विधि हस्ताक्षर
- <पी> स्ट्रिंग अक्षर (यूआरएल, त्रुटि संदेश, कुंजियाँ)
- <पी> आपके कोड तर्क की संरचना
- <पी> एल्गोरिथम कार्यान्वयन
class FeatureManager {
func isPremiumUser() -> Bool {
// Check if user has premium access
let hasSubscription = UserDefaults.standard.bool(forKey: "premium_unlocked")
return hasSubscription
}
func unlockPremiumFeature() {
guard isPremiumUser() else {
showPaywall()
return
}
// Show premium content
showPremiumContent()
}
}
<पी> एक हमलावर आपके ऐप को रिवर्स-इंजीनियर कर सकता है और उस विधि isPremiumUser() की खोज कर सकता है पहुंच को नियंत्रित करता है, और यह केवल UserDefaults की जांच करता है कुंजी को premium_unlocked कहा जाता है . तब उन्हें पता चल जाएगा कि वे आपके पेवॉल को पूरी तरह से दरकिनार करते हुए, इस मान को सही पर सेट करने के लिए रनटाइम हेरफेर टूल का उपयोग कर सकते हैं। <पी> कैसे ठीक करें: पी> <पी> 1. स्विफ्ट कंपाइलर ऑप्टिमाइज़ेशन का उपयोग करें पी> <पी> अनुकूलन फ़्लैग सक्षम करें जो डिबगिंग प्रतीकों को हटा देता है और बाइनरी को पढ़ने में कठिन बनाता है: // In your build settings:
// - Set "Optimization Level" to "-O" (or -Osize) for release builds
// - Enable "Strip Debug Symbols During Copy" = YES
// - Set "Strip Style" to "All Symbols"
<पी> यह फ़ंक्शन नाम हटा देता है और संकलित कोड को कम पढ़ने योग्य बनाता है - हालांकि वर्ग/विधि नाम आंशिक रूप से दृश्यमान रहते हैं। <पी> 2. प्रतीक अस्पष्टता उपकरणका उपयोग करें पी> <पी> स्विफ्टशील्ड जैसे उपकरण आपकी कक्षाओं, विधियों और गुणों को अर्थहीन नामों में बदल सकते हैं: // Before obfuscation (readable to attackers):
class FeatureManager {
func isPremiumUser() -> Bool { ... }
}
// After obfuscation (harder to understand):
class a7f3b2 {
func x9k2m() -> Bool { ... }
}
<पी> हालाँकि यह रिवर्स इंजीनियरिंग को नहीं रोकता है, लेकिन इससे हमलावरों के लिए यह समझना काफी कठिन हो जाता है कि कोड क्या करता है। <पी> 3. संवेदनशील तर्क को सर्वर पर ले जाएँ (सर्वोत्तम अभ्यास) पी> <पी> स्थानीय स्तर पर प्रीमियम स्थिति की जाँच करने के बजाय, इसे सर्वर-साइड सत्यापित करें: // ✅ Secure approach - Server validates everything
class FeatureManager {
func unlockPremiumFeature() async {
do {
// Server checks if user truly has premium access
let hasAccess = try await backend.verifyPremiumAccess(userId: currentUserId)
if hasAccess {
showPremiumContent()
} else {
showPaywall()
}
} catch {
// Handle error
showPaywall()
}
}
}
<पी> यह कैसे काम करता है: पी> <पी> आपका बैकएंड प्रीमियम एक्सेस के बारे में सच्चाई का स्रोत बनाए रखता है। भले ही कोई हमलावर आपके ऐप को रिवर्स-इंजीनियर करता है और चेक को बायपास करने की कोशिश करता है, सर्वर अनधिकृत अनुरोधों को अस्वीकार कर देगा। ऐप केवल यूआई परत बन जाता है, जबकि सभी महत्वपूर्ण निर्णय सर्वर-साइड होते हैं - जहां हमलावर उनमें हेरफेर नहीं कर सकते। <पी> मुख्य सिद्धांत यह मानना है कि आपका ऐप कोड सार्वजनिक है:भुगतान, एक्सेस नियंत्रण या प्रमाणीकरण जैसे सुरक्षा-महत्वपूर्ण कार्यों के लिए कभी भी क्लाइंट-साइड चेक पर भरोसा न करें। रिवर्स इंजीनियरिंग को कठिन बनाने के लिए अस्पष्टता का उपयोग करें, लेकिन अंततः संवेदनशील तर्क को अपने सुरक्षित बैकएंड पर ले जाएं 8. असुरक्षित तृतीय-पक्ष लाइब्रेरी
<पी> यदि तृतीय-पक्ष लाइब्रेरी हैक हो गई हैं या पुरानी हो गई हैं तो उन्हें खतरा है। डेवलपर्स अनजाने में निर्भरता से संभावित सुरक्षा जोखिमों पर ऐप कार्यक्षमता को प्राथमिकता दे सकते हैं, और ईटीएल उपकरण कमजोरियों को अधिक कुशलता से पहचानने के लिए निर्भरता-संबंधित डेटा की निगरानी और प्रसंस्करण को सुव्यवस्थित करके और मदद कर सकते हैं। <पी> व्यापक पैमाने पर, मजबूत डेटा सेंटर सुरक्षा प्रथाओं को लागू करने से यह सुनिश्चित होता है कि भले ही तीसरे पक्ष के घटक जोखिम पेश करते हों, अंतर्निहित बुनियादी ढांचा हमलों के खिलाफ लचीला बना रहता है।कैसे ठीक करें:
- <पी> केवल उच्च-गुणवत्ता, सुव्यवस्थित पुस्तकालयों का उपयोग करें।
- <पी> निर्भरताएँ अद्यतन करें और सीवीई (सामान्य कमजोरियाँ और एक्सपोज़र) की निगरानी करें।
- <पी> यदि लाइब्रेरी कोड संवेदनशील डेटा को संभालता है तो उसका ऑडिट करें।
9. अपर्याप्त बायोमेट्रिक और मल्टी-फैक्टर प्रमाणीकरण
<पी> अधिकांश एप्लिकेशन केवल पासवर्ड पर निर्भर होते हैं, जिनके हैक होने का खतरा होता है। फेस आईडी या टच आईडी जैसे बायोमेट्रिक्स को सक्षम करने से उपयोगकर्ताओं के लिए सुरक्षा बढ़ जाती है।कैसे ठीक करें:
- <पी> बायोमेट्रिक प्रमाणीकरण के लिए स्थानीय प्रमाणीकरण ढाँचा बाँधें।
- <पी> मल्टीफैक्टर प्रमाणीकरण (एमएफए) के लिए बायोमेट्रिक्स को सर्वर-आधारित प्रमाणीकरण के साथ संयोजित करें।
import LocalAuthentication
let context = LAContext()
var error: NSError?
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics,
localizedReason: "Access your account") { success, authError in
DispatchQueue.main.async {
if success {
// Proceed securely
} else {
// Handle failure (authError may contain the reason)
print("Authentication failed: \(authError?.localizedDescription ?? "Unknown error")")
}
}
}
} else {
// Biometrics not available, check error for details
print("Biometrics unavailable: \(error?.localizedDescription ?? "Unknown error")")
}
10. आवधिक सुरक्षा परीक्षण की अवहेलना
<पी> विकास के दौरान सर्वोत्तम प्रथाओं का पालन करने के बावजूद, ऐप्स में अक्सर अस्पष्टीकृत कमजोरियां होती हैं जो जटिल इंटरैक्शन, तृतीय-पक्ष निर्भरता या नए खोजे गए आक्रमण वैक्टर से उत्पन्न होती हैं। हमलावरों द्वारा इनका फायदा उठाने से पहले इन कमजोरियों का पता लगाने के लिए नियमित सुरक्षा परीक्षण नितांत आवश्यक है। <पी> सुलभ उपकरणों और प्रथाओं का उपयोग करते हुए सुरक्षा परीक्षण कई चरणों में होना चाहिए:- <पी> स्वचालित सुरक्षा स्कैन: सामान्य समस्याओं को पकड़ने के लिए प्रत्येक बिल्ड के साथ स्वचालित रूप से चलाएँ।
- <पी> स्व-संचालित कोड ऑडिट: स्थापित दिशानिर्देशों का उपयोग करके अपने स्वयं के कोड की नियमित सुरक्षा-केंद्रित समीक्षाएँ।
- <पी> भेद्यता स्कैनिंग उपकरण: सुरक्षा खामियों के लिए अपने ऐप का विश्लेषण करने के लिए MobSF जैसे मुफ़्त टूल का उपयोग करें।
- <पी> निर्भरता ऑडिट: ज्ञात सुरक्षा कमजोरियों के लिए तृतीय-पक्ष लाइब्रेरी की जाँच करना।
# Example: GitHub Actions workflow for automated security scanning
name: Security Scan
on: [push, pull_request]
jobs:
security-scan:
runs-on: macos-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Run MobSF Security Scan
run: |
# Mobile Security Framework - scans for common vulnerabilities
docker run -v $(pwd):/app opensecurity/mobile-security-framework-mobsf
- name: Dependency Vulnerability Check
run: |
# Check CocoaPods/SPM dependencies for known CVEs
brew install dependency-check
dependency-check --scan ./Podfile.lock --format JSON
- name: Secret Detection
run: |
# Detect accidentally committed secrets
brew install truffleHog
truffleHog filesystem . --json
- name: Fail build on critical issues
run: |
if grep -q "CRITICAL" security-report.json; then
echo "Critical security issues found!"
exit 1
fi
<पी> स्वचालित स्कैन के लिए जाँच: पी> - <पी> हार्डकोडेड एपीआई कुंजी, टोकन, या पासवर्डपी>
- <पी> असुरक्षित नेटवर्क कॉन्फ़िगरेशन (HTTPS के बजाय HTTP की अनुमति देना)
- <पी> कमजोर क्रिप्टोग्राफ़िक एल्गोरिदम
- <पी> तृतीय-पक्ष लाइब्रेरीज़ में ज्ञात कमज़ोरियाँ
- <पी> अनुचित एसएसएल/टीएलएस प्रमाणपत्र सत्यापनपी>
- <पी> असुरक्षित डेटा संग्रहण (UserDefaults में संवेदनशील डेटा संग्रहीत करना)
- <पी> अत्यधिक ऐप अनुमतियाँ
Security Scan Results:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[CRITICAL] Hardcoded API Key Found
File: APIClient.swift:15
Issue: API key "sk_live_abc123..." detected in source code
[HIGH] Insecure HTTP Connection
File: NetworkManager.swift:42
Issue: App allows cleartext HTTP traffic to api.example.com
Fix: Enforce HTTPS or add exception to Info.plist if required
[MEDIUM] Weak Encryption Algorithm
File: DataEncryption.swift:28
Issue: Using MD5 for hashing (cryptographically broken)
Fix: Use SHA-256 or better
[LOW] Outdated Dependency
Library: Alamofire 4.2.0
Issue: Known vulnerability CVE-2021-12345
Fix: Update to version 5.6.0 or later
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Build Failed: 2 critical issues must be fixed before deployment
<पी> 2. भेद्यता विश्लेषणके लिए MobSF (मोबाइल सुरक्षा फ्रेमवर्क) का उपयोग करें पी> <पी> MobSF एक मुफ़्त, स्वचालित उपकरण है जो सुरक्षा समस्याओं के लिए आपके iOS ऐप का विश्लेषण करता है: # Install and run MobSF locally
docker pull opensecurity/mobile-security-framework-mobsf
docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf
# Upload your .ipa file through the web interface at localhost:8000
# MobSF will analyze and provide a detailed security report
<पी> MobSF क्या जाँचता है: - <पी> हार्डकोडेड रहस्यों के लिए बाइनरी विश्लेषण
- <पी> असुरक्षित डेटा भंडारण पैटर्न
- <पी> कमजोर क्रिप्टोग्राफ़िक कार्यान्वयन
- <पी> असुरक्षित नेटवर्क कनेक्शन
- <पी> कोड गुणवत्ता और सुरक्षा सर्वोत्तम प्रथाएँ
- <पी> सुरक्षा मानकों का अनुपालन
// Example: Following OWASP MSTG recommendations for secure storage
class SecureStorage {
// ❌ Insecure - UserDefaults is not encrypted
func saveTokenInsecurely(_ token: String) {
UserDefaults.standard.set(token, forKey: "authToken")
}
// ✅ Secure - Using Keychain as OWASP recommends
func saveTokenSecurely(_ token: String) throws {
let data = token.data(using: .utf8)!
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: "authToken",
kSecValueData as String: data,
kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
]
SecItemDelete(query as CFDictionary)
let status = SecItemAdd(query as CFDictionary, nil)
guard status == errSecSuccess else {
throw StorageError.saveFailed
}
}
}
<पी> स्वयं-ऑडिट के लिए OWASP MSTG चेकलिस्ट: पी> - <पी> [ ] क्या सभी संवेदनशील डेटा बाकी एन्क्रिप्टेड हैं?
- <पी> [ ] क्या HTTPS सभी नेटवर्क कॉल के लिए लागू है?
- <पी> [ ] क्या प्रमाणपत्र उचित रूप से मान्य हैं?
- <पी> [ ] क्या संवेदनशील डेटा को लॉग से बाहर रखा गया है?
- <पी> [ ] क्या एपीआई कुंजियाँ और रहस्य हार्डकोडेड नहीं हैं?
- <पी> [ ] क्या उपयोगकर्ता इनपुट मान्य और स्वच्छ है?
- <पी> [ ] क्या प्रमाणीकरण टोकन किचेन में सुरक्षित रूप से संग्रहीत हैं?
# For CocoaPods projects
gem install cocoapods-audit
pod audit
# For Swift Package Manager
# Use GitHub Dependabot (free for public repos) or
brew install swift-outdated
swift-outdated
<पी> और इन टूल के साथ स्वचालित अलर्ट सेट करें: - <पी> गिटहब डिपेंडाबोट: असुरक्षित निर्भरता का पता चलने पर स्वचालित रूप से पीआर बनाता है (मुक्त)
- <पी> स्निक :ओपन-सोर्स प्रोजेक्ट्स के लिए निःशुल्क टियर उपलब्ध है
- <पी> OWASP निर्भरता-जाँच: निःशुल्क कमांड-लाइन टूल