Heim >Backend-Entwicklung >Golang >Vereinfachen Sie die Gin-Eingabevalidierung in Go mit ginvalidator
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
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.
Warum nicht verwenden?
Stellen Sie sicher, dass Go auf Ihrem Computer installiert ist.
go mod init example.com/learning
Verwenden Sie go get, um die erforderlichen Pakete zu installieren.
go get -u github.com/gin-gonic/gin
go get -u github.com/bube054/ginvalidator
Eine der besten Möglichkeiten, etwas zu lernen, ist das Vorbild! Also krempeln wir die Ärmel hoch und beginnen mit dem Programmieren.
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 }
Führen Sie nun diese Datei aus, indem Sie go run main.go auf Ihrem Terminal ausführen.
go mod init example.com/learning
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!
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
? 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?
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
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 }
Das sagt uns das nun
Dies ist ein besseres Szenario, aber es kann noch verbessert werden. Machen wir weiter.
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
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() }
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
Ö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.
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