现在基本上大部分的 APP 或者网站的开发方式都是前后端分离, 前后端分离的好处大家都懂我就不复读了.
这样的设计也极大的方便了爬虫工作者, 但是谁也不想让自己的服务的数据被第三方 copy 出去, 尤其是一些用户数据以及相关的业务数据, 要是被同行或者不法分子拿到还是比较糟心的
那么问题来了, 怎么保护接口的安全呢?
这个也是我去年面试的时候被问到的问题, 当时只回答了几个, 以下办法虽然无法
完全
的阻止破解的行为, 但是可以提高被破解的成本
申明
以下的一些方法只适合于特定的客户端和服务端, 不能满足所有的需求, 使用的时候以实际需求为准, 不一定每个平台都可以做到这些
下面也是单讨论怎么从接口增加难度, 不涉及过多带复杂风控的
LV 1. 登录校验
接口数据需要校验登录状态
解法
带上登录所需要的 token
或者其他的 authorization
信息
升级版本
token 缩短 token 有效期, 需要隔一段时间调用另一个接口申请新的认证信息
LV 1. 使用 SSL 证书
这个不多BB, 没啥问题基操
解法
中间人证书就可以抓包
升级版本: 自签证书(SSL Pinning)
证书使用的是自签证书, 客户端内置的证书和服务器的是一对的, 需要对APP解包把证书找出来
升级版本-证书秘钥
证书带秘钥, 需要解代码找到对应的秘钥(遇到过塞到 so库里面的)
LV 1. 限制IP
把所有云厂商的 IP 段 Ban 了.
解法
用各种代理池
LV 2. 禁止走代理
就是APP请求的时候会忽略系统的代理参数, 不走代理
解法
- 虚拟机
Proxifier
等工具, 强制虚拟机走代理
- 实体手机
- 你需要自己电脑上面有一个
Wifi
设备 - 手机连上, 用
Wireshark
等工具监听网卡或者设置代理
- 你需要自己电脑上面有一个
- 可以使用 VPN 工具强制定向流量到抓包工具 (IOS例如
ShadowRocket
, 可以设置 socks5 和 http 代理)
LV 2. URL 签名 防止重放攻击
客户端和服务器用一对证书, 客户端对被请求的 URL 进行加密, 例如 <URL PATH>|<用户Token>|<时间戳>
加密, 比如
我要请求 /user/xxxxxxxxx
接口, 时间 1586271693549
加密出来是 U2FsdGVkX18lueRORkT7BTVsQF7d+59DayIQ4SMmjjRAbWiydRidF5O9ObjlG3uR
然后做 Base64 VTJGc2RHVmtYMThsdWVST1JrVDdCVFZzUUY3ZCs1OURheUlRNFNNbWpqUkFiV2l5ZFJpZEY1TzlPYmpsRzN1Ugo=
然后直接把需要请求的 Path 和 Query 部分替换为加密之后的 base64.
服务器在收到请求的时候可以吧这个 base64 之后的数据存储到缓存中, 如果在一定时间内重复就拒绝掉这个请求
解法
找到加密算法以及签名证书然后模拟
当然你也可以用对称加密意思意思, 把加密算法塞在 so 库里面, 再混淆
LV 2. 限流
针对固定接口或者全部接口以及IP, 限制固定时间内的请求频次
解法
多注册几个号, 延迟请求, 代理池
LV 2. 接口参数签名
客户端有一个生成请求签名的函数类似
sign = MD5(时间戳 + 请求的Path + 请求的参数(这个一般都会先排序再拼接))
服务器收到请求之后, 也会拿这些参数用同样的方式进行计算签名, 然后对比客户端提交的和时间, 如果不一样就拒绝请求(要注意请求的时间戳和服务器的时间戳相差时间不能太长).
这个签名函数可复杂可简单, 一般用的都是 MD5 + 固定盐.
解法
没啥特效药, 反编译看代码吧
升级版本
把算法高级混淆, 或者写到 so 库里面
升级版本2
多个签名算法, 比如根据请求值的MD5最后一位, 来调用不同的签名算法计算, 不过太多也没啥实质作用, 体力活
LV 3. 验证码
包括但不限于, 图形, 拖动, 点击, 手机短信验证码, Google Authenticator 等, 超过一定的强求频次就弹出验证, 不然就拉黑账户一段时间
解法
各种打码接码平台, 或者自己写
LV 4. 更换通信协议
自己愿意造的话 可以吧 Http 换成 WebSocket 或者自己封装, grpc 国内还没见过有人用在接口上面的
LV5. 黑/灰 产黑名单
这个就比较牛逼一点, 从某些渠道购买的黑名单, 包括但不限于(手机号, IP, IMEI等), 禁止你使用这些数据进行注册, 请求, 也有的直接禁止了虚拟号
解法
找点小众的平台, 或者想办法找点真实的手机号
总结
有些接口会提供小程序, 或者其他特殊平台的接口, 很多在APP上面才能做的步骤在小程序这写地方是做不到的.
其实所有的办法都有对策, 就是看你的数据值不值得, 如果值的话办法总比困难多, 大部分的破解都是一些体力活, 只要有时间都能搞得出来
我一般是建议 自签证书 + API 参数签名就可以了, 除非你的数据真的太重要, 尽量选择多个方案一起
如果有其他的想法可以在评论区回复