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

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

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

8086 次点击
所在节点    程序员
85 条回复
jadelike
2023-10-11 14:52:53 +08:00
@haython 笑,‘我拿到了小程序源码,你一个 jwt 能阻挡我模拟你的请求吗’。你就是在防重放攻击。哪有人通过 http 请求能拿到源码的。
mxT52CRuqR6o5
2023-10-11 14:53:47 +08:00
微信小程序的能力不足,像 app 的那些激励广告 sdk ,是提供服务端校验的,保证不会被偷奖励
haython
2023-10-11 14:54:57 +08:00
@d873139022 这个前提是 wx.login 返回的 code 没被破解,我是看到有人发过,不需要打开小程序就可以获取这个 code ,并且可以在服务端正常使用
jadelike
2023-10-11 15:01:52 +08:00
@jiayouzl 谢谢认可
6397like
2023-10-11 15:09:36 +08:00
是否可以拿小程序本身的一些信息比如小程序 api 获取到的 appid 作为请求的一个加密参数,服务端再解密校验下?
jadelike
2023-10-11 15:12:13 +08:00
前端的东西,肯定会被人拿到加密算法。你加密解密不能在后端做么,前端调用接口嘛。我个人和楼上另一位持不同意见,我认为是防止重放攻击
lizuoqiang
2023-10-11 15:17:14 +08:00
banlink
2023-10-11 15:18:49 +08:00
一、云函数
直接把领取奖励的接口放云函数上就行了

二、wx.login
激励视频播放的时候调用一次,把用户信息,code 传到后台验证 同时返回一个临时 token ,
领取奖励的时候再调 wx.login 验证 code,token

缺点:wx.login 接口有限额,网上好像有可以拿到 code 的方法

三、wx.getUserCryptoManager
文档原话:
“为了避免小程序与开发者后台通信时数据被截取和篡改,微信侧维护了一个用户维度的可靠 key ,用于小程序和后台通信时进行加密和签名。
开发者可以分别通过小程序前端和微信后台提供的接口,获取用户的加密 key 。”
微信维护的 key 应该足够安全,不过 wx.login 能破解的这个原理也差不多,网上关于破解的信息还没看到


这 3 个方法都可以解决你的问题,都是依赖微信,有能力破解微信来搞你的说明你们价值很大。
mxT52CRuqR6o5
2023-10-11 15:26:19 +08:00
我觉得最根本的方法就是不要在微信小程序的广告激励提供价值太高成本太高的奖励,因为没法完美地去校验,你提供的奖励价值够高,就会有黑灰产过来嫖你
什么 jwt 、grpc 、wasm 、混淆,无非都是成本的问题,你提供的奖励价值够高,自然会有人克服这些障碍来嫖你了
d873139022
2023-10-11 15:30:56 +08:00
@haython 没有绝对意义上的不被破解,能破解 wx.login 这个的只有少少数。微信 hook 取小程序 code 的,它都把微信搞定了,你觉得你的技术有微信高吗。。
再说个,演唱会抢票软件,逆向大佬也都解决了,你觉得你的防破解能比得上淘系 app 防破解的技术吗。你只需要防住大部分人,增加小部分人的破解门槛就行了,而不是在纠结绝对防破解
datehoer
2023-10-11 15:40:19 +08:00
结论:防不住,花钱加密比较合适。
现在都可以给小程序注入开发者工具了,根本不需要将小程序反编译。
mxT52CRuqR6o5
2023-10-11 15:43:10 +08:00
@d873139022 #70
当然没有绝对意义上的不被破解,即使是有服务端验证的激励奖励;但有没有服务端验证,风险承受方就不一样了
像一些广告平台的 app sdk 有服务端验证的激励,如果恶意用户像白嫖奖励,风险承受方是广告平台/广告投放商,广告平台由于体量大,可以做一些法律层面的保护;而且作为平台,做技术上的防护是更高效的
像小程序这种没有服务端验证的激励,风险承受方就是广告接入方了,想好做保护的话,每个接入方就得各自做保护,非常低效,小体量的开发者也很难寻求法律保护
haython
2023-10-11 15:43:46 +08:00
@jadelike 建议你看看别人的回复,真的不是防止重放攻击
jaylee4869
2023-10-11 15:44:21 +08:00
SSL Pinning
c2const
2023-10-11 16:12:32 +08:00
1.用户端的代码都会被逆向和反混淆,模拟点击广告,或者软件都不开,直接模拟网络请求;甚至跳过直接领奖励,你也没有太好的没办法,只能见招拆招,毕竟软件和硬件都在用户的手上 :(

2.关键还是服务器做检测,广告开始和结束时都要调 api ,时间间隔对不上,或者领取奖励频率明显异常的就自动永久封了呗,能做的检测还有很多,甚至你故意挖坑也行 :)

3.用户端、网络接口这块,人机验证、混淆、加密都只是提高攻击的成本而已,挡住一批菜鸟 :(

4.至于对高手,人家目的只是伪装自己是正常用户,白嫖奖励,并不是攻击你服务器;所以你没有太好办法,你能做的是提高用户端/网络接口的更新频率,让破解者和你一起多花时间,找到一个作弊者就永久封了,不停的对抗,对方肯定在你之后更新,所以会不断有账号在你的黑名单上 :(

5.微信小程序的用户认证我不了解,但你需要一个用户的唯一标识,不管是微信提供的 code 还是用户手机号之类的,用来在服务器上永久封号 :)
-----------
这只是传统对抗,现代对抗还得考虑 AI 自动化 :(
haython
2023-10-11 16:18:37 +08:00
@c2const 你提到一个更新频率,这个是得考虑,只要我更新的够快,就没人能破解😂
c2const
2023-10-11 16:25:00 +08:00
@haython

1.传统对抗就是这样,公司下班前发布新版本,作弊者当天加班加点逆向,当天凌晨就出最新版破解 :(
2.主要是你你这账号不收费,攻击成本太低了,像 steam 游戏之类的,如果作弊者不熟悉反作弊框架,那第一次基本得牺牲 5 个账号,才能破解;后续每次更新都会牺牲账号,以此来提高攻击成本 :(
haython
2023-10-11 16:29:57 +08:00
@c2const 对,还可以增加手机号和身份证绑定来提高对方成本
duck200
2023-10-11 17:11:42 +08:00
直接云开发吧,阿里或者微信云函数都挺便宜,OP 如果服务端都写好了,就写一个代理转发请求的云函数吧,我目前有一个自己的产品就是这样做的,就是体感请求时间稍微长了点
nozer
2023-10-11 19:11:53 +08:00
我记得小程序有个 formid ,是微信给生成的,你接口要一个这个 formid 然后验证他的有效性。

我以前试图 crack 过一个小程序,然后遇到这个问题,没解决,放弃了。

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

https://yangjunhui.monster/t/980603

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

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

© 2021 V2EX