为了账号安全,请及时绑定邮箱和手机立即绑定

速率限制 HTTP 请求(通过 http.HandlerFunc 中间件)

速率限制 HTTP 请求(通过 http.HandlerFunc 中间件)

Go
临摹微笑 2021-07-08 14:23:50
我正在寻找编写一小段速率限制中间件:允许我为每个远程 IP 设置合理的速率(例如 10 req/s)可能(但不是必须)允许爆发丢弃(关闭?)超过速率的连接并返回 HTTP 429然后,我可以围绕身份验证路由或其他可能容易受到暴力攻击的路由(即使用过期令牌等的密码重置 URL)进行包装。有人强行使用 16 或 24 字节令牌的可能性非常低,但多走一步也无妨。我看过https://code.google.com/p/go-wiki/wiki/RateLimiting但我不确定如何将它与 http.Request(s) 协调。此外,我不确定我们如何在任何时间段内“跟踪”来自给定 IP 的请求。理想情况下,我最终会得到这样的结果,注意我在反向代理 (nginx) 后面,所以我们正在检查REMOTE_ADDRHTTP 标头而不是使用r.RemoteAddr:// Rate-limiting middlewarefunc rateLimit(h http.HandlerFunc) http.HandlerFunc {    return func(w http.ResponseWriter, r *http.Request) {        remoteIP := r.Header.Get("REMOTE_ADDR")        for req := range (what here?) {            // what here?            // w.WriteHeader(429) and close the request if it exceeds the limit            // else pass to the next handler in the chain            h.ServeHTTP(w, r)        }}// Example routesr.HandleFunc("/login", use(loginForm, rateLimit, csrf)r.HandleFunc("/form", use(editHandler, rateLimit, csrf)// Middleware wrapper, for contextfunc use(h http.HandlerFunc, middleware ...func(http.HandlerFunc) http.HandlerFunc) http.HandlerFunc {    for _, m := range middleware {        h = m(h)    }    return h}我很感激这里的一些指导。
查看完整描述

3 回答

  • 3 回答
  • 0 关注
  • 300 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信