FastAPI验证码会话实现抵御自动化攻击的有效性及漏洞问询
验证码方案有效性评估与漏洞分析
基础防护能力
当前方案仅能阻挡无定制的通用爬虫,针对该站点做过简单适配的自动化攻击完全可以绕过,远不足以抵御定向自动化攻击,即使不用付费打码服务也能轻松突破。
现有代码的安全漏洞
- 验证码单次有效性缺失:验证码校验通过后未清除会话中存储的
captcha值,攻击者只要拿到1次正确的验证码,即可在同一会话下无限次提交表单,完全绕过后续校验,是当前最严重的逻辑漏洞。 - 验证码本身可识别性过高:你使用的是最基础的
ImageCaptcha生成的无干扰验证码,开源轻量OCR工具对这类验证码的识别率可达90%以上,完全不需要借助付费打码服务即可批量破解;同时5位大写字母+数字的组合仅有约6000万种可能,暴力猜解成本极低。 - 接口无速率限制:
/start-session验证码获取接口、/contact-submission表单提交接口均无IP或会话层面的频率限制,攻击者可短时间内批量生成会话猜解验证码,或是批量提交垃圾请求,甚至打垮你的服务。 - 错误分支重置逻辑不合理:验证码校验失败后,你直接将
captcha值设置为随机UUID,而非清空字段。此时如果用户不重新调用验证码获取接口,无论输入什么内容都不可能通过校验,会导致正常用户输错一次验证码后,未刷新页面前永远提交失败。 - 会话Cookie安全属性缺失:会话Cookie未配置
Secure、HttpOnly、SameSite属性,非HTTPS部署时易被中间人窃听会话,未开HttpOnly时如果站点存在XSS漏洞会被窃取会话Cookie,未开SameSite可能遭受CSRF攻击。 - 内存会话存在溢出风险:未做会话过期清理和最大数量限制,攻击者可以高频请求生成大量会话,占满服务内存导致OOM崩溃。
- 缺失验证码存在性判断:当用户未调用
/start-session直接提交表单时,代码用随机UUID作为默认值比对,仅返回验证码错误,无明确引导逻辑,也可被攻击者用来探测会话是否存在有效验证码。
修复建议
- 验证码校验通过后立刻删除会话中的
captcha字段,保证单验证码仅可使用1次。 - 优化验证码生成逻辑:增加干扰线、噪点、字符倾斜扭曲等防识别策略,或更换为行为式验证码、交互式验证码,同时可将验证码长度提升至6位以上。
- 给两个核心接口添加速率限制:比如单个IP1分钟内最多请求10次验证码,表单提交失败5次后临时封禁10分钟。
- 验证码校验失败后直接清空会话中的
captcha字段,明确提示用户重新获取验证码。 - 给会话Cookie添加
Secure(HTTPS站点必填)、HttpOnly、SameSite=Lax属性,降低会话被窃取的风险。 - 给内存会话添加过期自动清理逻辑,限制最大并发会话数,避免被恶意请求打垮。
内容的提问来源于stack exchange,提问作者Landon Patterson
相关产品推荐
相关产品推荐

