微信小程序,有什么办法可以防止别人破解我的接口?

2023-10-10 13:56:32 +08:00
 haython

目前有 2 种想法,一种是每次请求弄个加密的签名,不过我记得好像是可以拿到小程序的源码,前端的东西,肯定会被人拿到加密算法;第二种是小程序云开发,走微信自己的协议,转发一下请求,这种就是太麻烦,绕一圈,求教各位大佬还有别的招术吗?

7158 次点击
所在节点    程序员
85 条回复
XiLingHost
2023-10-11 12:44:02 +08:00
如果是处理看广告拿奖励,那直接服务端验证时间戳呗,和广告来源的下载时间做核对,如果请求有异常就直接 ban 这个微信 id 一段时间
nong99
2023-10-11 12:54:18 +08:00
@haython 每个请求都加上小程序 appID ,接口层面白名单仅允许你自己的小程序访问,可行吗?
pennai
2023-10-11 13:21:15 +08:00
搜零知识证明验证身份看看
v2nika
2023-10-11 13:22:13 +08:00
你附加里面的其实是两个问题: 一个是如何避免前端伪造证明自己看过广告领奖的接口调用, 另一个是如何证明广告是真被看过的.

前面一个其实不难, 滑块验证码这类的技术方案很成熟. 但是后面一个不太常见, 类似于要自己实现一个滑块验证码. 主要是要把看广告的过程转化为特征值供校验. 我感觉业界应该是有解决方案的, 比如那些在线视频学习网站, 要求必须看完整个视频才能完成课时.

有个解决方案是: 基于隐藏式的滑块验证码技术收集前端特征, 保证前端环境是可信的, 然后视频每看一秒, 就对看过的内容进行一次签名, 得到两个签名一起提交的服务器. 服务器做校验.
Huelse
2023-10-11 13:30:53 +08:00
最简单的还是通过广告 id 校验播放开始与结束时间的唯一性。加速、重复看同一广告等问题都能解决。
wzy44944
2023-10-11 13:38:44 +08:00
可以加一些风控措施,在领取奖励到兑现奖励之间加一个检查环节,检查奖励来源、用户近期调用频率,是否同 ip 之类的
encro
2023-10-11 13:43:57 +08:00
看你广告价值了,如果对方不是很特殊针对你,那么就简单客户端解决,前端 JS 通过看过这个特征处理:比如看的时长,从什么时间开始看看,从哪来的,手机倾斜角度等,这些数据上报上来,然后分析特征,将不符合要求的的屏蔽。对方拿了你的 wasm ,不分析源码,那么没法伪造行为数据,会被发现特征。

用户自我证明,比如移动滑块验证,观看内容考核。

这些搞起来,都会比做加密通信要麻烦。。。
ch2
2023-10-11 13:48:02 +08:00
最切实可用的就是走 wx 的协议,你自己搞 99%会先于 wx 被破解
aino
2023-10-11 13:51:26 +08:00
预防的场景是这样,小程序有些功能是需要看广告才能领取的奖励,但是小程序的源码被人下载到了,直接绕过了看广告,直接调用了领取奖励接口,怎么能确保领取奖励接口一定是在我的小程序里调用的?
------------------------------------------------------------------------------------------------------------------------------------------------
既然如此服务端检验看完广告才能领取奖励不就得了,防护做的再多,只是增加难度而已,不如回归本源,你这就是一个很明显的越权漏洞啊。。
nothingistrue
2023-10-11 13:59:14 +08:00
楼主这并不是防止接口被非授权用户访问,而是防止接口被授权用户自行调整访问顺序。可以洗洗睡了。给说几个跟楼主类似的场景,大家就知道这预防难度了:
一、跳过优酷视频开头广告。
二、客户端网游用外挂,甚至脱机外挂,刷经验金币。

尤其注意第二个场景,网游客户端这可是闭源且不可反编译的,应用层网络通信协议也大抵是私有的,这样并不防止被破解特定场景。
3825995121
2023-10-11 14:12:13 +08:00
并不能完全防止 只能增加破解难度

我每个请求都用 请求参数+请求数据+时间戳 +salt 生成一个散列值 做 sign 然后请求加上刚才的时间戳

服务端 拿到之后判断时间戳是否大于 1 分钟 然后 请求参数+请求数据+时间戳 +salt 生成一个散列值 和 sign 对比

salt 值可以在小程序端混淆一下 小程序打的包也可以混淆
增加破解难度
bruce0
2023-10-11 14:12:24 +08:00
@summerLast 有了 chatGPT, 混淆基本没用了, chatGPT 能直接给还原了, 还附带注释😂
xFrye
2023-10-11 14:16:01 +08:00
激励视频一般会有服务端回调的 api ,小程序广告有没有这个 api 就不知道了。激励视频的奖励如果想要严格,肯定是要服务端验证的
haython
2023-10-11 14:19:23 +08:00
@XiLingHost 微信的广告,我应该是没办法获取每次广告的时长的
haython
2023-10-11 14:21:08 +08:00
@nong99 不可行,因为 appID 也是一个普通参数,也是前端发起的请求
haython
2023-10-11 14:28:10 +08:00
@3825995121 你说的这个,就是我说的请求添加签名,前端代码被拿到的情况下,没有用啊
haython
2023-10-11 14:32:59 +08:00
@xFrye 微信的激励视频没看到服务端回调 api
xuxu5112
2023-10-11 14:43:27 +08:00
奖励是发送到账户的吗?统计下每个账户获得奖励的次数和间隔,间隔过小的(比如小于 10s )、频次过高的就可能是程序刷的。把异常用户 block 。
d873139022
2023-10-11 14:44:35 +08:00
用 wx.login 获取登录凭证的 code ,然后每个接口都加上这玩意,这是一次性的。基本上就可以阻止了。
haython
2023-10-11 14:49:00 +08:00
@xuxu5112 不过这属于事后补救了,算是提高对方成本

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

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

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

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

© 2021 V2EX