月月月子喵~

前后端分离如何保证后端接口的安全性

2020-04-08

前后端分离如何保证后端接口的安全性#

现在基本上大部分的 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 参数签名就可以了, 除非你的数据真的太重要, 尽量选择多个方案一起

如果有其他的想法可以在评论区回复

Tags:
笔记

除另有声明外,本博客文章均采用 知识共享(Creative Commons) 署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 进行许可。