1
mooczz 2017-11-10 13:08:17 +08:00 via iPhone
如果是面向 app 的话,客户端对参数签名,服务端校验
|
2
fashy 2017-11-10 13:09:41 +08:00
对内的接口,ip 白名单;对外的接口权限、流量控制
|
4
582033 2017-11-10 13:23:04 +08:00
oauth2
|
5
springmarker 2017-11-10 13:29:11 +08:00
用户量小且没有用户校验的话,直接 ip ban 掉,简单粗暴
|
7
panpanpan OP @springmarker 想象成一个注册就能用的 APP,黑名单肯定 ban 不完所有代理啊
|
8
cloverstd 2017-11-10 13:41:06 +08:00 1
|
9
odirus 2017-11-10 13:46:59 +08:00
如果是还没上线,那好办,接口里面一定要通过某种方式传递一些设备信息(例如 IMEI 等)来识别身份;并且要保留验证码机制,根据该设备的请求情况决定是否在关键步骤中开启验证码模式。
如果是已经上线,但只能取到 IP,那可以根据 IP 维度对用户的请求进行监控,例如连续多次访问敏感接口(发送验证码之类的)则可以考虑对这个 IP 进行降权处理,访问某些接口的时候被 ban 掉。 ------------------------------------------------------------------------------ 上面可能需要利用到的技术就是复杂验证码、Nginx 动态编程。Nginx 动态编程可以考虑 OpenResty |
10
honeycomb 2017-11-10 13:47:24 +08:00
@panpanpan
如果是 Android 的海外业务,play 渠道的可以考虑 safetyNet Attestation API General 的则可以考虑类似反爬虫的策略(简单些的类似 geektest 的 captcha ),毒性越高限制越多。 app 可以拉 app 包的签名(基本都在用,比如 xx 地图的公开 API) |
12
xomix 2017-11-10 13:54:08 +08:00 3
app 用内部封一个 key+用户密码组合成新的 key 的方法验证,发现内部 key 有恶意访问,就下发新 key 给 app 并且淘汰旧的 key。这样 app 这边就能做到可控。
注册这块增加注册成本,国内最简单的方案就是绑个手机号。国外没研究过但是绑个 google 市场 id 应该也是不错的选择。 公司等第三方大规模调用也是一样,两套 key,发现恶意通知对方换 key,发现多次恶意通知对方整改。 制度上解决比较靠谱,技术上别说自动化,你就是雇佣上几个维护人员 7*24 的根据监控数据调整接口访问,也不一定能解决别人上爬虫。 |
13
odirus 2017-11-10 13:54:19 +08:00
@honeycomb
没什么大惊小怪的,其他方案也有的是 如果只有存储权限,也可以不用 IMEI 的,只要能确定用户身份即可,之前我们做法是在应用存储区域写一个随机字符串文件,如果存在则在请求的时候发送这个;如果不存在,则生成后再携带发送。 ---------------------------------------------------------------------------------------------- 不过既然人家都能破解了,,肯定直接替换接口里面的参数,这个时候就可以根据请求请求对 IP 和 deviceID 进行评分,低于某个评分的情况就直接 ban 掉。 |
14
panpanpan OP @odirus 这种思路跟要求登录然后通过用户信息来识别有些类似,通过大量的日志分析确实可以识别到一些异常用户,可以 ban 掉那些大量请求的,但是从原理上面来说这些信息依然是可以伪造的,所以。。。
|
16
gouchaoer 2017-11-10 14:09:07 +08:00 via Android
api 限制速率
|
17
odirus 2017-11-10 14:12:46 +08:00 1
@panpanpan
一定要根据自身 APP 的特点哈,我做了一些规则来对设备进行分数评价(这些规则只要不泄露,写爬虫的人肯定不知道),例如: 1 )调用注册之前一定会调用拉取过首页广告的接口 2 )一个 IP + deviceId 只会在 60s 内至多调用一次验证码发送接口 3 )以及更多的特定应用规则 基本原理就是说系统会根据设备的访问历史记录,对请求进行动态评分,并且在 Nginx 这一层 "恶搞" 分数特别低的一些爬虫,甚至是 ban 掉。 如果有哪些 IP + deviceId 违反了上面的规则,我就会对这台设备进行扣分,当分数低于某个阈值的时候,会通过 OpenResty 直接返回相应的错误,而不是转发到后端程序。 |
18
gouchaoer 2017-11-10 14:13:14 +08:00 via Android
|
19
panpanpan OP |
21
picone 2017-11-10 14:50:27 +08:00
App 或者网页都可以做一些用户行为手机分析,很多软件都干这事。
比如我要注册,那肯定要点击输入框,然后 balabalabala 账号,balabala 密码,然后点击注册,这里屏幕触摸很多,网页的话还能进行捕捉键盘,所有用户输入都能捕捉到,然后收集压缩加密发给服务器进行分析,就知道是真人还是假的人了。理论上还是可以破解,但是破解成本挺大的 |
22
sculley 2017-11-10 17:57:17 +08:00
HTTPS ?
|
24
honeycomb 2017-11-10 19:55:29 +08:00
@odirus
“在应用存储区域写一个随机字符串文件,如果存在则在请求的时候发送这个;如果不存在,则生成后再携带发送。 ” 这样用 UUID/InstanceID 的做法比较能接受,但是如果要获取设备持久不可更改的识别码,一般来说,除去少量服务外是不能接受的。应用只能在一次安装到卸载为止的生命周期中识别特定设备。 “如果有哪些 IP + deviceId 违反了上面的规则,我就会对这台设备进行扣分” 挺好的做法 |
25
flynaj 2017-11-10 20:05:08 +08:00 via Android
跟百度的 API 一样免费的有次数限制
|
26
leopku 2017-11-10 20:49:54 +08:00
HMAC 算法
|
27
wellCh4n 2017-11-11 15:24:46 +08:00
阿里的 API 网关好像是后端加密之后放进 header 里面做一个转发。
|