परिचय
Kotlin एक आधुनिक प्रोग्रामिंग भाषा है जिसका उपयोग Android ऐप डेवलपमेंट, सर्वर-साइड समाधान (Ktor, Spring Boot) और क्रॉस-प्लेटफ़ॉर्म प्रोजेक्ट्स के लिए सक्रिय रूप से किया जाता है। इसकी सख्त टाइपिंग और null-सुरक्षा के बावजूद, डेवलपर्स अक्सर ऐसी गलतियाँ करते हैं जो गंभीर कमजोरियों का कारण बनती हैं। इस लेख में, हम OWASP मानकों पर आधारित Kotlin ऐप्स की शीर्ष 10 कमजोरियों पर चर्चा करेंगे और दिखाएंगे कि उनसे कैसे बचा जाए।
यह लेख शुरुआती और अनुभवी Kotlin डेवलपर्स दोनों के लिए उपयोगी होगा जो अपने प्रोजेक्ट्स की सुरक्षा बढ़ाना चाहते हैं।
1. SQL-इंजेक्शन (SQL Injection)
समस्या: उपयोगकर्ता इनपुट के माध्यम से दुर्भावनापूर्ण SQL कोड डालना।
कमजोर कोड का उदाहरण:
// कमजोर! स्ट्रिंग कॉन्केटनेशन का उपयोग न करेंfun getUserById(id: String): User? { val query = "SELECT * FROM users WHERE id = '$id'" val result = connection.createStatement().executeQuery(query) return result.toUser()}समाधान: पैरामीटराइज्ड क्वेरी (PreparedStatement) का उपयोग करें।
// सुरक्षितfun getUserById(id: String): User? { val query = "SELECT * FROM users WHERE id = ?" val preparedStatement = connection.prepareStatement(query) preparedStatement.setString(1, id) val result = preparedStatement.executeQuery() return result.toUser()}2. क्रॉस-साइट स्क्रिप्टिंग (XSS)
समस्या: वेब पेज में दुर्भावनापूर्ण JavaScript कोड डालना।
कमजोर कोड का उदाहरण (Ktor):
// कमजोर! आउटपुट को एस्केप न करेंget("/search") { val query = call.parameters["q"] ?: "" call.respondHtml { h1 { +"खोज परिणाम: $query" } // XSS! }}समाधान: HTML एस्केपिंग का उपयोग करें (जैसे, kotlinx.html एस्केपिंग के साथ)।
// सुरक्षितimport kotlinx.html.escapeHtml
get("/search") { val query = call.parameters["q"] ?: "" val safeQuery = query.escapeHtml() call.respondHtml { h1 { +"खोज परिणाम: $safeQuery" } }}3. पासवर्ड का असुरक्षित भंडारण
समस्या: पासवर्ड को सादे टेक्स्ट या कमजोर हैश (MD5, SHA-1) के साथ संग्रहीत करना।
कमजोर कोड का उदाहरण:
// कमजोर! MD5 पासवर्ड के लिए उपयुक्त नहीं हैfun saveUser(password: String) { val hash = MessageDigest.getInstance("MD5").digest(password.toByteArray()) // हैश को DB में सेव करें}समाधान: bcrypt, scrypt या Argon2 का उपयोग करें।
// सुरक्षित (jbcrypt लाइब्रेरी का उपयोग करके)import org.mindrot.jbcrypt.BCrypt
fun hashPassword(password: String): String { return BCrypt.hashpw(password, BCrypt.gensalt(12))}
fun checkPassword(password: String, hashed: String): Boolean { return BCrypt.checkpw(password, hashed)}4. लॉग के माध्यम से संवेदनशील डेटा का रिसाव
समस्या: पासवर्ड, टोकन, कार्ड नंबर लॉग करना।
कमजोर कोड का उदाहरण:
// कमजोर! संवेदनशील डेटा लॉग करनाfun login(username: String, password: String) { log.info("लॉगिन प्रयास: username=$username, password=$password")}समाधान: फ़िल्टर या मास्किंग का उपयोग करें।
// सुरक्षितfun login(username: String, password: String) { log.info("लॉगिन प्रयास: username=$username") // पासवर्ड लॉग न करें}5. असुरक्षित डीसेरियलाइज़ेशन
समस्या: अप्रमाणित डेटा के डीसेरियलाइज़ेशन पर मनमाना कोड निष्पादन।
कमजोर कोड का उदाहरण:
// कमजोर! बिना जाँच के डीसेरियलाइज़ेशनfun process
```