Go अनुप्रयोगों की सुरक्षा: शुरुआती लोगों के लिए शीर्ष 10 कमजोरियाँ
Go (Golang) अपने प्रदर्शन और अंतर्निहित सुरक्षा तंत्रों जैसे सख्त टाइपिंग और स्वचालित मेमोरी प्रबंधन के लिए प्रसिद्ध है। हालाँकि, किसी भी अन्य भाषा की तरह, यह डेवलपर को तार्किक त्रुटियों, गलत इनपुट प्रोसेसिंग या असुरक्षित कॉन्फ़िगरेशन से नहीं बचाता है। इस लेख में, हम शीर्ष 10 कमजोरियों पर चर्चा करेंगे, जिनका सामना शुरुआती Go-डेवलपर्स को सबसे अधिक बार करना पड़ता है, और दिखाएंगे कि उनसे कैसे बचा जाए।
1. SQL-इंजेक्शन (SQL Injection)
वेब अनुप्रयोगों की सबसे आम कमजोरी। यह तब उत्पन्न होती है जब उपयोगकर्ता इनपुट को सीधे SQL क्वेरी में जोड़ा जाता है।
खतरनाक कोड:
username := r.URL.Query().Get("username")query := fmt.Sprintf("SELECT * FROM users WHERE name='%s'", username)rows, err := db.Query(query)सुरक्षित कोड (पैरामीटराइज्ड क्वेरी का उपयोग करें):
username := r.URL.Query().Get("username")query := "SELECT * FROM users WHERE name=$1"rows, err := db.Query(query, username)सुझाव: अपने डेटाबेस के अनुसार हमेशा प्लेसहोल्डर ($1, ? या @p1) का उपयोग करें। उपयोगकर्ता डेटा के साथ fmt.Sprintf के माध्यम से कभी भी क्वेरी न बनाएं।
2. क्रॉस-साइट स्क्रिप्टिंग (XSS)
यह कमजोरी तब उत्पन्न होती है जब एप्लिकेशन HTML कोड में अप्रमाणित उपयोगकर्ता इनपुट प्रदर्शित करता है। Go में, यह अक्सर html/template का उपयोग बिना एस्केपिंग के करने पर होता है।
खतरनाक कोड:
tmpl := template.Must(template.New("page").Parse("<h1>{{.}}</h1>"))tmpl.Execute(w, r.URL.Query().Get("name")) // <script>alert('xss')</script>अंतर्निहित पैकेज html/template स्वचालित रूप से आउटपुट को एस्केप करता है, इसलिए सामान्य स्थिति में आप सुरक्षित हैं। लेकिन template.HTML फ़ंक्शन से सावधान रहें - ये एस्केपिंग को बंद कर देते हैं।
सुरक्षित दृष्टिकोण: केवल टेक्स्ट डेटा के लिए text/template का उपयोग करें, और वेब के लिए html/template का उपयोग करें। अत्यंत आवश्यकता के बिना template.HTML के उपयोग से बचें।
3. Race Conditions (डेटा रेस)
Go सक्रिय रूप से गोरूटीन का उपयोग करता है, और यदि कई गोरूटीन बिना सिंक्रोनाइज़ेशन के एक ही वेरिएबल को एक साथ पढ़ते और लिखते हैं, तो डेटा रेस उत्पन्न होती है। इससे एप्लिकेशन की गलत स्थिति और डेटा लीक हो सकता है।
खतरनाक कोड:
var counter intfor i := 0; i < 1000; i++ { go func() { counter++ // असुरक्षित! }()}सुरक्षित कोड (म्यूटेक्स का उपयोग करें):
var ( counter int mu sync.Mutex)for i := 0; i < 1000; i++ { go func() { mu.Lock() counter++ mu.Unlock() }()}सुझाव: साझा डेटा के साथ काम करते समय हमेशा sync.Mutex, sync.RWMutex या परमाणु संचालन (sync/atomic) का उपयोग करें। रेस का पता लगाने के लिए -race फ्लैग के साथ टेस्ट चलाएं।
4. Path Traversal (पथ ट्रैवर्सल)
यह कमजोरी हमलावर को ../ वर्णों का उपयोग करके अनुमत निर्देशिका के बाहर फ़ाइलों को पढ़ने की अनुमति देती है।
खतरनाक कोड:
filename := r.URL.Query().Get("file")data, _ := os.ReadFile("/data/" + filename) // /data/../../etc/passwdसुरक्षित कोड (पथ सफाई):
filename := r.URL.Query().Get("file")cleanPath := filepath.Clean("/data/" + filename)if !strings.HasPrefix(cleanPath, "/data/") { http.Error(w, "Invalid path", http.StatusBadRequest) return}data, _ := os.ReadFile(cleanPath)सुझाव: उप