Sécurité des applications Go : top 10 des vulnérabilités pour débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Sécurité des applications Go : top 10 des vulnérabilités pour débutants



Go (Golang) est réputé pour ses performances et ses mécanismes de sécurité intégrés, tels que le typage strict et la gestion automatique de la mémoire. Cependant, comme tout autre langage, il ne protège pas le développeur des erreurs logiques, du traitement incorrect des entrées ou d'une configuration non sécurisée. Dans cet article, nous allons passer en revue le top 10 des vulnérabilités les plus fréquemment rencontrées par les développeurs Go débutants, et montrer comment les éviter.



1. Injections SQL (SQL Injection)

La vulnérabilité la plus courante des applications web. Elle survient lorsque l'entrée utilisateur est directement concaténée dans une requête SQL.



Code dangereux :

username := r.URL.Query().Get("username")query := fmt.Sprintf("SELECT * FROM users WHERE name='%s'", username)rows, err := db.Query(query)


Code sécurisé (utilisation de requêtes paramétrées) :

username := r.URL.Query().Get("username")query := "SELECT * FROM users WHERE name=$1"rows, err := db.Query(query, username)


Conseil : Utilisez toujours des placeholders ($1, ? ou @p1) en fonction de votre base de données. Ne construisez jamais de requêtes via fmt.Sprintf avec des données utilisateur.



2. Cross-Site Scripting (XSS)

La vulnérabilité survient lorsque l'application affiche une entrée utilisateur non vérifiée dans du code HTML. En Go, cela arrive souvent lors de l'utilisation de html/template sans échappement.



Code dangereux :

tmpl := template.Must(template.New("page").Parse("<h1>{{.}}</h1>"))tmpl.Execute(w, r.URL.Query().Get("name")) // <script>alert('xss')</script>


Le package intégré html/template échappe automatiquement la sortie, donc dans le cas standard, vous êtes protégé. Mais soyez prudent avec les fonctions template.HTML — elles désactivent l'échappement.



Approche sécurisée : Utilisez text/template uniquement pour les données textuelles, et pour le web — html/template. Évitez d'utiliser template.HTML sauf en cas d'absolue nécessité.



3. Race Conditions (Conditions de course)

Go utilise activement les goroutines, et si plusieurs goroutines lisent et écrivent simultanément dans une même variable sans synchronisation, une condition de course se produit. Cela peut entraîner un état d'application incorrect et une fuite de données.



Code dangereux :

var counter intfor i := 0; i < 1000; i++ {    go func() {        counter++ // Non sécurisé !    }()}


Code sécurisé (utilisation d'un mutex) :

var (    counter int    mu      sync.Mutex)for i := 0; i < 1000; i++ {    go func() {        mu.Lock()        counter++        mu.Unlock()    }()}


Conseil : Utilisez toujours sync.Mutex, sync.RWMutex ou des opérations atomiques (sync/atomic) lorsque vous travaillez avec des données partagées. Lancez les tests avec le flag -race pour détecter les conditions de course.



4. Path Traversal (Dépassement de chemin)

Cette vulnérabilité permet à un attaquant de lire des fichiers en dehors du répertoire autorisé en utilisant les caractères ../.



Code dangereux :

filename := r.URL.Query().Get("file")data, _ := os.ReadFile("/data/" + filename) // /data/../../etc/passwd


Code sécurisé (nettoyage du chemin) :

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)


Conseil : Util

Blogs

Book Recommendations