أمان تطبيقات 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 بشكل نشط goroutines، وإذا قامت عدة goroutines بقراءة وكتابة متغير واحد في نفس الوقت دون مزامنة، يحدث سباق بيانات. قد يؤدي ذلك إلى حالة تطبيق غير صحيحة وتسرب بيانات.
الكود الخطير:
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)نصيحة: استخدم