Golang实现验证码功能与GDPR合规性问题探讨

Golang实现验证码功能与GDPR合规性问题探讨 大家好!

有人知道现有的、类似于reCaptcha的、用于集成验证码的Golang库吗? reCaptcha不符合GDPR(通用数据保护条例)的要求,所以我们正在寻找替代方案。

提前感谢!

1 回复

更多关于Golang实现验证码功能与GDPR合规性问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中实现GDPR合规的验证码功能,可以考虑以下方案:

1. 自建验证码方案(推荐)

使用开源库实现完全自主控制的验证码系统:

package main

import (
    "github.com/dchest/captcha"
    "net/http"
    "time"
)

// 生成验证码
func generateCaptcha(w http.ResponseWriter, r *http.Request) {
    id := captcha.New()
    http.SetCookie(w, &http.Cookie{
        Name:     "captcha_id",
        Value:    id,
        Expires:  time.Now().Add(10 * time.Minute),
        HttpOnly: true,
    })
    
    w.Header().Set("Content-Type", "image/png")
    captcha.WriteImage(w, id, 200, 80)
}

// 验证验证码
func verifyCaptcha(w http.ResponseWriter, r *http.Request) {
    id := r.FormValue("captcha_id")
    digits := r.FormValue("captcha_digits")
    
    if captcha.VerifyString(id, digits) {
        w.Write([]byte("验证成功"))
    } else {
        w.Write([]byte("验证失败"))
    }
}

2. 使用GDPR友好的第三方服务

hCaptcha替代方案

package main

import (
    "encoding/json"
    "net/http"
    "net/url"
    "io/ioutil"
)

type HCaptchaResponse struct {
    Success bool `json:"success"`
}

func verifyHCaptcha(secret, responseToken string) (bool, error) {
    resp, err := http.PostForm("https://hcaptcha.com/siteverify",
        url.Values{
            "secret":   {secret},
            "response": {responseToken},
        })
    if err != nil {
        return false, err
    }
    defer resp.Body.Close()
    
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return false, err
    }
    
    var result HCaptchaResponse
    json.Unmarshal(body, &result)
    return result.Success, nil
}

3. 完全无追踪的验证方案

package main

import (
    "crypto/rand"
    "encoding/base64"
    "fmt"
    "math/big"
    "strings"
)

// 生成数学验证码
type MathCaptcha struct {
    Question string
    Answer   int
}

func generateMathCaptcha() MathCaptcha {
    a, _ := rand.Int(rand.Reader, big.NewInt(10))
    b, _ := rand.Int(rand.Reader, big.NewInt(10))
    
    return MathCaptcha{
        Question: fmt.Sprintf("%d + %d = ?", a.Int64(), b.Int64()),
        Answer:   int(a.Int64() + b.Int64()),
    }
}

// 生成滑动拼图验证码
func generatePuzzleCaptcha() (string, string) {
    // 生成唯一标识符
    token := make([]byte, 32)
    rand.Read(token)
    tokenStr := base64.URLEncoding.EncodeToString(token)
    
    // 在实际应用中,这里会生成拼图图片
    // 返回token和验证所需数据
    return tokenStr, "puzzle_data"
}

4. 集成Turnstile(Cloudflare的无追踪验证)

package main

import (
    "encoding/json"
    "net/http"
    "net/url"
)

func verifyTurnstile(secretKey, responseToken, remoteIP string) (bool, error) {
    formData := url.Values{
        "secret":   {secretKey},
        "response": {responseToken},
        "remoteip": {remoteIP},
    }
    
    resp, err := http.PostForm("https://challenges.cloudflare.com/turnstile/v0/siteverify", formData)
    if err != nil {
        return false, err
    }
    defer resp.Body.Close()
    
    var result struct {
        Success bool `json:"success"`
    }
    
    if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
        return false, err
    }
    
    return result.Success, nil
}

GDPR合规关键点

  1. 数据最小化:仅收集必要数据
  2. 本地处理:验证码在用户浏览器本地完成
  3. 无追踪:不使用cookies或用户行为分析
  4. 透明性:明确告知用户验证码用途
  5. 数据保留:验证后立即删除相关数据
// GDPR合规的验证码处理器
type GDPRCompliantCaptcha struct {
    Store map[string]interface{}
}

func (g *GDPRCompliantCaptcha) CreateChallenge() (string, interface{}) {
    id := generateUUID()
    challenge := generateMathCaptcha()
    
    // 内存存储,会话结束后自动清理
    g.Store[id] = challenge
    return id, challenge
}

func (g *GDPRCompliantCaptcha) Verify(id string, answer interface{}) bool {
    challenge, exists := g.Store[id]
    if !exists {
        return false
    }
    
    // 验证后立即删除数据
    delete(g.Store, id)
    
    return validateAnswer(challenge, answer)
}

这些方案都避免了reCaptcha的GDPR合规问题,特别是自建方案和hCaptcha/Turnstile替代方案在实际项目中应用较多。

回到顶部