程序员,请保护好你的 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和签名方法,我还只能爬接口扒数据,无奈作罢。

基本防护思路

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

  1. 确保不暴露用户密码手机号等本不需要展示的信息,使用Model $hidden或stub-api将相应数据白名单化。
  2. 做好一些无成本或低成本的防护,如接口签名或接口加密(强烈推荐)。两种方式都是通过密钥难以逆向获得的方式实现接口保护。通过中间件和interrupt可以轻松实现签名或加解密。拦截像我这种不会逆向的人绰绰有余。
  3. 建立危险用户行为模型,在危险行为被识别出来后,增强验证级别。如在短信验证码频繁调取时强制要求补充验证图形验证码;或者用户提交一些非法参数时增加行为验证。
  4. 假定接口可以被破解,明确需要保护的敏感信息并加以合适的保护。如手机号可以用虚拟号直接拨打,既保护数据又保护用户隐私。

相关法律参考

法院裁定:多闪通过抖音擅自获得的微信昵称、头像被勒令停用

海淀法院裁定禁止刷宝App非法抓取抖音短视频及用户评论

结语

在现行的法律下,虽然可以维护权益,但往往因为案件价值和举证困难导致难以维权。而做好基本防护却可以拦截大部分非专业黑客,攻防的博弈背后是技术水平比拼和成本回报的衡量。祝大家能够保护好自己的API免受不正当竞争。

php
本作品采用《CC 协议》,转载必须注明作者和本文链接
为码农摸鱼事业而奋斗
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 9
阿麦

老哥猛 支持一波 话说 PYTHON 是不是最好的选择了

4年前 评论
直面苦痛的人生

很多公司跟个人都没有这些意识的,只是为了完成工作而工作,老板也不愿意去请一些防范方面的专家,所以要攻破很多小门户很容易的

4年前 评论

@GhostCoder 你说的python最好选择是指什么的最好选择,如果说爬虫我觉得不是工业级爬虫用啥写都没区别,还得看数据处理哪一种更方便。工业级爬虫没搞过,如果你对爬虫感兴趣,建议你问下专业人士。

4年前 评论

小程序可以反编译出来的,而且很简单,之前反编译过好几个小程序了,里面的签名算法跟key都在小程序中

4年前 评论

@zhangya4548 请问有相关博客吗,想学习一下

4年前 评论
zhangya4548 4年前
sanders 4年前

用python爬了微信,小程序,各大招聘网站,表示想防爬虫不简单。api是最简单抓取的,对一个用selenium和appium的人来说,大部分网站和app都是可以爬的。。

4年前 评论
Kamicloud (楼主) 4年前
sanders

封IP算是比较狠的招数了,弄不好,杀敌一千自损八百,网易云音乐就是这么干的,但也会做一些小策略:登录接口不会封住,但会在登录时多一项拼图验证,验证通过后解封。

4年前 评论
polariao 4年前

@随风飘流的男人 因为对很多小公司,老板不懂这些,而如果技术负责人对工作的看法只是多挣钱少干事,也不会做这些防护,白白增加自己的工作量,对老板来说还看不到效果。

4年前 评论
直面苦痛的人生 4年前
LOST

想完全屏蔽爬虫,难度还是很大的。目前很多反爬措施都是为了增加爬虫的实现难度。然而作为一名码农,我还从来没考虑过反爬这回事儿,这还是挺令人悲伤的。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!