



















这是一个创建于 734 天前的主题,其中的信息可能已经有所发展或是发生改变。
防重放解决的是攻击者拿到 url 和参数之后,不断地请求服务端。
服务端针对下单,支付,转账这种操作肯定有幂等,肯定不能胡来乱来
放重放生成一个 token ,这个 token 人人都知道如何生成的,比如 timestap+参数 用 md5 进行加密,攻击者也可以完全模拟这个 token 的生成规则,来绕过服务端
像 https ,客户端私钥加签服务端公验证,都是解决过程中的安全,放重放解决“客户端”的安全,感觉完全没必要,反而增加了成本
上周面试被问到,感觉存粹为了面试而面试,包括 sync ,lock ,多线程等,工作中根本用不到,完全不问业务上的问题,上来就啪啪的八股文走起。
为了面试由此写了一篇接口放重放的文章,欢迎大家指正,真感觉多次一举,为了面试而面试。
我真不相信,哪一家,真的在项目中写了防重放的实现逻辑。
1 yuhaofe 2024 年 6 月 10 日重点是看防谁、防什么吧,不就是你文章里说的增加攻击人的成本吗,看你想不想防比如我这种看到个接口就想调试下的脚本 boy😂,可能看到麻烦点就放弃了 |
2 zjp 2024 年 6 月 10 日 via Android云服务的接口都有防重放 |
3 porjac233 2024 年 6 月 10 日 via iPhone你出门好会锁门吗? 你知道开锁师傅开个锁仅需几分钟吗? 锁门是不是脱裤子放屁? |
4 kran 2024 年 6 月 10 日 via Android甚至不知道哪家会不防请求重放 |
5 whusnoopy 2024 年 6 月 10 日我司写了 一是出于本能的安全防御 |
6 MMM25O7lf09iR4ic 2024 年 6 月 10 日这是很常见的方案,你的最后一行疑问才是比较离谱的,没用过的话见也应该见过不少,特征为 timestamp+nonce 。 |
7 IvanLi127 2024 年 6 月 10 日不是拿不到 url 和参数的时候,把抓的包拿去重放吗?你开头是不是直接错了 |
8 forvvvv123 2024 年 6 月 10 日楼上正解,防止重放一般是考虑攻击者拿到了正常用户的流量,仿冒正常用户去请求的这种场景; |
9 cJ8SxGOWRH0LSelC 2024 年 6 月 10 日只要不是个人随便玩玩的项目, 接口防重放是必须做的, 参数加签都是标配的。 但凡对接过其他公司的 API 都不会有这样的疑问。 |
10 LeeReamond 2024 年 6 月 10 日说了半天感觉不对。我感觉问题可能是现在传输层都用 tls 保护了,是否还有必要实现业务防重放 |
11 ysc3839 2024 年 6 月 10 日 via Android按我个人理解,重放攻击属于中间人攻击,防重放攻击防不了客户端攻击,而 HTTPS 本身已经有防重放攻击的能力了,所以不需要自己特意去防重放攻击。你文章里提到的情况,实际不是重放攻击,而是“非官方客户端”,攻击者尝试绕过你的客户端逻辑,直接请求接口。 |
12 LeeReamond 2024 年 6 月 10 日还有一个问题是,例如 select 类操作,实现幂等很容易。新添加数据,加入幂等也不难。但是例如 A 给 B 转账这种操作能实现幂等吗? |
14 Aloento 2024 年 6 月 10 日安全不绝对 = 绝对不安全! |
15 wind1986 2024 年 6 月 10 日包括 sync ,lock ,多线程等,工作中根本用不到 |
17 106npo 2024 年 6 月 10 日是,大部分人要的不是防重放,而是 1. 防爬虫 2. 限频 |
18 akira 2024 年 6 月 10 日啊? 重放最主要不是要解决用户手抖的问题么。。其他的都是顺带的呀 |
20 N6R91zIxLm37099s 2024 年 6 月 10 日这种面试其实看的是你的下限,不是上限。 个人感觉八股文其实是软件发展的一个脉络,应该懂但是不要照本宣科 最后你的那句 `防重放用处不大` 是完全错误的,每个注入点都是血的教训我举个场景 验证码重放可以遍历用户弱口令,短信发送重放可以刷接口或者做短信轰 X 炸 |
21 binux 2024 年 6 月 10 日 via Android最近做了一个买票刷票软件,虽然它对请求加密了,但是就是因为没有防重放,连解密都省了 |
22 purrgil 2024 年 6 月 11 日不防重放的话,抓包,下载个 curl 然后复制 http 请求到.bat 里循环执行,就直接刷得飞起了。 |
23 weijancc 2024 年 6 月 11 日我之前爬过许多大网站的接口, 防重放可以说是基操了. |
24 macaodoll 2024 年 6 月 11 日 via Android一看就是没接触过电商抢购功能。 |
25 yxzblue 2024 年 6 月 11 日攻击者也可以完全模拟这个 token 的生成规则,来绕过服务端 攻击者怎么会知道服务端的生成规则? |
26 skuuhui 2024 年 6 月 11 日在移动端刚兴起的年代,大部分防重放是为了解决弱网环境下重试导致的无效请求的问题。现在技术成熟了,确实失去了百分之 99 情况下的用处了。现在还执着追求这个的,要么历史原因,要么过于迂腐了。对于大部分程序员来说,模仿很容易,动脑真的很难 |
27 crackidz 2024 年 6 月 11 日重放不是指 TCP 流重放,是指 HTTP 的接口重放,不在同一层。 |
28 dj721xHiAvbL11n0 2024 年 6 月 11 日你要不先看看你有多少错别字? |
29 darkengine 2024 年 6 月 11 日想得挺美,我是不会点那个链接 /狗头 |
30 InkStone 2024 年 6 月 11 日1. 防重放的 nonce 可以服务端生成下发。 |
31 wqhui 2024 年 6 月 11 日https 保证的是传输过程安全,但你怎么保证发起请求的人是可信的 多线程之类的不算八股文,日常偶尔就用,除非问你底层 JVM 怎么实现 sync 跟 lock ,19 年的账号居然没用过多线程。。 |
32 geligaoli 2024 年 6 月 11 日接口的重放攻击,基本是必然遇到的。做过的项目,只要用户量一大,无论是否公开,必然在日志里面会记录到重放攻击。处理实际也好办,幂等或 hash 过滤。 |
33 FawkesV 2024 年 6 月 11 日sync ,lock ,多线程 这不是很常用的吗?? |
34 dhb233 2024 年 6 月 11 日一个很现实的问题,支付接口是幂等的,QPS 能支持多大?防重放能支持多大 QPS ? |
35 jqknono 2024 年 6 月 11 日认清自己 |
36 cnevil 2024 年 6 月 11 日"放重放生成一个 token ,这个 token 人人都知道如何生成的,比如 timestap+参数 用 md5 进行加密,攻击者也可以完全模拟这个 token 的生成规则,来绕过服务端" |
37 blankmiss 2024 年 6 月 11 日包括 sync ,lock ,多线程等,工作中根本用不到 , 你们是什么公司 还是说你菜的一匹 |
39 salmon5 2024 年 6 月 11 日你以为客户端 HTTPS 安全,客户端的浏览器可不老实。 |
40 lurenjiauser 2024 年 6 月 11 日接口上 timestamp + nonce ,nonce 在 now + timer 时间范围内缓存,非常简单基础的方案,自己把问题想岔了吧? |
41 hallDrawnel 2024 年 6 月 11 日你甚至已经分析到了掘金的点赞防重复逻辑,在进一步想放重放逻辑不是千篇一律的啊。我们所有有重放可能的接口都有防重放逻辑。 |
42 Cruzz 2024 年 6 月 11 日其实这些我一直有个疑问,不管用什么方式去做,都不能影响正常用户请求吧。比如 timestamp 过期了,正常的用户是给续期么?那么做攻击的人不是也可以续期。 |
43 lovelylain 2024 年 6 月 11 日防重放 token 可能是上一步接口后台生成返回,上一步接口可能是验证用户登录态是用户行为触发,登录态和 token 都有时效性。 |
44 sampeng 2024 年 6 月 11 日这个问题嘛。。。怎么说呢。只能说,你经验太少。所以觉得很无所谓。 我作为运维,要是谁的接口涉及到钱的不做防重放。我直接就贴脸放大了。是是是。你懒得做,然后我一看账单短信被刷几十万,被骂的人是我。研发来一句脱裤子放屁试试。。 这是主问题。次问题。。是是是,你用不到就是八股文。 那我是不是可以建一个画像: 1.crud Boy 你一句不信,我默默看着我司代码库里面这都是啥?我们组十年前的项目不带防重放,技术评审都过不去 |
45 tomkliyes 2024 年 6 月 11 日我理解的防重放:一个请求发过去了,但是服务器没有响应,客户端不知道是否成功了,如果没有幂等 id ,客户端再发一个请求过去,服务器可能把两个请求当成独立的,分别处理了。 |
46 aino 2024 年 6 月 11 日我以前和你一样的想法,后面我明白了,面试官问的就是想得到他想要的答案罢了,你想那么多干嘛呢,管他什么呢,问啥就说啥,你爽我也爽,也许你瞧不起面试官,觉得他问的东西浅薄,但是你也确实需要这份工作 |
47 iX8NEGGn 2024 年 6 月 11 日你把“重放”理解错了,计算机网络和网络安全相关书籍中都提到“重放攻击”,防重放是 HTTP 时代的一种安全措施,它是网络层的东西不是应用层,防的网络层中间人抓包后原封不动把包发给服务端。 不做防重放即使加密通信也没用,但 HTTPS 自带加密和防重放功能,如果现在还使用原先的防重放做法,那它的主要用作就是提高反扒的难度。 |
49 yankebupt 2024 年 6 月 11 日@bigbigeggs 如果客户端不那么瘦,可以拿到自己的公网 ip 地址,那么在不那么信任时间戳(比如网络很差或 CPU 调度很差,NTP 精确不到 1 秒)的时候还能多一种选择 |
52 SSang 2024 年 6 月 11 日很明显,你对重放的理解就不对。防重放是用来防中间人攻击的。不然你以为 https 的 seq_num 是用来干什么的。客户端攻击那不叫重放,最多叫 DDOS |
53 SSang 2024 年 6 月 11 日还有,幂等是幂等,重放是重放,看起来好像都是请求两次相同的数据,本质上一个是客户端行为,一个是中间人行为,一个是业务,一个是安全。 |
54 SSang 2024 年 6 月 11 日1. 下单,支付,转账,这种一般是做幂等,但做不做幂等和做不做防重放没有关系。不是说你幂等了就不需要防重放了。 |
55 lurenjiauser 2024 年 6 月 11 日@Richared 正常用户基本上不可能重复出现 nonce ,如果有重复的 nonce 了,那基本上不是正常用户了,当然不提供正常服务啊。 |
56 enumer 2024 年 6 月 11 日安全不绝对就是绝对不安全 |
59 zephyru 2024 年 6 月 11 日安全上用处的确不大,防脚本小子的确是很有用...毕竟打开 F12 复制个接口请求,各种模拟组合拉数据成本实在太低了... |
60 dif 2024 年 6 月 11 日多线程经常用到吧。 |
61 dode 2024 年 6 月 11 日领优惠礼品,网速慢,连点了几下,领到了好几份话费 |
62 dode 2024 年 6 月 11 日接口幂等,岂不是在更高的层次上实现了接口防重放 |
63 ShuWei 2024 年 6 月 11 日op 还是太年轻了 |
65 iX8NEGGn 2024 年 6 月 11 日@jinxjhin 我在 #47 也说了网络层防重放是 HTTP 时代的产物,至于为什么现在的大厂还在用,我也想知道,也有可能只是历史遗留做法而已。 |
66 MIUIOS 2024 年 6 月 11 日没接触过 = 没用 |
67 index90 2024 年 6 月 11 日1. 防重放和幂等是两码事,不要混为一谈。 |
68 bigbigeggs 2024 年 6 月 11 日@cnevil token=MD5(timestamp+参数)生成的,假设你的项目中使用了防重放,我难道不知道你的这个 token 的生成规则?普遍都是这样生成的,很容易就能猜到的 |
69 bigbigeggs 2024 年 6 月 11 日@yxzblue token=MD5(timestamp+参数)生成的,假设项目中使用了防重放,很容易就知道这个 token 的生成规则,所以这也是我比较诟病的一点,我想过通过加 salt 来解决,但是前端怎么安全保证这个 salt 呢? |
70 bigbigeggs 2024 年 6 月 11 日1. 大部分人回复还是比较友好的,一部分人戾气比较重,没必要哈,大家都相互不认识,纯纯上网冲浪 |
71 yxzblue 2024 年 6 月 11 日@bigbigeggs token=MD5(timestamp+参数) |
72 Nosub 2024 年 6 月 11 日 via iPhoneop 主的问题是,自己有了结论,要别人认同你的结论,而大部分人不认同。 其实这个问题很好理解,你家里有一把门锁,大家都觉得锁的存在是有价值的,有用的,你觉得没用,你的道理是门锁是都可以撬开,撬不开也可以砸开,安装了也是摆设。 很多人应该会认同一个观点:安全只是相对的,无非是你要花多大的代价去做这件事,当代价,成本足够高的时候,你自然就放弃了,既然 op 觉得前端加密毫无意义,你可以试试去破解抖音的前端加密逻辑,是不是如你所说的按下 F12 就可以搞定。 |
73 LeeReamond 2024 年 6 月 12 日@zephyru 感觉除非搞前端加密,否则直接调到封装那里,我感觉所谓的成本也就是看五分钟代码的成本。。。至于前端加密,那更是神秘领域了。。 |
74 GeruzoniAnsasu 2024 年 6 月 12 日1. 不要只考虑 CRUD ,多线程是软件架构中最最基础的特性之一,你只是目前没机会写到单机高性能非 HTTP 并发服务而已。 我怀疑你把防重放和防抖防重发混淆了 |
75 yc8332 2024 年 6 月 12 日redis 锁用 string ,get/set 能防住?这个水平到生产环境不会被搞死吗? |
78 lizhisty 2024 年 6 月 12 日你这认知太挫了,能防住 90%的普通人就行 |
79 restkhz 2024 年 6 月 12 日@bigbigeggs 其实我觉得你说的是很有趣的。不知道为什么现在人们戾气这么重。 话说你面试被问这个问题...你准备的这个答案可能就不好... |
80 pkoukk 2024 年 6 月 12 日所有问题都是 成本-收益 的取舍问题 |
81 uiosun 2024 年 6 月 12 日> sync ,lock ,多线程等,工作中根本用不到 什么薪资、什么业务,怎么会连这些都不用……现在连 PHP 都考虑做单核并行化了,到底是什么水准很迷惑。 那不叫重试,那叫幂等性……给我看尴尬了。 |
82 uiosun 2024 年 6 月 12 日@bigbigeggs #70 我看到你 70 楼的话了。怎么说呢,to C 业务 QPS 5~30k 起,并行化、分布式锁、链路熔断等,都会用到的。 譬如你要处理 50G 甚至更多的一份数据,流、ETL 或 Excel 等方式进来,你就需要并行化和锁来保证你的数据可靠性——同时提升效率。 只能说,多去大公司体验一下吧,QPS/数量级稍微高一些,很多问题都是需要你说的“用不到”的工具来更高效、可靠的解决。 |
83 momo2789 2024 年 6 月 12 日 via iPhone看了半天,也没看懂防重放的要点。 |
85 johnhuangemc2 2024 年 6 月 12 日防重放在 99.9%的情况下都没有价值, 但遇到那 0.1%的情况轻些要花掉一个下午的时间梳理恢复数据, 重些年终奖就泡汤了 |
87 cnevil 2024 年 6 月 12 日@bigbigeggs 我做安全的不是专业开发本不想跟你扯这么多,既然你回我了,那就跟你友好探讨一下,首先我认为 token 应该是服务端生成告诉客户端的,客户端怎么会知道你是用什么参数生成的呢?客户端只需要请求的时候带上即可。即攻击者获得了 url ,例如 del?id=1&token=xxx ,攻击者不知道这个用户现在有效的 token ,这个请求到服务器经过校验是无效的啊,为什么不能防止重放呢? |
88 wushenlun 2024 年 6 月 12 日 via Android如果所有人时间都是准的那么完全没问题 |
89 ForkNMB 2024 年 6 月 12 日@bigbigeggs |
90 009694 2024 年 6 月 12 日 via iPhoneopenai 做防重放了吗? |
91 luckyc 2024 年 6 月 12 日> 放重放生成一个 token ,这个 token 人人都知道如何生成的,比如 timestap+参数 用 md5 进行加密,攻击者也可以完全模拟这个 token 的生成规则,来绕过服务端 ???有点意思,你说的是知道 jwt token 吗? 还是你自己选一些参数经过组合再 md5 加密,带着这个结果提交?你认为这就是 token ? |
92 harryWebb 2024 年 6 月 13 日你太年轻了。。。。你根本不知道大部分的攻击者都是半桶水,只要稍微做一下防重放,他的破解成本就会几何倍上升,你要知道很多脚本 boy 都是没有阅读源码的能力的,你作为一个开发者,肯定会觉得破解很简单,这是处于你了解并且知晓的情况下,实际上破解人处于黑盒状态,完全不知道为什么请求会被拦截,造成信息紊乱,大大提高了破解的难度,就好像我之前为了防止别人功能,即使把公钥放前端代码里面加密,依然能挡住 99.999%的攻击,剩下 0.0001%的人,是真大神,也没必要防了 |
93 zltningx 2024 年 6 月 13 日CSRF Token 不是最基本的吗 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。