驗證碼(CAPTCHA)是「Completely Automated Public Turing test to tell Computers and Humans Apart」(全自動區分 計算機和人類的 圖靈測試)的縮寫,是一種區分用戶是計算機仍是人的公共全自動 程序。能夠防止:惡意破解密碼、 刷票、論壇灌水,有效防止某個黑客對某一個特定註冊用戶用特定程序暴力破解方式進行不斷的登錄嘗試,實際上用驗證碼是如今不少網站通行的方式,咱們利用比較簡易的方式實現了這個功能。這個問題能夠由計算機生成並評判,可是必須只有人類才能解答。因爲計算機沒法解答CAPTCHA的問題,因此回答出問題的用戶就能夠被認爲是人類。
因爲服務器生成的驗證碼值從始至終均未返回給客戶端,所以,客戶端只能從圖片中識別驗證碼字符串,從而保證人機校驗邏輯。git
Go 語言的 HTTP 服務器默認不支持 Session,所以驗證碼值須要換個思路存儲,如下是不使用 Session 的邏輯github
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)) }
運行緩存