कोटलिन एप्लिकेशन सुरक्षा: व्यवहार में शीर्ष 10 कमजोरियाँ
\nकोटलिन आत्मविश्वास से एंड्रॉइड और सर्वर एप्लिकेशन विकास के लिए सबसे लोकप्रिय भाषाओं में से एक है। हालाँकि, किसी भी अन्य भाषा की तरह, कोटलिन भी कमजोरियों से अछूता नहीं है। इस लेख में, हम शीर्ष 10 सबसे गंभीर सुरक्षा समस्याओं का विश्लेषण करेंगे जिनका सामना डेवलपर्स करते हैं, और दिखाएंगे कि व्यवहार में उनसे कैसे बचा जाए।
\n\n1. SQL-इंजेक्शन (SQL Injection)
\nइस तथ्य के बावजूद कि कोटलिन का उपयोग अक्सर ORM-लाइब्रेरी के साथ किया जाता है, SQL क्वेरी के साथ सीधा काम एक सामान्य प्रथा बनी हुई है।
\nकमजोर कोड:
\nfun getUser(id: String): User? {\n val query = "SELECT * FROM users WHERE id = '$id'"\n val result = connection.createStatement().executeQuery(query)\n // ...\n}\nसुरक्षित संस्करण (PreparedStatement का उपयोग):
\nfun getUserSafe(id: String): User? {\n val query = "SELECT * FROM users WHERE id = ?"\n val stmt = connection.prepareStatement(query)\n stmt.setString(1, id)\n val result = stmt.executeQuery()\n // ...\n}\nनिष्कर्ष: SQL क्वेरी में कभी भी उपयोगकर्ता इनपुट को संयोजित न करें। पैरामीटरयुक्त क्वेरी या ORM (Exposed, Hibernate) का उपयोग करें।
\n\n2. वेब-एप्लिकेशन में क्रॉस-साइट स्क्रिप्टिंग (XSS)
\nKtor या Spring Boot पर सर्वर एप्लिकेशन विकसित करते समय, आउटपुट को एस्केप करना अक्सर भूल जाते हैं।
\nकमजोर कोड (Ktor):
\nget("/user/{name}") {\n val name = call.parameters["name"] ?: "अतिथि"\n call.respondText("<h1>नमस्ते, $name!</h1>", ContentType.Text.Html)\n}\nसुरक्षित संस्करण:
\nimport org.apache.commons.text.StringEscapeUtils\n\nget("/user/{name}") {\n val name = call.parameters["name"] ?: "अतिथि"\n val safeName = StringEscapeUtils.escapeHtml4(name)\n call.respondText("<h1>नमस्ते, $safeName!</h1>", ContentType.Text.Html)\n}\nसुझाव: HTML में आउटपुट करने से पहले हमेशा उपयोगकर्ता इनपुट को एस्केप करें। ऑटो-एस्केपिंग वाले टेम्पलेट इंजन का उपयोग करें (जैसे, Kotlinx.html)।
\n\n3. पासवर्ड का असुरक्षित भंडारण
\nपासवर्ड को सादे टेक्स्ट में या कमजोर हैश का उपयोग करके संग्रहीत करना सबसे आम गलतियों में से एक है।
\nगलत तरीका:
\nfun savePassword(password: String) {\n val hash = password.md5() // ऐसा कभी न करें!\n database.saveHash(hash)\n}\nसही तरीका (bcrypt):
\nimport at.favre.lib.crypto.bcrypt.BCrypt\n\nfun savePassword(password: String) {\n val hash = BCrypt.withDefaults().hashToString(12, password.toCharArray())\n database.saveHash(hash)\n}\n\nfun checkPassword(password: String, storedHash: String): Boolean {\n return BCrypt.verifyer().verify(password.toCharArray(), storedHash).verified\n}\nमहत्वपूर्ण: bcrypt, scrypt या Argon2 का उपयोग करें। पासवर्ड संग्रहीत करने के लिए कभी भी MD5 या SHA-1 का उपयोग न करें।
\n\n4. लॉग के माध्यम से संवेदनशील डेटा का रिसाव
\nडेवलपर्स अक्सर संवेदनशील डेटा को लॉग करते हैं, बिना यह जाँचे कि आउटपुट में क्या जा रहा है।
\nसमस्याग्रस्त कोड:
\nlogger.info("उपयोगकर्ता $userId टोकन के साथ प्रमाणित: $token")\nसुरक्षित संस्करण:
\nlogger.info("उपयोगकर्ता $userId सफलतापूर्वक प्रमाणित")\n// या मास्किंग का उपयोग करें:\nfun maskToken(token: String): String = \n token.take(4) + "****" + token.takeLast(4)\nनियम: कभी भी पासवर्ड, टोकन, क्रेडिट कार्ड नंबर या व्यक्तिगत डेटा लॉग न करें। मास्किंग के लिए लाइब्रेरी का उपयोग करें (जैसे, Logstash)।
\n\n5. असुरक्षित डिसीरियलाइज़ेशन
\nकोटलिन सक्रिय रूप से JSON-सीरियलाइज़ेशन का उपयोग करता है। गलत कॉन्फ़िगरेशन RCE हमलों का कारण बन सकता है।
\nकमजोर कोड (Jackson):
\nval mapper = ObjectMapper()\nval obj = mapper.readValue(userInput, Any::class.j