Sicherheit von Go-Anwendungen: Top-10 Schwachstellen für Anfänger

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Sicherheit von Go-Anwendungen: Top-10 Schwachstellen für Anfänger



Go (Golang) ist bekannt für seine Leistung und integrierte Sicherheitsmechanismen wie strenge Typisierung und automatische Speicherverwaltung. Wie jede andere Sprache schützt es den Entwickler jedoch nicht vor logischen Fehlern, falscher Eingabeverarbeitung oder unsicherer Konfiguration. In diesem Artikel analysieren wir die Top-10 Schwachstellen, auf die Anfänger in der Go-Entwicklung am häufigsten stoßen, und zeigen, wie man sie vermeidet.



1. SQL-Injection

Die häufigste Schwachstelle von Webanwendungen. Sie tritt auf, wenn Benutzereingaben direkt in eine SQL-Abfrage konkateniert werden.



Gefährlicher Code:

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


Sicherer Code (Verwendung parametrisierter Abfragen):

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


Tipp: Verwenden Sie immer Platzhalter ($1, ? oder @p1) abhängig von Ihrer Datenbank. Erstellen Sie niemals Abfragen mit fmt.Sprintf und Benutzerdaten.



2. Cross-Site Scripting (XSS)

Die Schwachstelle tritt auf, wenn die Anwendung ungeprüfte Benutzereingaben im HTML-Code anzeigt. In Go passiert dies häufig bei der Verwendung von html/template ohne Escaping.



Gefährlicher Code:

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


Das integrierte Paket html/template escaped die Ausgabe automatisch, daher sind Sie im Standardfall geschützt. Seien Sie jedoch vorsichtig mit den Funktionen template.HTML – sie deaktivieren das Escaping.



Sicherer Ansatz: Verwenden Sie text/template nur für Textdaten und für das Web html/template. Vermeiden Sie die Verwendung von template.HTML ohne zwingende Notwendigkeit.



3. Race Conditions (Datenrennen)

Go verwendet aktiv Goroutinen, und wenn mehrere Goroutinen gleichzeitig ohne Synchronisation in dieselbe Variable lesen und schreiben, entsteht ein Datenrennen. Dies kann zu einem inkorrekten Anwendungszustand und Datenlecks führen.



Gefährlicher Code:

var counter intfor i := 0; i < 1000; i++ {    go func() {        counter++ // Unsicher!    }()}


Sicherer Code (Verwendung eines Mutex):

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


Tipp: Verwenden Sie immer sync.Mutex, sync.RWMutex oder atomare Operationen (sync/atomic) bei der Arbeit mit gemeinsamen Daten. Führen Sie Tests mit dem Flag -race aus, um Datenrennen zu erkennen.



4. Path Traversal (Pfadumgehung)

Diese Schwachstelle ermöglicht es einem Angreifer, Dateien außerhalb des erlaubten Verzeichnisses zu lesen, indem er die Zeichen ../ verwendet.



Gefährlicher Code:

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


Sicherer Code (Bereinigung des Pfades):

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)


Tipp: Verw

Blogs

Buchempfehlungen