title: 【转载】实际问题系列:公司短信接口被攻击了,怎么防止
date: 2021-08-06 08:51:49
comment: false
toc: true
category:
- 技巧
tags: - 转载
- 攻击
- 防止
- 短信
- 接口
- 问题
本文转载自:实际问题系列:公司短信接口被攻击了,怎么防止
有了 QQ,微信之后短信的作用对个人好像没有什么特别的用处,平时朋友间的沟通都是通过微信 (也有 QQ),渐渐淡化了短信的用处。但是作为开发我们还是会接触短信平台的。
短信现在的用处:
- 网站和 app 的安全验证 (注册,登陆,修改密码等)
- 广告推送骚扰
- 生日祝福 (来自理财,保险,银行)
- 女朋友生
- 还有自信卖 A 货的 (感兴趣的看文末)
- .......
目前阿里云,百度云,腾讯云都有自己的短信平台,而且我们的系统中也都集成了。
曾经我们正式环境系统配置的是其中一家的短信平台,已经持续运行使用 2 年了。
在最近使用期间出现了一次被恶意发送好几万条短信 (最好在平台上开启每日最大限制,我们没开)。
我们的部分短信接口是 public 的 (忘记密码和注册功能),不需要授权即可直接 API 调用,而且我们系统中也是做了部分频控的,但是没有做 IP 的限制。
一个短信功能究竟该如何开发才能安全呢。
一句话:互联网上没有真正的安全,安全是相对的,就是尽可能提升攻击者的代价。
新手:只考虑能不能发送,研究短信平台接口文档,写代码调试,最终可以正常发送短信。写业务相关代码,相关信息存储缓存,等待验证,一个短信功能开发完成。
老手:研究短信平台接口文档,写代码调试,可以正常发送短信。继续封装短信接口,增加频控 例如短信发送间隔时间
,验证码过期时间
,同一账号发送限制
,次数限制的间隔时间
等。配置如下
captcha:
sms:
# 短信验证码过期时间(分)
expire: ${SMS_EXPIRE:5}
# 验证码发送间隔时间(秒)
interval: ${SMS_INTERVAL:60}
# 同一个账号发送次数限制
limit-time: ${SMS_LIMIT_TIME:10}
# 次数限制的间隔时间(时)
limit-interval: ${SMS_LIMIT_INTERVAL:12}
还有会增加接口调用 IP 限制 (防止同一个 IP 频繁调用接口),然后写业务代码,完成开发。
还可以过滤一些无效的短信发送,如:
1. 手机号校验#
手机号不合格的不发送,可以使用 google 的组件检查,国内外手机号都可以校验。
<dependency>
<groupId>com.googlecode.libphonenumber</groupId>
<artifactId>libphonenumber</artifactId>
<version>8.12.6</version>
</dependency>
2. 注册功能#
系统中已存在的不发送,在发送短信的时候校验手机号是否已注册,而不是真正注册提交数据的时候再校验。
3. 修改密码#
系统中不存在的不发送,在发送验证码的时候校验下手机号是否是系统中的用户。
以上的方案只是对同一个手机号和 IP 做了频控,但是如果攻击者使用不断更换 IP 给不同的手机号发送短信,那么就无法避免短信的浪费和用户的骚扰。
要解决就要使用图形验证码 或者行为式验证码
图形验证码较简单,而且不需要花钱,自己开发程序就可以实现,效果如下
这种视觉上看起来很费劲而且需要增加用户输入操作,体验不是很好,而且机器识别并解析其中的文字却比较容易。如果想要增加机器识别的难度就需要增加图片的模糊度,这样用户的错误率就更高了,体验更差。
行为式验证码 到这就不得不提逢年过节买车票让人抓狂的 12306 的图片验证,这是种点触式的,如下
还有目前更常用的方案是拖拽式的,如下
这种体验上就比图形要好很多,更方便美观,背景图还可以用来打广告。
行为式验证的核心思想是利用用户的 “行为特征” 来做验证安全判别,通过机器学习,深度学习对人的行为特征进行大量的分析。建立安全模型去区分人与机器程序。利用深度学习构建的神经网络是可以不断地自主学习的,在不断的验证过程中不断的学习新的特征分析 (来源百度百科)
一般企业没有这个能力,需要花钱买
不想花钱也可以通过抠图实现简单的滑块,服务端记录滑块抠图的位置到图片边缘的距离,把原图和滑块给前端,前端在用户滑动之后把滑动的距离传给服务端,服务端通过对比用户拖动滑块的距离来验证是否正确 (安全性不行)。
还有就是API 增加限流
总结#
- 频控,增加
短信发送间隔时间
,验证码过期时间
,同一账号发送限制
,次数限制的间隔时间
控制。 - 增加 IP 调用接口的频率。
- 通过校验避免一些不必要的接口调用,像
手机号格式校验
,注册功能:系统中已存在的不发送
,修改密码:系统中不存在的不发送
- 增加行为式验证码。
- 限流
“ 还是那句话,没有绝对的安全,安全是攻与防的较量。 ”