服务端
HTTP 请求中的来源识别
数据加密
采用https协议,保障数据传输过程中的安全
数据签名
将要提交的数据,通过某种方式组合成一个字符串,然后通过 MD5 算法生成一个签名。如果觉得单纯的 MD5 不够安全的话,还可以在 MD5 的时候加盐和加 hash 。
时间戳
在参数中加上当前请求的时间戳,服务端拿到这个请求后会拿当前的时间和请求中的时间做比较,比如在 5 分钟之内的才会流转到后面的业务处理,在 5 分钟以外的直接返回错误码。时间戳机制主要用来应对攻击者直接拿包进行非法的 DDOS 攻击。
AppID/Token
服务端为了验证合法的调用用户,可以添加一个 AppID,或者给登录用户设置token。
参数整体加密
采用对称加密或者公开密钥算法对请求做一次整体加密,防止在浏览器的 network 中进行抓包。具体做法为:
- 前端生成随机数作为签名key,用于对请求数据进行对称加密
- 前端使用RSA的公钥对key进行加密
- 将公钥作为头传递给服务器
限流
服务端针对接口进行限流,限流的算法常见的有这么几种:令牌桶限流、漏桶限流、计数器限流。
黑名单
客户端
压缩
代码压缩,去除 JavaScript 代码中不必要的空格、换行等内容,把一些可能公用的代码进行处理实现共享,最后输出的结果都压缩为一行或者几行内容,降低代码可读性。
混淆
JavaScript 混淆器大致有两种:通过正则替换实现的混淆器、通过语法树替换实现的混淆器。
加密
将一些核心逻辑使用诸如 C/C++ 语言来编写,并通过 JavaScript 调用执行,从而起到二进制级别的防护作用。其加密的方式现在有 Emscripten 和 WebAssembly 等。