कोटलिन एप्लिकेशन सुरक्षा: व्यवहार में शीर्ष 10 कमजोरियाँ

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

कोटलिन एप्लिकेशन सुरक्षा: व्यवहार में शीर्ष 10 कमजोरियाँ

\n

कोटलिन आत्मविश्वास से एंड्रॉइड और सर्वर एप्लिकेशन विकास के लिए सबसे लोकप्रिय भाषाओं में से एक है। हालाँकि, किसी भी अन्य भाषा की तरह, कोटलिन भी कमजोरियों से अछूता नहीं है। इस लेख में, हम शीर्ष 10 सबसे गंभीर सुरक्षा समस्याओं का विश्लेषण करेंगे जिनका सामना डेवलपर्स करते हैं, और दिखाएंगे कि व्यवहार में उनसे कैसे बचा जाए।

\n\n

1. SQL-इंजेक्शन (SQL Injection)

\n

इस तथ्य के बावजूद कि कोटलिन का उपयोग अक्सर ORM-लाइब्रेरी के साथ किया जाता है, SQL क्वेरी के साथ सीधा काम एक सामान्य प्रथा बनी हुई है।

\n

कमजोर कोड:

\n
fun getUser(id: String): User? {\n    val query = "SELECT * FROM users WHERE id = '$id'"\n    val result = connection.createStatement().executeQuery(query)\n    // ...\n}
\n

सुरक्षित संस्करण (PreparedStatement का उपयोग):

\n
fun 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\n

2. वेब-एप्लिकेशन में क्रॉस-साइट स्क्रिप्टिंग (XSS)

\n

Ktor या Spring Boot पर सर्वर एप्लिकेशन विकसित करते समय, आउटपुट को एस्केप करना अक्सर भूल जाते हैं।

\n

कमजोर कोड (Ktor):

\n
get("/user/{name}") {\n    val name = call.parameters["name"] ?: "अतिथि"\n    call.respondText("<h1>नमस्ते, $name!</h1>", ContentType.Text.Html)\n}
\n

सुरक्षित संस्करण:

\n
import 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\n

3. पासवर्ड का असुरक्षित भंडारण

\n

पासवर्ड को सादे टेक्स्ट में या कमजोर हैश का उपयोग करके संग्रहीत करना सबसे आम गलतियों में से एक है।

\n

गलत तरीका:

\n
fun savePassword(password: String) {\n    val hash = password.md5() // ऐसा कभी न करें!\n    database.saveHash(hash)\n}
\n

सही तरीका (bcrypt):

\n
import 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\n

4. लॉग के माध्यम से संवेदनशील डेटा का रिसाव

\n

डेवलपर्स अक्सर संवेदनशील डेटा को लॉग करते हैं, बिना यह जाँचे कि आउटपुट में क्या जा रहा है।

\n

समस्याग्रस्त कोड:

\n
logger.info("उपयोगकर्ता $userId टोकन के साथ प्रमाणित: $token")
\n

सुरक्षित संस्करण:

\n
logger.info("उपयोगकर्ता $userId सफलतापूर्वक प्रमाणित")\n// या मास्किंग का उपयोग करें:\nfun maskToken(token: String): String = \n    token.take(4) + "****" + token.takeLast(4)
\n

नियम: कभी भी पासवर्ड, टोकन, क्रेडिट कार्ड नंबर या व्यक्तिगत डेटा लॉग न करें। मास्किंग के लिए लाइब्रेरी का उपयोग करें (जैसे, Logstash)।

\n\n

5. असुरक्षित डिसीरियलाइज़ेशन

\n

कोटलिन सक्रिय रूप से JSON-सीरियलाइज़ेशन का उपयोग करता है। गलत कॉन्फ़िगरेशन RCE हमलों का कारण बन सकता है।

\n

कमजोर कोड (Jackson):

\n
val mapper = ObjectMapper()\nval obj = mapper.readValue(userInput, Any::class.j                

ब्लॉग

पुस्तक अनुशंसाएँ