ホームページ バックエンド開発 Golang ginvalidator を使用して Go での Jin 入力検証を簡素化する

ginvalidator を使用して Go での Jin 入力検証を簡素化する

Dec 01, 2024 am 11:52 AM

Simplify Gin Input Validation in Go with ginvalidator

概要

ginvalidator は、私の他のオープンソース パッケージ validatorgo が提供するバリデーターとサニタイザーの広範なコレクションをラップする、Gin ミドルウェアのセットです。また、JSON フィールド構文に人気のオープンソース パッケージ gjson を使用し、JSON オブジェクトからのデータの効率的なクエリと抽出を提供します。

Gin リクエストを検証してサニタイズできるように、これらをさまざまな方法で組み合わせることができ、リクエストが有効かどうか、バリデータに従ってどのデータが一致したかを判断するツールを提供します。

人気のある js/express ライブラリの Express-validator に基づいています

サポート

このバージョンの ginvalidator では、アプリケーションが Go 1.16 で実行されている必要があります。
また、Gin 1.x.x で動作することも確認されています。

理論的根拠

なぜ使用しないのでしょうか?

  • 手書きバリデータ: 独自の検証ロジックを手動で作成することもできますが、繰り返しが多くなり、すぐに面倒になってしまいます。新しい検証が必要になるたびに、同じ種類のコードを何度も書くことになります。間違いを犯しやすく、それを維持するのは大変です。
  • Gin の組み込みモデルのバインディングと検証: Gin には検証機能が組み込まれていますが、すべての人にとって理想的なわけではありません。構造体タグには制限があり、特に複雑なルールが必要な場合、コードが読みにくくなります。さらに、検証はモデルに強く結びつきすぎるため、柔軟性があまり良くありません。
  • その他のライブラリ (Galidator など): 他にもライブラリはありますが、機能に対して複雑すぎると感じることがよくあります。特に検証のためのシンプルで単純なソリューションが必要な場合は、予想以上に多くのセットアップと作業が必要です。

インストール

マシンに Go がインストールされていることを確認してください。

ステップ 1: 新しい Go モジュールを作成する

  1. 任意の名前で空のフォルダーを作成します。
  2. ターミナルを開き、そのフォルダーに移動 (cd) し、新しい Go モジュールを初期化します。
go mod init example.com/learning
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ステップ 2: 必要なパッケージをインストールする

go get を使用して、必要なパッケージをインストールします。

  1. ジンをインストールします:
go get -u github.com/gin-gonic/gin
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
  1. ginvalidator をインストールします。
go get -u github.com/bube054/ginvalidator
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

はじめる

何かを学ぶための最良の方法の 1 つは、例を見ることです。それでは、袖をまくってコーディングを始めましょう。

設定

最初に必要なのは、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 が役に立ちます。リクエストを検証するために使用されるバリデーター、サニタイザー、およびモディファイアーを提供します。
個人のクエリ文字列が空であってはいけないことをチェックするバリデーターと修飾子を追加しましょう。バリデーターの名前は Empty 、修飾子の名前は Not:
です。

go get -u github.com/gin-gonic/gin
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

? 注:

簡潔にするために、コード例では gv が ginvalidator のエイリアスとして使用されています。

次に、サーバーを再起動し、再度 http://localhost:8080/hello にアクセスします。うーん、まだ「Hello, !」と表示されます...なぜですか?

検証エラーの処理

ginvalidator 検証チェーンは、検証エラーをユーザーに自動的に報告しません。
その理由は簡単です。バリデーターを追加したり、フィールドを追加したりするときに、どのようにエラーを収集する必要があるでしょうか。すべてのエラーのリスト (フィールドごとに 1 つだけ、全体で 1 つだけ) が必要ですか...?

次の明らかなステップは、上記のコードを再度変更し、今回は 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
}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

さて、これが私たちに伝えていることは、

  • このリクエストには 1 つだけエラーがありました;
  • このフィールドは person と呼ばれます;
  • クエリ文字列内にあります (場所: "queries");
  • 表示されたエラー メッセージは「無効な値」でした。

これはより良いシナリオですが、まだ改善の余地があります。続けてみましょう。

より適切なエラー メッセージの作成

すべてのリクエスト位置バリデータは、オプションの 2 番目の引数を受け入れます。これは、エラー メッセージのフォーマットに使用される関数です。 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()
}
ログイン後にコピー
ログイン後にコピー

検証/サニタイズされたデータへのアクセス

GetMatchedData を使用すると、ginvalidator が検証および/またはサニタイズしたすべてのデータが自動的に収集されます。このデータは、MatchedData:
の Get メソッドを使用してアクセスできます。

go mod init example.com/learning
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

http://localhost:8080/hello?person=John を開いて、ジョンに敬意を表します!

使用可能な場所は、BodyLocation、CookieLocation、QueryLocation、ParamLocation、および HeaderLocation です。
これらの各場所には、検証/サニタイズされたデータが保存されている場所を返す String メソッドが含まれています。

入力のサニタイズ

ユーザーは空の人名を送信できなくなりましたが、HTML をページに挿入することはできます。これは、クロスサイト スクリプティングの脆弱性 (XSS) として知られています。
どのように機能するかを見てみましょう。 http://localhost:8080/hello?person=John にアクセスすると、「こんにちは、ジョン!」と表示されるはずです。
この例は問題ありませんが、攻撃者は人物のクエリ文字列を

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golangの目的:効率的でスケーラブルなシステムの構築 Golangの目的:効率的でスケーラブルなシステムの構築 Apr 09, 2025 pm 05:17 PM

GO言語は、効率的でスケーラブルなシステムの構築においてうまく機能します。その利点には次のものがあります。1。高性能:マシンコードにコンパイルされ、速度速度が速い。 2。同時プログラミング:ゴルチンとチャネルを介してマルチタスクを簡素化します。 3。シンプルさ:簡潔な構文、学習コストとメンテナンスコストの削減。 4。クロスプラットフォーム:クロスプラットフォームのコンパイル、簡単な展開をサポートします。

Golang and C:Concurrency vs. Raw Speed Golang and C:Concurrency vs. Raw Speed Apr 21, 2025 am 12:16 AM

Golangは並行性がCよりも優れていますが、Cは生の速度ではGolangよりも優れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達成します。これは、多数の同時タスクの処理に適しています。 2)Cコンパイラの最適化と標準ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

Golang vs. Python:重要な違​​いと類似点 Golang vs. Python:重要な違​​いと類似点 Apr 17, 2025 am 12:15 AM

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

Golang vs. Python:パフォーマンスとスケーラビリティ Golang vs. Python:パフォーマンスとスケーラビリティ Apr 19, 2025 am 12:18 AM

Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

パフォーマンスレース:ゴラン対c パフォーマンスレース:ゴラン対c Apr 16, 2025 am 12:07 AM

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

CとGolang:パフォーマンスが重要な場合 CとGolang:パフォーマンスが重要な場合 Apr 13, 2025 am 12:11 AM

Cは、ハードウェアリソースと高性能の最適化が必要なシナリオにより適していますが、Golangは迅速な開発と高い並行性処理が必要なシナリオにより適しています。 1.Cの利点は、ハードウェア特性と高い最適化機能に近いものにあります。これは、ゲーム開発などの高性能ニーズに適しています。 2.Golangの利点は、その簡潔な構文と自然な並行性サポートにあり、これは高い並行性サービス開発に適しています。

Golangの影響:速度、効率、シンプルさ Golangの影響:速度、効率、シンプルさ Apr 14, 2025 am 12:11 AM

speed、効率、およびシンプル性をspeedsped.1)speed:gocompilesquilesquicklyandrunseffictient、理想的なlargeprojects.2)効率:等系dribribraryreducesexexternaldedenciess、開発効果を高める3)シンプルさ:

GolangとC:パフォーマンスのトレードオフ GolangとC:パフォーマンスのトレードオフ Apr 17, 2025 am 12:18 AM

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

See all articles