Heim > Backend-Entwicklung > Golang > Vereinfachen Sie die Gin-Eingabevalidierung in Go mit ginvalidator

Vereinfachen Sie die Gin-Eingabevalidierung in Go mit ginvalidator

Linda Hamilton
Freigeben: 2024-12-01 11:52:11
Original
897 Leute haben es durchsucht

Simplify Gin Input Validation in Go with ginvalidator

Überblick

ginvalidator ist eine Reihe von Gin-Middlewares, die die umfangreiche Sammlung von Validatoren und Desinfektionsmitteln umfassen, die von meinem anderen Open-Source-Paket validatorgo angeboten werden. Es verwendet außerdem das beliebte Open-Source-Paket gjson für die JSON-Feldsyntax und ermöglicht so eine effiziente Abfrage und Extraktion von Daten aus JSON-Objekten.

Es ermöglicht Ihnen, sie auf vielfältige Weise zu kombinieren, sodass Sie Ihre Gin-Anfragen validieren und bereinigen können, und bietet Tools, mit denen Sie feststellen können, ob die Anfrage gültig ist oder nicht und welche Daten Ihren Validatoren zufolge abgeglichen wurden.

Es basiert auf der beliebten js/express-Bibliothek Express-Validator

Unterstützung

Diese Version von ginvalidator erfordert, dass Ihre Anwendung unter Go 1.16 ausgeführt wird.
Es wurde auch bestätigt, dass es mit Gin 1.x.x funktioniert.

Begründung

Warum nicht verwenden?

  • Handschriftliche Validatoren: Sie könnten Ihre eigene Validierungslogik manuell schreiben, aber das wird schnell eintönig und chaotisch. Jedes Mal, wenn Sie eine neue Validierung benötigen, schreiben Sie immer wieder denselben Code. Es ist leicht, Fehler zu machen, und es ist mühsam, sie beizubehalten.
  • Gins integrierte Modellbindung und -validierung: Gin verfügt über eine integrierte Validierung, ist aber nicht für jeden ideal. Struktur-Tags sind einschränkend und erschweren die Lesbarkeit Ihres Codes, insbesondere wenn Sie komplexe Regeln benötigen. Außerdem ist die Validierung zu eng an Ihre Modelle gebunden, was der Flexibilität nicht gut tut.
  • Andere Bibliotheken (wie Galidator): Es gibt zwar noch andere Bibliotheken, aber diese wirken oft zu komplex für ihre Aufgabe. Sie erfordern mehr Einrichtung und Arbeit als erwartet, insbesondere wenn Sie nur eine einfache, unkomplizierte Lösung für die Validierung wünschen.

Installation

Stellen Sie sicher, dass Go auf Ihrem Computer installiert ist.

Schritt 1: Erstellen Sie ein neues Go-Modul

  1. Erstellen Sie einen leeren Ordner mit einem Namen Ihrer Wahl.
  2. Öffnen Sie ein Terminal, navigieren Sie (cd) in diesen Ordner und initialisieren Sie ein neues Go-Modul:
go mod init example.com/learning
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Schritt 2: Erforderliche Pakete installieren

Verwenden Sie go get, um die erforderlichen Pakete zu installieren.

  1. Gin installieren:
go get -u github.com/gin-gonic/gin
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
  1. Ginvalidator installieren:
go get -u github.com/bube054/ginvalidator
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Erste Schritte

Eine der besten Möglichkeiten, etwas zu lernen, ist das Vorbild! Also krempeln wir die Ärmel hoch und beginnen mit dem Programmieren.

Aufstellen

Das erste, was man braucht, ist ein laufender Gin-Server. Lassen Sie uns eines implementieren, das jemandem „Hallo“ sagt. Erstellen Sie dazu ein main.go und fügen Sie dann den folgenden Code hinzu:

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/hello", func(ctx *gin.Context) {
        person := ctx.Query("person")
        ctx.String(http.StatusOK, "Hello, %s!", person)
    })

    r.Run() // listen and serve on 0.0.0.0:8080
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Führen Sie nun diese Datei aus, indem Sie go run main.go auf Ihrem Terminal ausführen.

go mod init example.com/learning
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Der HTTP-Server sollte laufen und Sie können http://localhost:8080/hello?person=John öffnen, um John zu begrüßen!

? Tipp:
Sie können Air mit Go und Gin verwenden, um Live-Nachladen zu implementieren. Diese starten den Server automatisch neu, wenn eine Datei geändert wird, sodass Sie dies nicht selbst tun müssen!

Hinzufügen eines Validators

Der Server funktioniert also, aber es gibt Probleme damit. Vor allem möchten Sie niemandem „Hallo“ sagen, wenn der Name der Person nicht festgelegt ist.
Wenn Sie beispielsweise zu http://localhost:8080/hello gehen, wird „Hallo,“ ausgegeben.

Hier kommt Ginvalidator zum Einsatz. Es stellt Validatoren, Desinfektionsmittel und Modifikatoren bereit, die zur Validierung Ihrer Anfrage verwendet werden.
Fügen wir einen Validator und einen Modifikator hinzu, der überprüft, ob die Personenabfragezeichenfolge nicht leer sein darf, mit dem Validator namens „Empty“ und dem Modifikator „Not:
“.

go get -u github.com/gin-gonic/gin
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

? Hinweis:

Der Kürze halber wird in den Codebeispielen gv als Alias ​​für ginvalidator verwendet.

Jetzt starten Sie Ihren Server neu und gehen Sie erneut zu http://localhost:8080/hello. Hmm, es wird immer noch „Hallo!“ ausgegeben... warum?

Umgang mit Validierungsfehlern

Die Ginvalidator-Validierungskette meldet Validierungsfehler nicht automatisch an Benutzer.
Der Grund dafür ist einfach: Wie möchten Sie die Fehler erfassen, wenn Sie weitere Validatoren oder mehr Felder hinzufügen? Möchten Sie eine Liste aller Fehler, nur einen pro Feld, nur einen insgesamt...?

Der nächste offensichtliche Schritt besteht also darin, den obigen Code erneut zu ändern und dieses Mal das Validierungsergebnis mit der ValidationResult-Funktion zu überprüfen:

go get -u github.com/bube054/ginvalidator
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wenn Sie nun erneut auf http://localhost:8080/hello zugreifen, sehen Sie den folgenden JSON-Inhalt, der der Übersichtlichkeit halber formatiert ist:

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/hello", func(ctx *gin.Context) {
        person := ctx.Query("person")
        ctx.String(http.StatusOK, "Hello, %s!", person)
    })

    r.Run() // listen and serve on 0.0.0.0:8080
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Das sagt uns das nun

  • In dieser Anfrage ist genau ein Fehler aufgetreten;
  • Dieses Feld heißt Person;
  • es befindet sich in der Abfragezeichenfolge (Speicherort: „Abfragen“);
  • Die ausgegebene Fehlermeldung war „Ungültiger Wert“.

Dies ist ein besseres Szenario, aber es kann noch verbessert werden. Machen wir weiter.

Bessere Fehlermeldungen erstellen

Alle Request-Location-Validatoren akzeptieren ein optionales zweites Argument, eine Funktion, die zum Formatieren der Fehlermeldung verwendet wird. Wenn Null angegeben wird, wird eine generische Standardfehlermeldung verwendet, wie im obigen Beispiel gezeigt.

go run main.go
Nach dem Login kopieren
Nach dem Login kopieren

Wenn Sie nun erneut auf http://localhost:8080/hello zugreifen, sehen Sie den folgenden JSON-Inhalt mit der neuen Fehlermeldung:

package main

import (
    "net/http"

    gv "github.com/bube054/ginvalidator"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/hello", gv.NewQuery("person", nil).
        Chain().
        Not().
        Empty(nil).
        Validate(), func(ctx *gin.Context) {
            person := ctx.Query("person")
            ctx.String(http.StatusOK, "Hello, %s!", person)
        })

    r.Run()
}
Nach dem Login kopieren
Nach dem Login kopieren

Zugriff auf validierte/bereinigte Daten

Sie können GetMatchedData verwenden, das automatisch alle Daten sammelt, die Ginvalidator validiert und/oder bereinigt hat. Auf diese Daten kann dann mit der Get-Methode von MatchedData:
zugegriffen werden

go mod init example.com/learning
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Öffnen Sie http://localhost:8080/hello?person=John, um John zu grüßen!

Die verfügbaren Speicherorte sind BodyLocation, CookieLocation QueryLocation, ParamLocation und HeaderLocation.
Jeder dieser Speicherorte enthält eine String-Methode, die den Speicherort zurückgibt, an dem validierte/bereinigte Daten gespeichert werden.

Desinfektion der Eingänge

Während der Benutzer keine leeren Personennamen mehr senden kann, kann er dennoch HTML in Ihre Seite einfügen! Dies wird als Cross-Site-Scripting-Schwachstelle (XSS) bezeichnet.
Mal sehen, wie es funktioniert. Gehen Sie zu http://localhost:8080/hello?person=John und Sie sollten „Hallo, John!“ sehen.
Obwohl dieses Beispiel in Ordnung ist, könnte ein Angreifer die Personenabfragezeichenfolge in ein

Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage