惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
The GitHub Blog
The GitHub Blog
博客园_首页
T
The Blog of Author Tim Ferriss
H
Hackread – Cybersecurity News, Data Breaches, AI and More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
腾讯CDC
I
InfoQ
量子位
J
Java Code Geeks
P
Proofpoint News Feed
有赞技术团队
有赞技术团队
Webroot Blog
Webroot Blog
Martin Fowler
Martin Fowler
D
Docker
F
Fortinet All Blogs
云风的 BLOG
云风的 BLOG
V
Vulnerabilities – Threatpost
罗磊的独立博客
P
Proofpoint News Feed
T
The Exploit Database - CXSecurity.com
Cyberwarzone
Cyberwarzone
P
Privacy & Cybersecurity Law Blog
Last Week in AI
Last Week in AI
爱范儿
爱范儿
The Hacker News
The Hacker News
S
SegmentFault 最新的问题
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
V
V2EX
Simon Willison's Weblog
Simon Willison's Weblog
AI
AI
Y
Y Combinator Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
GbyAI
GbyAI
V
Visual Studio Blog
H
Heimdal Security Blog
S
Secure Thoughts
B
Blog RSS Feed
雷峰网
雷峰网
T
Tenable Blog
C
Check Point Blog
G
Google Developers Blog
大猫的无限游戏
大猫的无限游戏
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
A
About on SuperTechFans
Recent Commits to openclaw:main
Recent Commits to openclaw:main

Web Dev

没想到 2026 年,还要浪费大量时间在跨域问题上 - V2EX 关于 webview 移动应用开发的一些疑惑,求解答 - V2EX 浏览器访问一个域名不通的情况下,如何让这个域名再次发起 dns 请求 - V2EX 用 socks5 代理无法返回正常网页内容 - V2EX Datastar 未来有机会代替 React 吗? - V2EX nb 了, chrome mobile 文件上传还存在问题啊,不能同时允许多种 accept ,页面会触发刷新 - V2EX 请教下大佬们有无移动端 app 上 h5 页面休眠/内存优化思路 - V2EX 想问问现在大家工作/业务上都用上 http3 了吗? - V2EX 如何截断 http 请求 - V2EX v2 的新回复展示 是如何推送的? - V2EX 有没一种可以将 http/socks 代理转 http 协议的东西? - V2EX 关于 Https 证书验证问题 - V2EX 想找静态网页托管服务,无需域名 - V2EX 如何拼凑不同网页的不同部分到一个网页 - V2EX 特别快速开发网页程序的方法? - V2EX shopify 怎么切换 identity provider - V2EX 还有人在使用 ASP 吗? - V2EX 看到一个项目, H5 页面使用 ip 部署,确定没有 ssl,为啥从微信打开还是能调用摄像头? 求推荐开源的工业领域电商项目 - V2EX 纯编程小白,用 ds 做了个网站碰到阿里云部署问题,寻求耐心指导 - V2EX 请问一下,各位是使用哪些统计平台呢?使用 uniapp 开发的 APP,相对用户进行记录与统计。 - V2EX API 请求体字段定义询问各位大佬。 - V2EX 网络请求 ERR_CONNECTION_ABORTED,问题求助 - V2EX 什么样的网站算设计精良的 - V2EX 应不应该把主键 id 暴露在 url 上? - V2EX 前端项目部署到服务器,怎么调通访问服务器上的内网 IP 接口 - V2EX 本地开发用什么域名? - V2EX c++ go rust 谁更适合开发 嵌入式 Linux 上的 web 后台服务 - V2EX 求知 大佬们 一定帮我解答下 感谢 Fastapi 框架中的模板引擎 jinja2 是否已过时,或者说是否还建议使用 - V2EX 推荐一个 web 开发小工具,检测页面是否可以 iframe, 网址 https://iframetester.dev/ - V2EX failed to load response data: no resource with given identifier found - V2EX 请教谷歌浏览器自动填充 - V2EX 各位都在用什么 web 证书方案呢 - V2EX 求助:通过 http 访问某域名失败 - V2EX 服务器端 http 接口调试工具 - V2EX 请教一下搜索和搜索结果页面分离如何参数传递? - V2EX flutter 开发 web 似乎问题也不大 - V2EX 网站中使用原生 dialog 优化用户体验 - V2EX VSCode 这种基于 Web 的文本编辑器中的输入光标是怎么实现的? - V2EX 请教: WebSocket + Protobuf 做服务,如何定义路由 - V2EX web 里上传文件 4mb 可以, 5mb 只能等超时是啥问题; - V2EX web 开发实战练习的项目有哪些?不是单独一个页面的,是能完整做出一个完整网站的。 - V2EX 关于 Web 开发困惑,请教从移动开发转到 Web 开发的大佬 - V2EX 请教一下 web app 架构问题 - V2EX 请教各位,作为一名计算机小白设计师,用什么平台搭建自己的个人网站比较好? - V2EX 目前还有没有国内访问比较友好的静态网页托管服务 - V2EX 请问有什么事件可以监听到 GuzzleHttp 的 curl 请求吗? - V2EX 如果别人拿我的微信云环境当图床使用,微信有没有防御措施? - V2EX 腾讯现在还提供 url.cn 这种短链接服务吗? 还有大公司提供吗? - V2EX
接口防重放 是不是存粹的脱了裤子放屁? - V2EX
bigbigeggs · 2024-06-10 · via Web Dev

这是一个创建于 734 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

yuhaofe

1

yuhaofe      2024 年 6 月 10 日   ❤️ 2

重点是看防谁、防什么吧,不就是你文章里说的增加攻击人的成本吗,看你想不想防比如我这种看到个接口就想调试下的脚本 boy😂,可能看到麻烦点就放弃了

zjp

2

zjp      2024 年 6 月 10 日 via Android

云服务的接口都有防重放
没有可以实现幂等的地方,只能在请求参数上防止重复请求

porjac233

3

porjac233      2024 年 6 月 10 日 via iPhone   ❤️ 38

你出门好会锁门吗? 你知道开锁师傅开个锁仅需几分钟吗? 锁门是不是脱裤子放屁?
安全不绝对,所以安全措施就没必要存在?
什么 2B 结论?

kran

4

kran      2024 年 6 月 10 日 via Android

甚至不知道哪家会不防请求重放

whusnoopy

5

whusnoopy      2024 年 6 月 10 日

我司写了

一是出于本能的安全防御
二是服务部署在平台方的私有云上,平台方的安全团队会时不时重放 URL 请求来做安全监测

MMM25O7lf09iR4ic

6

MMM25O7lf09iR4ic      2024 年 6 月 10 日

这是很常见的方案,你的最后一行疑问才是比较离谱的,没用过的话见也应该见过不少,特征为 timestamp+nonce 。

IvanLi127

7

IvanLi127      2024 年 6 月 10 日   ❤️ 8

不是拿不到 url 和参数的时候,把抓的包拿去重放吗?你开头是不是直接错了

forvvvv123

8

forvvvv123      2024 年 6 月 10 日

楼上正解,防止重放一般是考虑攻击者拿到了正常用户的流量,仿冒正常用户去请求的这种场景;

cJ8SxGOWRH0LSelC

9

cJ8SxGOWRH0LSelC      2024 年 6 月 10 日   ❤️ 1

只要不是个人随便玩玩的项目, 接口防重放是必须做的, 参数加签都是标配的。 但凡对接过其他公司的 API 都不会有这样的疑问。

LeeReamond

10

LeeReamond      2024 年 6 月 10 日

说了半天感觉不对。我感觉问题可能是现在传输层都用 tls 保护了,是否还有必要实现业务防重放

ysc3839

11

ysc3839      2024 年 6 月 10 日 via Android   ❤️ 1

按我个人理解,重放攻击属于中间人攻击,防重放攻击防不了客户端攻击,而 HTTPS 本身已经有防重放攻击的能力了,所以不需要自己特意去防重放攻击。你文章里提到的情况,实际不是重放攻击,而是“非官方客户端”,攻击者尝试绕过你的客户端逻辑,直接请求接口。

LeeReamond

12

LeeReamond      2024 年 6 月 10 日

还有一个问题是,例如 select 类操作,实现幂等很容易。新添加数据,加入幂等也不难。但是例如 A 给 B 转账这种操作能实现幂等吗?

me1onsoda

13

me1onsoda      2024 年 6 月 10 日

@zjp 能做防重放肯定能做幂等,防重放某种意义上也可以叫幂等吧

Aloento

14

Aloento      2024 年 6 月 10 日   ❤️ 1

安全不绝对 = 绝对不安全!

wind1986

15

wind1986      2024 年 6 月 10 日   ❤️ 2

包括 sync ,lock ,多线程等,工作中根本用不到
想问问工作几年了, 怎么会这些用不到

106npo

17

106npo      2024 年 6 月 10 日

是,大部分人要的不是防重放,而是 1. 防爬虫 2. 限频

akira

18

akira      2024 年 6 月 10 日   ❤️ 4

啊? 重放最主要不是要解决用户手抖的问题么。。其他的都是顺带的呀

zjp

19

zjp      2024 年 6 月 10 日

@me1onsoda 说得不严谨,业务逻辑部分的幂等,不是请求的整体

N6R91zIxLm37099s

20

N6R91zIxLm37099s      2024 年 6 月 10 日   ❤️ 2

这种面试其实看的是你的下限,不是上限。

个人感觉八股文其实是软件发展的一个脉络,应该懂但是不要照本宣科

最后你的那句 `防重放用处不大` 是完全错误的,每个注入点都是血的教训我举个场景

验证码重放可以遍历用户弱口令,短信发送重放可以刷接口或者做短信轰 X 炸

binux

21

binux      2024 年 6 月 10 日 via Android   ❤️ 1

最近做了一个买票刷票软件,虽然它对请求加密了,但是就是因为没有防重放,连解密都省了

purrgil

22

purrgil      2024 年 6 月 11 日

不防重放的话,抓包,下载个 curl 然后复制 http 请求到.bat 里循环执行,就直接刷得飞起了。

weijancc

23

weijancc      2024 年 6 月 11 日

我之前爬过许多大网站的接口, 防重放可以说是基操了.

macaodoll

24

macaodoll      2024 年 6 月 11 日 via Android   ❤️ 1

一看就是没接触过电商抢购功能。

yxzblue

25

yxzblue      2024 年 6 月 11 日   ❤️ 7

攻击者也可以完全模拟这个 token 的生成规则,来绕过服务端

攻击者怎么会知道服务端的生成规则?

skuuhui

26

skuuhui      2024 年 6 月 11 日

在移动端刚兴起的年代,大部分防重放是为了解决弱网环境下重试导致的无效请求的问题。现在技术成熟了,确实失去了百分之 99 情况下的用处了。现在还执着追求这个的,要么历史原因,要么过于迂腐了。对于大部分程序员来说,模仿很容易,动脑真的很难

crackidz

27

crackidz      2024 年 6 月 11 日

重放不是指 TCP 流重放,是指 HTTP 的接口重放,不在同一层。
即便通过 token 防止重放,也不应该单纯使用三方都知道的信息生成,至少应该包含攻击方不知道的信息

dj721xHiAvbL11n0

28

dj721xHiAvbL11n0      2024 年 6 月 11 日   ❤️ 1

你要不先看看你有多少错别字?
2.token 的生成,是一种对原信息的签名操作,因为只有服务器有秘钥,所以你不可以伪造
3.https 客户端什么时候能用私钥签?服务器用公钥验,你要不要看看你说的什么?

darkengine

29

darkengine      2024 年 6 月 11 日

想得挺美,我是不会点那个链接 /狗头

InkStone

30

InkStone      2024 年 6 月 11 日

1. 防重放的 nonce 可以服务端生成下发。
2. 仅客户端也可以做防重放的,加固了解一下。别说什么加固也可以破,现实是就是有很多加固现在还好好运行在那里没被破。

wqhui

31

wqhui      2024 年 6 月 11 日

https 保证的是传输过程安全,但你怎么保证发起请求的人是可信的
请求的 token 一般会混入一些像私钥一样的东西,要生成先得盗私钥

多线程之类的不算八股文,日常偶尔就用,除非问你底层 JVM 怎么实现 sync 跟 lock ,19 年的账号居然没用过多线程。。

geligaoli

32

geligaoli      2024 年 6 月 11 日

接口的重放攻击,基本是必然遇到的。做过的项目,只要用户量一大,无论是否公开,必然在日志里面会记录到重放攻击。处理实际也好办,幂等或 hash 过滤。

FawkesV

33

FawkesV      2024 年 6 月 11 日

sync ,lock ,多线程 这不是很常用的吗??

dhb233

34

dhb233      2024 年 6 月 11 日

一个很现实的问题,支付接口是幂等的,QPS 能支持多大?防重放能支持多大 QPS ?

jqknono

35

jqknono      2024 年 6 月 11 日

认清自己

cnevil

36

cnevil      2024 年 6 月 11 日

"放重放生成一个 token ,这个 token 人人都知道如何生成的,比如 timestap+参数 用 md5 进行加密,攻击者也可以完全模拟这个 token 的生成规则,来绕过服务端"
我怀疑你连 token 都没搞明白

blankmiss

37

blankmiss      2024 年 6 月 11 日

包括 sync ,lock ,多线程等,工作中根本用不到 , 你们是什么公司 还是说你菜的一匹

salmon5

39

salmon5      2024 年 6 月 11 日

你以为客户端 HTTPS 安全,客户端的浏览器可不老实。

lurenjiauser

40

lurenjiauser      2024 年 6 月 11 日

接口上 timestamp + nonce ,nonce 在 now + timer 时间范围内缓存,非常简单基础的方案,自己把问题想岔了吧?

hallDrawnel

41

hallDrawnel      2024 年 6 月 11 日

你甚至已经分析到了掘金的点赞防重复逻辑,在进一步想放重放逻辑不是千篇一律的啊。我们所有有重放可能的接口都有防重放逻辑。

Cruzz

42

Cruzz      2024 年 6 月 11 日

其实这些我一直有个疑问,不管用什么方式去做,都不能影响正常用户请求吧。比如 timestamp 过期了,正常的用户是给续期么?那么做攻击的人不是也可以续期。

lovelylain

43

lovelylain      2024 年 6 月 11 日

防重放 token 可能是上一步接口后台生成返回,上一步接口可能是验证用户登录态是用户行为触发,登录态和 token 都有时效性。

sampeng

44

sampeng      2024 年 6 月 11 日   ❤️ 1

这个问题嘛。。。怎么说呢。只能说,你经验太少。所以觉得很无所谓。

我作为运维,要是谁的接口涉及到钱的不做防重放。我直接就贴脸放大了。是是是。你懒得做,然后我一看账单短信被刷几十万,被骂的人是我。研发来一句脱裤子放屁试试。。

这是主问题。次问题。。是是是,你用不到就是八股文。

那我是不是可以建一个画像:

1.crud Boy
2.不学习任何计算机底层知识。sync ,lock ,多线程在很多领域都要用。你只会 crud 当然涉及不到,你还不学。业务有啥?很高精尖吗?写个 crud 能写出花来?
3.对于技术只停留在表象,不深究其原理和为什么要这么做

你一句不信,我默默看着我司代码库里面这都是啥?我们组十年前的项目不带防重放,技术评审都过不去

tomkliyes

45

tomkliyes      2024 年 6 月 11 日

我理解的防重放:一个请求发过去了,但是服务器没有响应,客户端不知道是否成功了,如果没有幂等 id ,客户端再发一个请求过去,服务器可能把两个请求当成独立的,分别处理了。

aino

46

aino      2024 年 6 月 11 日

我以前和你一样的想法,后面我明白了,面试官问的就是想得到他想要的答案罢了,你想那么多干嘛呢,管他什么呢,问啥就说啥,你爽我也爽,也许你瞧不起面试官,觉得他问的东西浅薄,但是你也确实需要这份工作

iX8NEGGn

47

iX8NEGGn      2024 年 6 月 11 日   ❤️ 2

你把“重放”理解错了,计算机网络和网络安全相关书籍中都提到“重放攻击”,防重放是 HTTP 时代的一种安全措施,它是网络层的东西不是应用层,防的网络层中间人抓包后原封不动把包发给服务端。

不做防重放即使加密通信也没用,但 HTTPS 自带加密和防重放功能,如果现在还使用原先的防重放做法,那它的主要用作就是提高反扒的难度。

yankebupt

49

yankebupt      2024 年 6 月 11 日

@bigbigeggs 如果客户端不那么瘦,可以拿到自己的公网 ip 地址,那么在不那么信任时间戳(比如网络很差或 CPU 调度很差,NTP 精确不到 1 秒)的时候还能多一种选择
毕竟重放攻击大部分时候是时间不同,ip 地址不同(有 ip 一样的,少见,毕竟攻击者自己拿不到回复了)
猜测神经过敏一点的人甚至会用包 TTL 波动 filter 重放攻击要求重新登陆,我觉得太容易误判了……

SSang

52

SSang      2024 年 6 月 11 日

很明显,你对重放的理解就不对。防重放是用来防中间人攻击的。不然你以为 https 的 seq_num 是用来干什么的。客户端攻击那不叫重放,最多叫 DDOS

SSang

53

SSang      2024 年 6 月 11 日   ❤️ 1

还有,幂等是幂等,重放是重放,看起来好像都是请求两次相同的数据,本质上一个是客户端行为,一个是中间人行为,一个是业务,一个是安全。

SSang

54

SSang      2024 年 6 月 11 日

1. 下单,支付,转账,这种一般是做幂等,但做不做幂等和做不做防重放没有关系。不是说你幂等了就不需要防重放了。
2. 客户端一般只生成 nonce ,生成 token 干嘛?除非你要搞回调。
3. 重放解决的是过程安全,你说的所谓客户端安全,那叫防抖或防 DDOS 吧。

lurenjiauser

55

lurenjiauser      2024 年 6 月 11 日

@Richared 正常用户基本上不可能重复出现 nonce ,如果有重复的 nonce 了,那基本上不是正常用户了,当然不提供正常服务啊。

enumer

56

enumer      2024 年 6 月 11 日

安全不绝对就是绝对不安全

looveh

57

looveh      2024 年 6 月 11 日

@wind1986 我也没用过,工作 7,8 年了。难怪这么菜😭我对锁什么的概念都很模糊

zephyru

59

zephyru      2024 年 6 月 11 日   ❤️ 3

安全上用处的确不大,防脚本小子的确是很有用...毕竟打开 F12 复制个接口请求,各种模拟组合拉数据成本实在太低了...
虽然逆向肯定是拿的到这些重放用的参数,但怎么都是成本不是

dif

60

dif      2024 年 6 月 11 日

多线程经常用到吧。

dode

61

dode      2024 年 6 月 11 日

领优惠礼品,网速慢,连点了几下,领到了好几份话费

dode

62

dode      2024 年 6 月 11 日

接口幂等,岂不是在更高的层次上实现了接口防重放

ShuWei

63

ShuWei      2024 年 6 月 11 日

op 还是太年轻了

jinxjhin

64

jinxjhin      2024 年 6 月 11 日

@iX8NEGGn #50 这些防重放手段只能用于防止中间人重放吧? https 为何还要防止中间人重放?

iX8NEGGn

65

iX8NEGGn      2024 年 6 月 11 日

@jinxjhin 我在 #47 也说了网络层防重放是 HTTP 时代的产物,至于为什么现在的大厂还在用,我也想知道,也有可能只是历史遗留做法而已。

MIUIOS

66

MIUIOS      2024 年 6 月 11 日

没接触过 = 没用

index90

67

index90      2024 年 6 月 11 日

1. 防重放和幂等是两码事,不要混为一谈。
2. 你在胡言乱语,你需要搞清楚票据和签名的概念。除非攻击者掌握私钥,否者即使知道算法也无法模拟真实用户请求。
3. https 也可以重放的,另外什么是“放重放解决“客户端”的安全”,又是胡言乱语。

bigbigeggs

68

bigbigeggs      2024 年 6 月 11 日

@cnevil token=MD5(timestamp+参数)生成的,假设你的项目中使用了防重放,我难道不知道你的这个 token 的生成规则?普遍都是这样生成的,很容易就能猜到的

bigbigeggs

69

bigbigeggs      2024 年 6 月 11 日

@yxzblue token=MD5(timestamp+参数)生成的,假设项目中使用了防重放,很容易就知道这个 token 的生成规则,所以这也是我比较诟病的一点,我想过通过加 salt 来解决,但是前端怎么安全保证这个 salt 呢?

bigbigeggs

70

bigbigeggs      2024 年 6 月 11 日

1. 大部分人回复还是比较友好的,一部分人戾气比较重,没必要哈,大家都相互不认识,纯纯上网冲浪
2. 多线程的确不是八股文会用到,写差了。sync ,lock 谁在工作中用到?这不纯纯的八股文,要也是分布式锁
3. 防重放我理解评论有些人应该讲清楚了,应该为了防止中间人攻击。但防不住真实的用户拿到 url ,去循环请求。比如掘金的那个点赞(掘金那个感觉是查了一边数据库,然后返回重复点赞的)
4. 防重放的 token 生成规则,token=MD5(timestamp+参数)生成的,这个我感觉没用啊,人人都知道这个规则,我随便用 f12 就知道怎么生成的了

yxzblue

71

yxzblue      2024 年 6 月 11 日

@bigbigeggs token=MD5(timestamp+参数)
已知 token: ff0ff58ff2b0901d47b8070ec0819812 ,timestamp: 1718117839 ,求解参数?

Nosub

72

Nosub      2024 年 6 月 11 日 via iPhone

op 主的问题是,自己有了结论,要别人认同你的结论,而大部分人不认同。

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

很多人应该会认同一个观点:安全只是相对的,无非是你要花多大的代价去做这件事,当代价,成本足够高的时候,你自然就放弃了,既然 op 觉得前端加密毫无意义,你可以试试去破解抖音的前端加密逻辑,是不是如你所说的按下 F12 就可以搞定。

LeeReamond

73

LeeReamond      2024 年 6 月 12 日

@zephyru 感觉除非搞前端加密,否则直接调到封装那里,我感觉所谓的成本也就是看五分钟代码的成本。。。至于前端加密,那更是神秘领域了。。

GeruzoniAnsasu

74

GeruzoniAnsasu      2024 年 6 月 12 日

@bigbigeggs

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

我怀疑你把防重放和防抖防重发混淆了

yc8332

75

yc8332      2024 年 6 月 12 日

redis 锁用 string ,get/set 能防住?这个水平到生产环境不会被搞死吗?

lizhisty

78

lizhisty      2024 年 6 月 12 日

你这认知太挫了,能防住 90%的普通人就行

restkhz

79

restkhz      2024 年 6 月 12 日

@bigbigeggs 其实我觉得你说的是很有趣的。不知道为什么现在人们戾气这么重。
这是很好的思考,这种质疑,是搞信息安全的素养。但是很明显基础知识不够。
然后结论说的比较武断了,防止重放是必要的。但是你说的这种方法的确不是好方法,你对它的质疑是正确的。
一般对抗重放都会引入随机和一次性。引入 Nonce 和速率限制可能是更有意义的做法。而不是用大家都知道的内容比如时间戳之类的 hash 得到 token 。
如果有 HTTPS 也不用特别担心中间人搞重放了。

话说你面试被问这个问题...你准备的这个答案可能就不好...

pkoukk

80

pkoukk      2024 年 6 月 12 日

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

uiosun

81

uiosun      2024 年 6 月 12 日

> sync ,lock ,多线程等,工作中根本用不到

什么薪资、什么业务,怎么会连这些都不用……现在连 PHP 都考虑做单核并行化了,到底是什么水准很迷惑。

那不叫重试,那叫幂等性……给我看尴尬了。

uiosun

82

uiosun      2024 年 6 月 12 日

@bigbigeggs #70

我看到你 70 楼的话了。怎么说呢,to C 业务 QPS 5~30k 起,并行化、分布式锁、链路熔断等,都会用到的。

譬如你要处理 50G 甚至更多的一份数据,流、ETL 或 Excel 等方式进来,你就需要并行化和锁来保证你的数据可靠性——同时提升效率。

只能说,多去大公司体验一下吧,QPS/数量级稍微高一些,很多问题都是需要你说的“用不到”的工具来更高效、可靠的解决。

momo2789

83

momo2789      2024 年 6 月 12 日 via iPhone

看了半天,也没看懂防重放的要点。

johnhuangemc2

85

johnhuangemc2      2024 年 6 月 12 日

防重放在 99.9%的情况下都没有价值, 但遇到那 0.1%的情况轻些要花掉一个下午的时间梳理恢复数据, 重些年终奖就泡汤了

cnevil

87

cnevil      2024 年 6 月 12 日

@bigbigeggs 我做安全的不是专业开发本不想跟你扯这么多,既然你回我了,那就跟你友好探讨一下,首先我认为 token 应该是服务端生成告诉客户端的,客户端怎么会知道你是用什么参数生成的呢?客户端只需要请求的时候带上即可。即攻击者获得了 url ,例如 del?id=1&token=xxx ,攻击者不知道这个用户现在有效的 token ,这个请求到服务器经过校验是无效的啊,为什么不能防止重放呢?
其次,讨论的重点是重放,什么场景会有重放?重放有可能是想针对客户的攻击,例如我把嗅探到的其他用户转账的请求包重放;也可能是针对服务端的攻击,例如我把点赞重放来刷票,甚至也可能是用户觉得页面有点卡他又刷新了一下,你总不能说我在付款页面刷新一下你又扣了一遍款吧?重放不需要考虑你是怎么生成的,我只管把数据包重新发送就行,构造恶意的请求那是另一个范畴了。你可能把重放和 csrf 两个东西搞混了?
反而我认为你还被其他人误导了,中间人和重放不是完全划等号的,逻辑应该是存在中间人攻击的话会出现在重放这个问题,因为我可以获取到你的数据包,但重放也不只在中间人攻击中存在,所以 token 防止不了 mitm ,只能用来解决重放。你想想我都能获取到你往来的请求了,你下一个 token 我也知道是什么,我完全可以构造一个请求带上服务端给你返回的有效 token 。但是我重放你请求的包是没用的,使用 https 才是可以解决 mitm 的方案,之一,https 也并不完全安全,尤其是支持一些老版本的 tls 。
所以我才说你连 token 都没搞明白,因为我从你的描述中感觉你只知道 token 应该怎么生成,但你不知道怎么用,也不知道为什么要用

wushenlun

88

wushenlun      2024 年 6 月 12 日 via Android

如果所有人时间都是准的那么完全没问题

ForkNMB

89

ForkNMB      2024 年 6 月 12 日

@bigbigeggs
(1)业务幂等,这后端应该做的,没啥好讨论的
(2)保证请求参数合法,需要验证签名,确保参数是客户端发出的,客户端可以使用临时的密钥对,用私钥签名,请求的时候带上公钥,服务端验证签名。(用什么固定的 token 或者商量的盐值算 md5 什么的,都不太严谨,至于具体选择的算法不在此讨论
(3)防重放,这个防的是中间人攻击,一般做法请求参数里面有时间戳和 nonce
正常的项目,业务要关心的就是(1) 因为前人肯定搞定了(2)和(3),这种通用的流程一次做好封装好就可以了的

009694

90

009694      2024 年 6 月 12 日 via iPhone

openai 做防重放了吗?

luckyc

91

luckyc      2024 年 6 月 12 日

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

???有点意思,你说的是知道 jwt token 吗?

还是你自己选一些参数经过组合再 md5 加密,带着这个结果提交?你认为这就是 token ?

harryWebb

92

harryWebb      2024 年 6 月 13 日

你太年轻了。。。。你根本不知道大部分的攻击者都是半桶水,只要稍微做一下防重放,他的破解成本就会几何倍上升,你要知道很多脚本 boy 都是没有阅读源码的能力的,你作为一个开发者,肯定会觉得破解很简单,这是处于你了解并且知晓的情况下,实际上破解人处于黑盒状态,完全不知道为什么请求会被拦截,造成信息紊乱,大大提高了破解的难度,就好像我之前为了防止别人功能,即使把公钥放前端代码里面加密,依然能挡住 99.999%的攻击,剩下 0.0001%的人,是真大神,也没必要防了

zltningx

93

zltningx      2024 年 6 月 13 日

CSRF Token 不是最基本的吗