前后端分离的项目如何防止 api 被第三方利用

2019-02-14 10:53:19 +08:00
 imherer
假如 api 是不需要任何鉴权,就像 v 站的 api 一样,第三方可以利用 api 去做一些小程序或者内容展示的网站

我不想让第三方利用我的 api,但是又不能做鉴权

这个好像是不能杜绝的吧,只能从利用 api 的难度方面入手?
13734 次点击
所在节点    程序员
88 条回复
t2doo
2019-02-14 17:28:00 +08:00
重要字段插入时加个密,取出显示时解个密,这样搞可操作嘛?
lpreterite
2019-02-14 17:58:02 +08:00
APP 用的话肯定能加鉴权啊,jwt 和 oauth2 肯定能帮到你。
hheedat
2019-02-14 18:04:42 +08:00
这和前后端分离没关系,只是接口比页面用起来方便
justfly
2019-02-14 18:13:23 +08:00
防爬虫的策略都可以用,想要更加高效的不可能,这本质就是个防爬虫问题。
coolcoffee
2019-02-14 18:30:15 +08:00
写爬虫不怕限制游客的单 IP 次数,大不了就花钱买动态 ip 可以绕过。

但是强制要求登录之后有频率限制, 频率过快以及注册都有 Google Recaptcha 就歇菜了。
index90
2019-02-14 18:37:57 +08:00
要完全无侵入的话,上 ServiceMesh,由 SideCar 挟持流量并负责接口的鉴权问题
opengps
2019-02-14 18:53:39 +08:00
首先一楼说的 reffer 足够过滤很多了,其次可以定期该返回规则,这样第三方总有一点会失去耐性不再跟着改代码
yankebupt
2019-02-14 22:11:04 +08:00
@imherer 随便想到的一个
未授权第三方最怕的是什么?是版本更新.....抓到的 API 全部重改....

最简单就一次做 255 个前后端微改动配套版本,js+后端每天换一个...
小程序要想全部抓全概率远低于 1/255....

当然我觉得还是不要把事情做绝好了...只要对你流量影响不大,可以抓抓第三方的调用记录看看他们到底想干什么的...
Narcissu5
2019-02-14 23:44:59 +08:00
我感觉 webdriver 还没什么搞不下来的网站。

单纯保护 API 的话前端混淆一下也就差不多了,js 的脚本语言特性肯定可以被逆向的,但是成本还是比较高的。而且一旦 API 又改动就思密达,这其实就是种赛跑
KomeijiSatori
2019-02-15 00:01:42 +08:00
@DavidNineRoc 其实小程序可以 dump 源码的(
johnnie502
2019-02-15 02:27:18 +08:00
楼主在 6 楼说是从浏览器过来的,后面又说客户端,到底是浏览器还是客户端。浏览器的话就很简单了,CORS,referral
DavidNineRoc
2019-02-15 09:34:48 +08:00
@KomeijiSatori 具体如何做,应该不太可能?
imherer
2019-02-15 09:39:52 +08:00
@yankebupt 这种定期更换 API 的方法,如何做成自动的呢?
最好是在不重新发布版本的前提下完成? 有什么思路吗?
stephenliubp
2019-02-15 09:47:26 +08:00
BFF 中间层,用 Node 或者 PHP 写一层,渲染出页面,用户看到后看似传统的前后端未分离的效果一样。
ugu
2019-02-15 09:51:30 +08:00
@ttvast 这个不行哦
ralaro
2019-02-15 10:01:03 +08:00
@DavidNineRoc 小程序也可以反编译拿到源代码的
locoz
2019-02-15 11:21:28 +08:00
这个问题本质上来讲其实就是一个反爬虫问题,从一个爬虫工程师的角度来看,这个问题是无解的。你只能做到尽可能地提高第三方调用你 api 的难度,但不可能完全防止住,因为再强的反爬也会被破解掉,无非就是成本问题而已。
提升调用难度之后如果第三方调用了你的 api 后所得到的收益低于调用的成本,那基本就会放弃去搞了,这是最直接的办法。
shapl
2019-02-15 11:36:03 +08:00
防火墙,请求次数 1 分钟达到 30 次之类的,拉黑 60 分钟。
unco020511
2019-02-15 12:27:19 +08:00
请问你是 12306 的研发吗
yankebupt
2019-02-15 13:41:13 +08:00
@imherer 其实我觉得都没必要那么过分...写个脚本改改调用名称,参数顺序甚至改改调用名后缀就够了...
根据用户浏览器指纹 /ip 段随机指定一个版本给他,最大限度保证每个普通用户“历史记录”页面完整性,如果发现滥用就把所有这个指纹的访问切到高危访问去,一小时或一个 session 换几次版本,浏览器没历史记录可查也活该就是了...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/534809

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX