क्यों Go डेवलपर्स भी हैकर्स के झांसे में आ जाते हैं?
\n\nGo अपनी गति, सरलता और बिल्ट-इन सुरक्षा टूल्स के लिए मशहूर है। लेकिन यह सोचना कि "मैं Go में लिख रहा हूँ, तो मैं सुरक्षित हूँ" — एक खतरनाक भ्रम है। SQL इंजेक्शन और XSS हमले अतीत की बात नहीं हैं। ये आज भी रोज़ाना वेबसाइटों को गिरा रहे हैं और डेटाबेस लीक कर रहे हैं, और Go इससे अछूता नहीं है।
\n\nसमस्या यह है कि Go डेवलपर को शक्तिशाली टूल्स देता है, लेकिन उन्हें आपके लिए इस्तेमाल नहीं करता। आप गलती से fmt.Sprintf के ज़रिए SQL क्वेरी जोड़ सकते हैं या बिना एस्केप किए यूज़र का कमेंट प्रदर्शित कर सकते हैं — और हैकर को आपके डेटाबेस तक पहुँच या विज़िटर के कुकीज़ चुराने का मौका मिल जाएगा।
इस लेख में हम दो सबसे खतरनाक हमलों — SQL इंजेक्शन और Cross-Site Scripting (XSS) — को समझेंगे और दिखाएंगे कि नेटिव Go और लोकप्रिय लाइब्रेरीज़ की मदद से इन्हें कैसे रोका जाए। आपको सिर्फ थ्योरी नहीं, बल्कि तैयार कोड टेम्पलेट मिलेंगे जिन्हें आप आज ही अपने प्रोजेक्ट में इस्तेमाल कर सकते हैं।
\n\nGo में SQL इंजेक्शन: ये कैसे होता है और इसे जड़ से कैसे खत्म करें
\n\nसामान्य गलती: स्ट्रिंग कॉन्केटनेशन
\n\nमान लीजिए आपके पास यूज़र आईडी से यूज़र ढूंढने का एक endpoint है। सबसे भोला (और खतरनाक) तरीका कुछ इस तरह दिखता है:
\n\npackage main\n\nimport (\n "database/sql"\n "fmt"\n "log"\n _ "github.com/lib/pq"\n)\n\nfunc getUserByID(db *sql.DB, userID string) {\n // खतरनाक! स्ट्रिंग कॉन्केटनेशन\n query := fmt.Sprintf("SELECT id, name, email FROM users WHERE id = '%s'", userID)\n rows, err := db.Query(query)\n if err != nil {\n log.Fatal(err)\n }\n defer rows.Close()\n // ... प्रोसेसिंग\n}\n\nअगर हैकर userID में 1' OR '1'='1 डाल दे, तो क्वेरी बन जाएगी:
SELECT id, name, email FROM users WHERE id = '1' OR '1'='1'\n\nबस — उसे पूरे डेटाबेस के सभी यूज़र मिल जाएंगे। और अगर वह 1'; DROP TABLE users; -- डाले, तो आपकी पूरी टेबल डिलीट हो जाएगी।
समाधान: पैरामीटराइज्ड क्वेरीज़ (prepared statements)
\n\nPostgreSQL, MySQL और SQLite के लिए Go ड्राइवर प्रिपेयर्ड स्टेटमेंट्स को सपोर्ट करते हैं। ये SQL कोड को डेटा से अलग करते हैं, और ड्राइवर अपने आप खतरनाक कैरेक्टर्स को एस्केप कर देता है।
\n\nfunc getUserByIDSafe(db *sql.DB, userID string) {\n // सुरक्षित: पैरामीटराइज्ड क्वेरी\n query := "SELECT id, name, email FROM users WHERE id = $1"\n rows, err := db.Query(query, userID)\n if err != nil {\n log.Fatal(err)\n }\n defer rows.Close()\n // ... प्रोसेसिंग\n}\n\nध्यान दें $1 पर — यह पहले आर्गुमेंट के लिए प्लेसहोल्डर है। MySQL में ? का इस्तेमाल होता है। अब भले ही userID में 1' OR '1'='1 हो, ड्राइवर इसे सिर्फ एक स्ट्रिंग वैल्यू मानेगा, SQL कोड का हिस्सा नहीं।
sqlx पैकेज के साथ काम करना
\n\ngithub.com/jmoiron/sqlx लाइब्रेरी कोड को और भी साफ बनाती है। यह नेम्ड पैरामीटर्स और स्ट्रक्चर में ऑटोमैटिक स्कैनिंग सपोर्ट करती है:
import "github.com/jmoiron/sqlx"\n\ntype User struct {\n ID int `db:"id"`\n Name string `db:"name"`\n Email string `db:"email"`\n}\n\nfunc getUserByIDSqlx(db *sqlx.DB, userID string) (*User, error) {\n user := &User{}\n // नेम्ड पैरामीटर :id\n err := db.Get(user, "SELECT * FROM users WHERE id = :id", sqlx.Named("id", userID))\n if err != nil {\n return nil, err\n }\n return user, nil\n}\n\nमहत्वपूर्ण: भले ही आप GORM या Ent जैसी ORM का इस्तेमाल कर रहे हों, सुनिश्चित करें कि वह प्रिपेयर्ड स्टेटमेंट्स का उपयोग करने के लिए कॉन्फ़िगर हो। कुछ पुराने ORM वर्जन "रॉ" क्वेरीज़ की अनुमति देते थे।
\n\nGo में XSS: जब आपकी वेबसाइट खुद को नुकसान पहुँचाए
\n\nXSS हमला कैसे होता है
\n\nXSS (Cross-Site Scripting) तब होता है जब आप बिना एस्केप किए यूज़र के कंटेंट को पेज पर डालते हैं। बुर