検証コード (CAPTCHA) は、「コンピュータと人間を区別するための完全に自動化された公開チューリング テスト」およびヒューマン チューリング テストです。 ) は、ユーザーがコンピューターであるか人間であるかを区別する、公開されている完全に自動化されたプログラムです。これにより、悪意のあるパスワードのクラッキング、チケット詐欺、フォーラムのフラッディングが防止され、ハッカーが特定のプログラムを使用して特定の登録ユーザーが継続的にログイン試行することを暴力的にクラッキングすることを効果的に防止できます。実際、検証コードの使用は、多くのユーザーにとって一般的な方法です。この機能は比較的簡単な方法で実装されています。この質問はコンピュータによって生成および判断できますが、答えることができるのは人間だけです。コンピュータは CAPTCHA の質問に答えることができないため、質問に答えるユーザーは人間であると考えることができます。
従来の Web サイト検証コードの動作メカニズム
- クライアントはサーバーに検証コード画像の取得を要求します
- サーバーはランダムな文字列を生成します(検証コード値) セッションに書き込み、画像に検証コード値を書き込んでクライアントに返します
- クライアントは画像上の文字列を入力し、検証のためにサーバーに送信します
- サーバーは、クライアントによって送信された文字列値がセッション内の値と一致するかどうかを比較します。一致する場合、検証に合格します。
サーバーによって生成された検証コード値は次のとおりです。最初から最後までクライアントに返されないため、クライアントは写真からのみ識別できます 人間と機械の検証ロジックを保証するための検証コード文字列。
Go の HTTP 検証コード
思考
Go 言語の HTTP サーバーはデフォルトでは Session をサポートしていないため、検証コードの値は次のような別の方法で保存されます。これはセッションを使用しないロジックです。
- クライアントはサーバーに検証コード ID の取得を要求します。
- サーバーは検証コード ID を生成します。検証コード値を生成し、ID と値の間のマッピング関係をメモリまたはキャッシュに記録し、ID をクライアントに返します。
- クライアントは、返されたコードに基づいて検証コード イメージを取得するようにサーバーに要求します。 ID
- サーバーは検証コード ID を取得し、メモリまたはキャッシュ値から検証コードを取得し、その値を画像に書き込み、画像をクライアントに返します。
- クライアントは検証を送信します。コード ID (ステップ 1 で取得) と検証コード値を検証のためにサーバーに送信します。
- サーバーは検証コード ID を取得し、メモリまたはキャッシュから検証コード値を取得し、それを検証コード値と比較します。クライアントによって送信された
Example
- 検証コードの依存関係のインストール
github.com/dchest/captcha
- コード実装
package main import ( "fmt" "github.com/dchest/captcha" "log" "net/http" ) func main() { // 获取验证码 ID http.HandleFunc("/captcha/generate", func(w http.ResponseWriter, r *http.Request) { id := captcha.NewLen(6) if _, err := fmt.Fprint(w, id); err != nil { log.Println("generate captcha error", err) } }) // 获取验证码图片 http.HandleFunc("/captcha/image", func(w http.ResponseWriter, r *http.Request) { id := r.URL.Query().Get("id") if id == "" { http.Error(w, "Bad Request", http.StatusBadRequest) return } w.Header().Set("Content-Type", "image/png") if err := captcha.WriteImage(w, id, 120, 80); err != nil { log.Println("show captcha error", err) } }) // 业务处理 http.HandleFunc("/login", func(w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { log.Println("parseForm error", err) http.Error(w, "Internal Error", http.StatusInternalServerError) return } // 获取验证码 ID 和验证码值 id := r.FormValue("id") value := r.FormValue("value") // 比对提交的验证码值和内存中的验证码值 if captcha.VerifyString(id, value) { fmt.Fprint(w, "ok") } else { fmt.Fprint(w, "mismatch") } }) log.Fatal(http.ListenAndServe(":8080", nil)) }
-
実行
- /captcha/generate にアクセスして確認コード ID を取得します
- /captcha/image?id=確認コード ID にアクセスしてください
- /login にアクセスし、最初のステップで検証コード ID を入力し、2 番目のステップで検証コードの値を入力して検証結果を表示します
##プロジェクト アドレス