ginvalidator는 다른 오픈 소스 패키지 validatorgo에서 제공하는 광범위한 유효성 검사기 및 살균제 컬렉션을 포함하는 Gin 미들웨어 세트입니다. 또한 JSON 필드 구문에 인기 있는 오픈 소스 패키지 gjson을 사용하여 JSON 개체에서 데이터를 효율적으로 쿼리하고 추출합니다.
Gin 요청을 검증하고 정리할 수 있도록 다양한 방법으로 이를 결합할 수 있으며 요청이 유효한지 여부, 검증자에 따라 어떤 데이터가 일치했는지 확인하는 도구를 제공합니다.
인기 있는 js/express 라이브러리 express-validator를 기반으로 합니다
이 버전의 ginvalidator를 사용하려면 애플리케이션이 Go 1.16에서 실행되어야 합니다.
Gin 1.x.x에서도 작동하는 것으로 확인되었습니다.
왜 사용하지 않으시나요?
컴퓨터에 Go가 설치되어 있는지 확인하세요.
go mod init example.com/learning
go get을 사용하여 필요한 패키지를 설치하세요.
go get -u github.com/gin-gonic/gin
go get -u github.com/bube054/ginvalidator
무언가를 배우는 가장 좋은 방법 중 하나는 모범을 보이는 것입니다! 이제 소매를 걷어 올리고 코딩을 시작해 보겠습니다.
가장 먼저 필요한 것은 Gin 서버를 실행하는 것입니다. 누군가에게 인사하는 것을 구현해 봅시다. 이를 위해 main.go를 생성한 후 다음 코드를 추가하세요:
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 }
이제 터미널에서 go run main.go를 실행하여 이 파일을 실행하세요.
go mod init example.com/learning
HTTP 서버가 실행 중이어야 하며 http://localhost:8080/hello?person=John을 열어 John에게 경의를 표할 수 있습니다!
? 팁:
Go 및 Gin과 함께 Air를 사용하여 실시간 재로드를 구현할 수 있습니다. 파일이 변경될 때마다 자동으로 서버를 다시 시작하므로 직접 수행할 필요가 없습니다!
서버는 작동하고 있는데 문제가 있는 것 같네요. 특히 이름이 설정되지 않은 사람에게는 인사하고 싶지 않습니다.
예를 들어 http://localhost:8080/hello로 이동하면 "Hello"가 인쇄됩니다.
여기서 ginvalidator가 유용하게 사용됩니다. 요청을 검증하는 데 사용되는 검증기, 살균제 및 수정자를 제공합니다.
이름이 비어 있는 유효성 검사기와 Not이라는 수정자를 사용하여 개인 쿼리 문자열이 비어 있을 수 없는지 확인하는 유효성 검사기와 수정자를 추가해 보겠습니다.
go get -u github.com/gin-gonic/gin
? 참고:
간결성을 위해 코드 예제에서는 gv가 ginvalidator의 별칭으로 사용되었습니다.
이제 서버를 다시 시작하고 다시 http://localhost:8080/hello로 이동하세요. 흠, 여전히 "Hello, !"가 인쇄됩니다... 왜일까요?
ginvalidator 유효성 검사 체인은 유효성 검사 오류를 사용자에게 자동으로 보고하지 않습니다.
그 이유는 간단합니다. 더 많은 유효성 검사기를 추가하거나 더 많은 필드에 대해 오류를 어떻게 수집하시겠습니까? 모든 오류 목록을 필드당 하나씩, 전체적으로 하나씩만 원하십니까...
따라서 다음 단계는 위의 코드를 다시 변경하는 것입니다. 이번에는 ValidationResult 함수를 사용하여 유효성 검사 결과를 확인합니다.
go get -u github.com/bube054/ginvalidator
이제 http://localhost:8080/hello에 다시 액세스하면 명확성을 위해 형식이 지정된 다음 JSON 콘텐츠가 표시됩니다.
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 }
이것이 우리에게 말하는 것은
이것은 더 나은 시나리오이지만 여전히 개선될 수 있습니다. 계속해보겠습니다.
모든 요청 위치 유효성 검사기는 오류 메시지 형식을 지정하는 데 사용되는 함수인 선택적 두 번째 인수를 허용합니다. nil이 제공되면 위의 예와 같이 기본 일반 오류 메시지가 사용됩니다.
go run main.go
이제 http://localhost:8080/hello에 다시 액세스하면 새로운 오류 메시지와 함께 다음 JSON 콘텐츠가 표시됩니다.
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() }
Ginvalidator가 검증 및/또는 삭제한 모든 데이터를 자동으로 수집하는 GetMatchedData를 사용할 수 있습니다. 그런 다음 MatchedData의 Get 메서드를 사용하여 이 데이터에 액세스할 수 있습니다.
go mod init example.com/learning
http://localhost:8080/hello?person=John을 열어 John에게 경의를 표하세요!
사용 가능한 위치는 BodyLocation, CookieLocation QueryLocation, ParamLocation 및 HeaderLocation입니다.
이러한 각 위치에는 검증/삭제된 데이터가 저장되는 위치를 반환하는 문자열 메서드가 포함되어 있습니다.
사용자는 더 이상 빈 사람 이름을 보낼 수 없지만 페이지에 HTML을 삽입할 수는 있습니다! 이를 XSS(Cross-Site Scripting) 취약점이라고 합니다.
그것이 어떻게 작동하는지 봅시다. http://localhost:8080/hello?person=John로 이동하면 "안녕하세요, John!"이 표시됩니다.
이 예는 괜찮지만 공격자는 개인 쿼리 문자열을