go实现类似cloudflare的隐藏真实ip代理转发请求限速人机验证代码
代码语言:golang
所属分类:其他
代码描述:go实现类似cloudflare的隐藏真实ip代理转发请求限速人机验证代码,可设置url单位时间内最多访问多少次,超过就要进行验证码识别真人操作,后台真实服务器ip不对外暴露。
代码标签: go 类似 cloudflare 隐藏 真实 ip 代理 转发 请求 限速 人机 验证 代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
package main import ( "fmt" "log" "net/http" "net/http/httputil" "net/url" "sync" "time" "github.com/dchest/captcha" "golang.org/x/time/rate" ) // ================================================================================================= // 配置项 // ================================================================================================= const ( // 代理服务器监听的地址 proxyListenAddr = ":8080" // 后端真实服务器的地址 backendServerURL = "http://localhost:8081" // IP 在验证列表中的过期时间 ipVerificationTimeout = 5 * time.Minute // 单个 URL 的访问频率: 5秒内1次 urlRequestInterval = 5 * time.Second ) // ================================================================================================= // IP 访问者管理 // ================================================================================================= // visitor 结构体用于存储每个 IP 对不同 URL 的速率限制器 type visitor struct { urlLimiters map[string]*rate.Limiter lastSeen time.Time } // 全局变量,用于存储每个 IP 地址的访问信息 var visitors = make(map[string]*visitor) var mu sync.Mutex // 全局变量,用于存储需要进行人机验证的 IP 地址 var needsVerification = make(map[string]time.Time) var verificationMutex sync.Mutex // 获取或为特定 IP 和 URL 创建速率限制器 func getURLLimiter(ip, urlPath string) *rate.Limiter { mu.Lock() defer mu.Unlock() v, exists := visitors[ip] if !exists { v = &visitor{ urlLimiters: make(map[string]*rate.Limiter), } visitors[ip] = v } v.lastSeen = time.Now() limiter, exists := v.urlLimiters[urlPath] if !exists { // 每 N 秒生成一个令牌,桶容量为 1 limiter = rate.NewLimiter(rate.Every(urlRequestInterval), 1) v.urlLimiters[urlPath] = limiter } return limiter } // 定期清理不活跃的 visitor 以释放内存 func cleanupVisitors() { for { time.Sleep(1 * time.Minute) mu.Lock() for ip, v := range visitors { .........完整代码请登录后点击上方下载按钮下载查看
网友评论0