Skip to content

验证码安全总结

Captcha:区分计算机和人的区别的公共自动程序。在互联网的使用中,多为:防止暴力破解、刷票、论坛灌水、爬虫等行为。

验证码的历史变迁

文本验证码

验证码以文字的形式出现,通常可以在html源代码中找到。

图片拼接验证码

由N张独立的图片拼接成为一个验证码。

题库验证码

大量的计算题组成的验证码库,此种方式最大的危害就是题库是有限的,可以被穷举。

图形验证码

图形验证码的风险

  • 前端生成验证码:前端生存或者前端校验都会存在绕过问题。
  • 验证码不过期:验证码一直不过期,可以重复有效使用,或者长时间有效使用。
  • 验证码返回在response数据包中。
  • 验证码可识别:OCR技术。

图形验证码的自动识别技术

  1. 去噪处理:去掉图像里的干扰信息,如:背景的点、线等。
  2. 图像二值化:将图像上的像素点灰度值设置为0或255,也就是将整个图像呈现出黑白效果。目的是为了将图像与空白区分开来,方便后续步骤点进行。
  3. 切片处理:将每个字符所在区域分离成一个个点图片,确保一个图片内仅有一个文字。
  4. 文字图片标准化:对切片后的每个字符图片,还需要进行变形修复处理,比如:旋转、缩放等操作尽量将每一个字符图片都调整到标准格式,减少随机度。
  5. 字符模版识别:通过模版对比的方法识别。

如何设计一个安全的图形验证码

  • 验证码后端随机生成,且验证码内容不能出现在客户端的网页源代码以及response数据包中。
  • 验证码要有背景干扰,干扰元素包括:颜色、位置、数量且元素需要随机变化。
  • 验证码后端校验,且使用一次后要求立即失效。
  • 验证码在不同场景下需要与请求的参数一起提交给后端进行校验,且优先校验验证码。

短信验证码

短信验证码的风险

  • 短信验证码太简单、短信验证码时效风险:一般4位的短信验证码可以在10分钟内暴力破解成功。
  • 短信验证码不与手机号绑定。
  • 短信验证码内容返回在response数据包中。
  • 万能短信验证码:111111、000000、666666、888888。
  • 短信炸弹攻击:由于发送短信接口没有设置频次上限导致。
  • 短信内容自定义:常出现在一些发送短信的后端管理系统中,容易出现类似钓鱼等类型的攻击。
  • 短信平台自身问题:被入侵。
  • 监听:运营商上行与下行可能出现的监听、伪基站、GSM。
  • 手机木马、APP Content Provider设计缺陷、短信同步到云平台导致泄漏。

安全的短信验证码

  • 请求获取短信接口添加图形验证码。
  • 单位时间内:单个IP、单个手机号设置请求限制,具体需要根据场景而定。
  • 单个手机号每日短信验证码获取上限。
  • 发送短信接口地址白名单。

语音验证码

语音验证码的风险

  • 呼叫转移。
  • 语音验证码成本太高。

新一代验证码

  • Google reCaptcha:目前已经更新到第三代
  • 滑动验证码
  • 点选验证码

新一代验证码的风险

接码平台
用户行为模拟
  • Python Selenium