验证码安全总结
Captcha:区分计算机和人的区别的公共自动程序。在互联网的使用中,多为:防止暴力破解、刷票、论坛灌水、爬虫等行为。
验证码的历史变迁
文本验证码
验证码以文字的形式出现,通常可以在html源代码中找到。
图片拼接验证码
由N张独立的图片拼接成为一个验证码。
题库验证码
大量的计算题组成的验证码库,此种方式最大的危害就是题库是有限的,可以被穷举。
图形验证码
图形验证码的风险
- 前端生成验证码:前端生存或者前端校验都会存在绕过问题。
- 验证码不过期:验证码一直不过期,可以重复有效使用,或者长时间有效使用。
- 验证码返回在response数据包中。
- 验证码可识别:OCR技术。
图形验证码的自动识别技术
- 去噪处理:去掉图像里的干扰信息,如:背景的点、线等。
- 图像二值化:将图像上的像素点灰度值设置为0或255,也就是将整个图像呈现出黑白效果。目的是为了将图像与空白区分开来,方便后续步骤点进行。
- 切片处理:将每个字符所在区域分离成一个个点图片,确保一个图片内仅有一个文字。
- 文字图片标准化:对切片后的每个字符图片,还需要进行变形修复处理,比如:旋转、缩放等操作尽量将每一个字符图片都调整到标准格式,减少随机度。
- 字符模版识别:通过模版对比的方法识别。
如何设计一个安全的图形验证码
- 验证码后端随机生成,且验证码内容不能出现在客户端的网页源代码以及response数据包中。
- 验证码要有背景干扰,干扰元素包括:颜色、位置、数量且元素需要随机变化。
- 验证码后端校验,且使用一次后要求立即失效。
- 验证码在不同场景下需要与请求的参数一起提交给后端进行校验,且优先校验验证码。
短信验证码
短信验证码的风险
- 短信验证码太简单、短信验证码时效风险:一般4位的短信验证码可以在10分钟内暴力破解成功。
- 短信验证码不与手机号绑定。
- 短信验证码内容返回在response数据包中。
- 万能短信验证码:111111、000000、666666、888888。
- 短信炸弹攻击:由于发送短信接口没有设置频次上限导致。
- 短信内容自定义:常出现在一些发送短信的后端管理系统中,容易出现类似钓鱼等类型的攻击。
- 短信平台自身问题:被入侵。
- 监听:运营商上行与下行可能出现的监听、伪基站、GSM。
- 手机木马、APP Content Provider设计缺陷、短信同步到云平台导致泄漏。
安全的短信验证码
- 请求获取短信接口添加图形验证码。
- 单位时间内:单个IP、单个手机号设置请求限制,具体需要根据场景而定。
- 单个手机号每日短信验证码获取上限。
- 发送短信接口地址白名单。
语音验证码
语音验证码的风险
- 呼叫转移。
- 语音验证码成本太高。
新一代验证码
- Google reCaptcha:目前已经更新到第三代
- 滑动验证码
- 点选验证码
新一代验证码的风险
接码平台
用户行为模拟
- Python Selenium