给登录接口限流,该按 IP 还是按用户名?成功的登录要不要计数?限流本身会不会变成攻击面?这篇用 Flask-Limiter 把四种策略的结果摆在一起,只验证限流这一层的行为。
同一个 IP 连续 5 次正确登录: [200, 200, 200, 429, 429]
第 76 篇讲 Flask-Limiter 的基本用法,第 111 篇讲自己实现的令牌桶,这一篇讲登录保护的策略取舍。
连续 5 次正确登录: [200, 200, 200, 200, 200] 同一个 IP 连续 4 次错误密码: [401, 401, 401, 429] 之后用正确的密码登录: 429 (被限流挡住,即使密码正确)
对 ann 用 5 个不同的 IP 各猜 1 次: [401, 401, 401, 429, 429] 这时 bob 用同样的 IP 登录: 200 (别的账号不受影响) 但真正的 ann 此时也被挡住: 429 (攻击者可以借此让账号暂时无法登录——这是按用户名限流的副作用)
同一个 IP 猜 ann 4 次: [401, 401, 401, 429] 同一个 IP 再换 10 个不同的用户名各猜 1 次: [401, 401, 401, 401, 401, 401, 401, 429, 429, 429]
第 4 次 → 429 {} | 正文: <!doctype html> <html lang=en> <title>429 Too Many Requests</title> <h