程序员,请保护好你的 API!

最近由于一些原因,被要求爬取了十几个行业平台的数据,从用户信息到发布订单信息,从网站到小程序及 APP。这些平台有些一点反爬意识也没有,可以随随便便从接口拉取数据,有些反爬形同虚设,还有些网站反爬做得很完善。


自己辛辛苦苦写好的程序,逐渐发展了一些用户,结果上升期被不正当竞争者趁虚而入,这是既无奈又可悲的。虽然笔者在扮演 “进攻者” 的角色,在这个过程中也积累了些经验,关于爬取的部分前不久写了一点基础教程;这篇文章则正好相反,记录下别人的反爬策略,讲一讲基本的反爬和防护,希望大家能保护好自己的接口,免受不正当竞争者的攻击。


被爬的案例和原因

平台一:百姓网

百姓网作为老牌的信息发布平台,有很大的用户基数和信息发布量,业务从网站到 APP,覆盖的范围很广。正因为它有网页端,爬取数据变得极为简单。爬取的目标是在某些板块发布的发布人信息,重点是手机号。

在简单分析页面后,抓了 Cookie,轻松地抓去了页面数据,因为要处理页面的 dom,选择用 node 写爬虫,cheerio 解析数据后存到 mongo 里。

虽然百姓网对于爬虫几乎不设防,但对 ddos 还是有所防范的。当爬虫连续访问时很容易触发安全防护,所有请求被强制重定向到验证页面,完成九宫格验证才允许继续访问。这个问题在合理调整爬取速度后很少发生,这道防护算是没有起到任何用处。


平台二:某行业权威小程序(JZG)- 斗智斗勇成功爬取一段时间后被斩断爬取机会

这个小程序平台是由行业内有影响力的人发起的,上边发布的信息几乎都是第一手的。平台的操作流程是这样的:可以任意查看信息,但是发布联系人的手机号是隐藏的,如果想查看必须要消耗积分。积分可以通过分享获得,但是没有提供购买积分的入口。


在分析了数据后基本确定可以做,这个时候积分还是可以通过分享无限次获取的,但估计会很快被封掉,因为在研究的时候发现这个平台经常因为更新版本十几分钟不可用(保守讲,可能实际时间更长),说明还是有人在维护的,后端是 java 写的,因为有次报错把堆栈漏出来了。因为是要实时同步发布信息,所以选择用 Guzzle 拿到数据以后调用以后的发布方法来直接存储。


这个平台还有一个防护机制,接口调用频率过高后会被屏蔽 IP,在调试开发时忘记挂的是自己的外网代理,被拉黑 IP,后换回公司网后又不小心被拉黑。最后为了能拉取数据,专门买了个动态 ip 的服务,当然也是为了线上可以稳定运行。具体的方法可以自行搜索 Guzzle 的文档,这里不多余讲了。


这样平稳运行一段时间后又不行了,把老板急的大半夜送了一部 iphone 过来(不要问我为啥一定要 iphone,以前写过)。虽然不情愿但是还得继续搞,扒接口发现接口地址变了,再查新接口发现接口参数变了,把所有都调对后试运行 —— 积分不足。原本无限次获取积分的分享接口已经被限死只生效一次。所有人积分被重置为 20,小程序还加了积分流水的展示页,大概是被察觉然后升级系统了。这个平台还没开放购买积分,最终 GG。


平台三四:JZYG / JZGRXXPT 等

前者是微擎二次开发的小程序平台,按理微擎是默认支持接口签名的,但是可能是开发者为了图方便没有用。查看信息需要积分,让老板买了几百积分,轻松搞定。


后者基本没有设防,数据也没有隐藏,相应的数据质量也一般,轻松搞定。


爬失败的平台

JGJ / YPW

这两个平台也算行业内发展较快的平台,既有小程序也有 app。他们没有爬成功都是因为接口做了签名,

如果逆向的话可以挖出来签名的 key 和签名方法,我还只能爬接口扒数据,无奈作罢。


基本防护思路

总结下几个爬成功的和没有爬成功的程序,给大家提供几个基本的防护思路。


确保不暴露用户密码手机号等本不需要展示的信息,使用 Model $hidden 或 stub-api 将相应数据白名单化。

做好一些无成本或低成本的防护,如接口签名或接口加密(强烈推荐)。两种方式都是通过密钥难以逆向获得的方式实现接口保护。通过中间件和 interrupt 可以轻松实现签名或加解密。拦截像我这种不会逆向的人绰绰有余。

建立危险用户行为模型,在危险行为被识别出来后,增强验证级别。如在短信验证码频繁调取时强制要求补充验证图形验证码;或者用户提交一些非法参数时增加行为验证。

假定接口可以被破解,明确需要保护的敏感信息并加以合适的保护。如手机号可以用虚拟号直接拨打,既保护数据又保护用户隐私。


————————————————

原文作者:Kamicloud

转自链接:https://learnku.com/articles/31027

版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。


有话要说