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

\n\n

Go (Golang) est l'un des langages les plus populaires pour créer des services web à forte charge, des microservices et des applications réseau. Cependant, comme tout autre langage, Go nécessite une approche attentive de la sécurité. Si vous commencez tout juste à apprendre Go, il est important de connaître les principales vulnérabilités qui peuvent guetter votre application. Dans cet article, nous allons passer en revue les 10 menaces les plus courantes et montrer comment les éviter.

\n\n

1. Injections SQL (SQL Injection)

\n\n

L'injection SQL est l'une des vulnérabilités les plus anciennes et les plus dangereuses. Elle se produit lorsque l'entrée utilisateur est directement insérée dans une requête SQL.

\n\n

Exemple de code vulnérable :

\n
func getUser(db *sql.DB, id string) (*User, error) {\n    row := db.QueryRow("SELECT * FROM users WHERE id = " + id)\n    // ...\n}
\n\n

Comment corriger :

\n

Utilisez des requêtes paramétrées :

\n
func getUser(db *sql.DB, id string) (*User, error) {\n    row := db.QueryRow("SELECT * FROM users WHERE id = $1", id)\n    // ...\n}
\n\n

2. Scripting inter-sites (XSS)

\n\n

Le XSS se produit lorsque l'entrée utilisateur non échappée est affichée sur une page web. En Go, cela arrive souvent en utilisant html/template au lieu de text/template.

\n\n

Exemple de code vulnérable :

\n
fmt.Fprintf(w, "<p>Bonjour, %s</p>", r.URL.Query().Get("name"))
\n\n

Comment corriger :

\n

Utilisez html/template pour un échappement automatique :

\n
tmpl := template.Must(template.New("").Parse("<p>Bonjour, {{.}}</p>"))\ntmpl.Execute(w, r.URL.Query().Get("name"))
\n\n

3. Falsification de requête inter-sites (CSRF)

\n\n

Les attaques CSRF forcent un utilisateur à effectuer une action non désirée sur un site où il est authentifié. Les applications Go oublient souvent la protection contre CSRF.

\n\n

Solution :

\n

Utilisez la bibliothèque gorilla/csrf ou implémentez votre propre middleware :

\n
import "github.com/gorilla/csrf"\n\nfunc main() {\n    r := mux.NewRouter()\n    r.Use(csrf.Protect([]byte("clé-de-32-octets")))\n    // ...\n}
\n\n

4. Gestion non sécurisée des erreurs

\n\n

Une erreur courante consiste à renvoyer à l'utilisateur des messages d'erreur système qui peuvent révéler la structure interne de l'application.

\n\n

Exemple de code vulnérable :

\n
if err != nil {\n    http.Error(w, err.Error(), http.StatusInternalServerError)\n}
\n\n

Comment corriger :

\n
if err != nil {\n    log.Printf("Erreur : %v", err)\n    http.Error(w, "Erreur interne du serveur", http.StatusInternalServerError)\n}
\n\n

5. Fuite d'informations via les en-têtes

\n\n

Par défaut, le serveur Go peut divulguer la version de Go, le type de serveur et d'autres informations de service.

\n\n

Solution :

\n
type secureHandler struct {\n    next http.Handler\n}\n\nfunc (h *secureHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {\n    w.Header().Set("X-Content-Type-Options", "nosniff")\n    w.Header().Set("X-Frame-Options", "DENY")\n    w.Header().Set("X-XSS-Protection", "1; mode=block")\n    h.next.ServeHTTP(w, r)\n}
\n\n

6. Mauvaise gestion des goroutines

\n\n

Les goroutines sont un outil puissant de Go, mais leur mauvaise utilisation peut entraîner des conditions de course (race conditions) et des fuites de mémoire.

\n\n

Exemple de code vulnérable :

\n
var counter int\nfor i := 0; i < 1000; i++ {\n    go func() {\n        counter++ // condition de course !\n    }()\n}
\n\n

Comment corriger :

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

7. Stockage non sécurisé des mots de passe

\n\n

Stocker les mots de passe en clair ou avec des hachages faibles (MD5, SHA1) est une grave erreur.<

Blogs

Book Recommendations