限制单用户单位时间内最大请求频次
(如每日最多请求50次内容页){仅稍微增加了采集难度,延缓被脱库时间}
对于请求频率异常的设备,封禁若干长时间(如10分钟)
技术方案参考:
- App在请求接口时,带上设备惟一编号、当前版本号
- 请求异常时,将设备惟一编号列入黑名单。
- 设备惟一编号。可以使用友盟统计的 Device Token。<Tips:惟一编号方案不要与苹果的隐私规范冲突>(注意:Android可以通过清空应用数据重置该惟一编号,iOS可通过卸载后重装重置该编号)
加密数据输,请求及响应双向加密。
至少要包括:接口名,参数名,参数值。可以考虑如下加密方案:
- 使用AES加密算法,AES密文是二进制的,最好再做一次BASE64编码。
- 通过接口分发密钥,密钥本身也是加密传递,真实密钥需要是经过事先约定的算法计算得到。
- 不要通过单独的接口分发密钥,而是放在其他接口中,可以放在最低允许的版本号的接口中。响应数据中,增加适量无意义的干扰信息,增加猜解难度。
- 密钥定期修改,在服务器端更改,App启动时加密分发给App。
- 在做协议分析时很容易猜解接口名,因此接口名可以采用另外的密钥加密,与数据传输密钥不同。可以是硬编码到App内部的固定密钥。
- 参数名、参数值放在一起加密,即通过GET请求字符串整体加密。
- 服务器端响应数据,也是加密后base64编码后返回密文。
- 固定密钥不要直接出现在App的字符串资源中。
一个接口格式参考
也可以将接口地址格式改成这个形式:
host.domain.ext/interface?model=news&action=list&class=123 host.domain.ext/interface?model=news&action=detail&class=9876
将get参数加密传输后格式示例(下面只是简单的base64,没做加密)
host.domain.ext/interface?bW9kZWw9bmV3cyZhY3Rpb249bGlzdCZjbGFzcz0xMjM host.domain.ext/interface?bW9kZWw9bmV3cyZhY3Rpb249ZGV0YWlsJmNsYXNzPTk4NzY
甚至把interface一段也重写隐藏掉,形式如
host.domain.ext/bW9kZWw9bm3cyZhY3Rpb249bGlzdCZjbGFzcz0xMjM
对于POST请求,将post包与做类似的加密封装
其它杂项
一个接口:最低允许的版本号。作用:App启动时,检查版本号,如果App版本号过低,强制用户更新。(类似网络游戏启动时检查版本补丁的方式)
如果有在线接口文档,其地址(目录命名、目录层级等)要有一定复杂度,避免被猜到。最好是授权查阅(口令、账号、IP段等)
0 条评论。