接口防重放 是不是存粹的脱了裤子放屁?

2024-06-10 15:24:29 +08:00
 bigbigeggs

防重放解决的是攻击者拿到 url 和参数之后,不断地请求服务端。

  1. 服务端针对下单,支付,转账这种操作肯定有幂等,肯定不能胡来乱来

  2. 放重放生成一个 token ,这个 token 人人都知道如何生成的,比如 timestap+参数 用 md5 进行加密,攻击者也可以完全模拟这个 token 的生成规则,来绕过服务端

  3. 像 https ,客户端私钥加签服务端公验证,都是解决过程中的安全,放重放解决“客户端”的安全,感觉完全没必要,反而增加了成本

上周面试被问到,感觉存粹为了面试而面试,包括 sync ,lock ,多线程等,工作中根本用不到,完全不问业务上的问题,上来就啪啪的八股文走起。

为了面试由此写了一篇接口放重放的文章,欢迎大家指正,真感觉多次一举,为了面试而面试。

我真不相信,哪一家,真的在项目中写了防重放的实现逻辑。

13030 次点击
所在节点    Web Dev
94 条回复
dode
2024-06-11 16:01:16 +08:00
领优惠礼品,网速慢,连点了几下,领到了好几份话费
dode
2024-06-11 16:02:36 +08:00
接口幂等,岂不是在更高的层次上实现了接口防重放
ShuWei
2024-06-11 18:24:37 +08:00
op 还是太年轻了
jinxjhin
2024-06-11 18:37:18 +08:00
@iX8NEGGn #50 这些防重放手段只能用于防止中间人重放吧? https 为何还要防止中间人重放?
iX8NEGGn
2024-06-11 18:58:14 +08:00
@jinxjhin 我在 #47 也说了网络层防重放是 HTTP 时代的产物,至于为什么现在的大厂还在用,我也想知道,也有可能只是历史遗留做法而已。
MIUIOS
2024-06-11 20:25:06 +08:00
没接触过 = 没用
index90
2024-06-11 20:43:05 +08:00
1. 防重放和幂等是两码事,不要混为一谈。
2. 你在胡言乱语,你需要搞清楚票据和签名的概念。除非攻击者掌握私钥,否者即使知道算法也无法模拟真实用户请求。
3. https 也可以重放的,另外什么是“放重放解决“客户端”的安全”,又是胡言乱语。
bigbigeggs
2024-06-11 22:14:09 +08:00
@cnevil token=MD5(timestamp+参数)生成的,假设你的项目中使用了防重放,我难道不知道你的这个 token 的生成规则?普遍都是这样生成的,很容易就能猜到的
bigbigeggs
2024-06-11 22:15:50 +08:00
@yxzblue token=MD5(timestamp+参数)生成的,假设项目中使用了防重放,很容易就知道这个 token 的生成规则,所以这也是我比较诟病的一点,我想过通过加 salt 来解决,但是前端怎么安全保证这个 salt 呢?
bigbigeggs
2024-06-11 22:24:39 +08:00
1. 大部分人回复还是比较友好的,一部分人戾气比较重,没必要哈,大家都相互不认识,纯纯上网冲浪
2. 多线程的确不是八股文会用到,写差了。sync ,lock 谁在工作中用到?这不纯纯的八股文,要也是分布式锁
3. 防重放我理解评论有些人应该讲清楚了,应该为了防止中间人攻击。但防不住真实的用户拿到 url ,去循环请求。比如掘金的那个点赞(掘金那个感觉是查了一边数据库,然后返回重复点赞的)
4. 防重放的 token 生成规则,token=MD5(timestamp+参数)生成的,这个我感觉没用啊,人人都知道这个规则,我随便用 f12 就知道怎么生成的了
yxzblue
2024-06-11 22:58:37 +08:00
@bigbigeggs token=MD5(timestamp+参数)
已知 token: ff0ff58ff2b0901d47b8070ec0819812 ,timestamp: 1718117839 ,求解参数?
Nosub
2024-06-11 23:42:48 +08:00
op 主的问题是,自己有了结论,要别人认同你的结论,而大部分人不认同。

其实这个问题很好理解,你家里有一把门锁,大家都觉得锁的存在是有价值的,有用的,你觉得没用,你的道理是门锁是都可以撬开,撬不开也可以砸开,安装了也是摆设。

很多人应该会认同一个观点:安全只是相对的,无非是你要花多大的代价去做这件事,当代价,成本足够高的时候,你自然就放弃了,既然 op 觉得前端加密毫无意义,你可以试试去破解抖音的前端加密逻辑,是不是如你所说的按下 F12 就可以搞定。
LeeReamond
2024-06-12 00:33:47 +08:00
@zephyru 感觉除非搞前端加密,否则直接调到封装那里,我感觉所谓的成本也就是看五分钟代码的成本。。。至于前端加密,那更是神秘领域了。。
GeruzoniAnsasu
2024-06-12 04:09:02 +08:00
@bigbigeggs

1. 不要只考虑 CRUD ,多线程是软件架构中最最基础的特性之一,你只是目前没机会写到单机高性能非 HTTP 并发服务而已。
2. 重放是个应用层行为,TLS 传输层从抽象原理上就解决不了,就像地基稳不稳影响不了房子盖得丑不丑。拿 HTTPS 出来讲说明你没理解安全风险出在哪里。
3. 防重放不是在防中间人。是在防非法请求。 我合法用户自己把客户端的请求抓包下来,拿重放器短时高并发重放,有没有可能破坏业务系统的公平性或可靠性?我现在还是不是一个合法用户?
4. 为什么「放重放的 token 规则」 与 MD5(timestamp+参数) 等价? 生成唯一凭证仅有你说的这一种可能性吗?
5. 实现幂等性是不是要考虑防重放?




我怀疑你把防重放和防抖防重发混淆了
yc8332
2024-06-12 08:10:52 +08:00
redis 锁用 string ,get/set 能防住?这个水平到生产环境不会被搞死吗?
lyxxxh2
2024-06-12 09:45:33 +08:00
@bigbigeggs
多线程 sync lock 我真用到。
https://imgur.com/uftrwPY

sync,是说 async 吧, 基本都是 js,后端比较少。pip install asyncio

至于 lock,做接口幂需要啊。
https://learnku.com/docs/laravel/7.x/cache/7482#8a1c7c
再普遍点,db 锁不也是锁。

我用没问题,要是问八股文,我估计会 gg 。
yxd19
2024-06-12 09:52:31 +08:00
@x2420390517 虽然但是,密钥
lizhisty
2024-06-12 10:02:27 +08:00
你这认知太挫了,能防住 90%的普通人就行
restkhz
2024-06-12 10:39:26 +08:00
@bigbigeggs 其实我觉得你说的是很有趣的。不知道为什么现在人们戾气这么重。
这是很好的思考,这种质疑,是搞信息安全的素养。但是很明显基础知识不够。
然后结论说的比较武断了,防止重放是必要的。但是你说的这种方法的确不是好方法,你对它的质疑是正确的。
一般对抗重放都会引入随机和一次性。引入 Nonce 和速率限制可能是更有意义的做法。而不是用大家都知道的内容比如时间戳之类的 hash 得到 token 。
如果有 HTTPS 也不用特别担心中间人搞重放了。

话说你面试被问这个问题...你准备的这个答案可能就不好...
pkoukk
2024-06-12 10:54:29 +08:00
所有问题都是 成本-收益 的取舍问题
没有绝对的安全,我想入侵你的系统,可以找黑鬼杀手绑架你,你说你系统还安全么?
防重放措施虽然简陋,但手段也简单啊,成本也低啊,能防住同样简陋的人就行
提高别人搞事的成本就行
要不现在为什么这么多网站套一层 CF ?能彻底反爬么?能彻底防搞事么?
不能,但能大幅提高你搞事的成本就行了

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

https://ex.noerr.eu.org/t/1048255

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

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

© 2021 V2EX