vlog
← 返回全部文章

Tech

静音也拦不住:速卖通网页在你听不见的频率上,开着一台锯齿波发生器

2026年8月21日 · 凯文·凯利《失控》~1 min read

耳机同时连着电脑和手机,手机在放歌。打开速卖通首页,几秒后歌停了;关掉那个标签页,歌又回来。静音标签、静音浏览器、静音整个系统,全没用。一位博主盯着这个邪门现象看了半天:页面上连个播放器的影子都没有。

30 秒读懂
1怪事

歌被掐了,页面上却查无凶手

所有常规嫌疑人都有不在场证明。

博主第一反应跟你我一样:多半是哪个商品视频在自动播放。他把常规嫌疑人挨个过了一遍:

查什么结果
<audio> / <video> 元素零个
媒体 play() 调用零次
Media Session 播放状态none
媒体类网络请求没有

四条线全断。剩下一个细节:问题不在开页那一刻,是页面闲了几秒之后才来。你别看这点小,其实方向全在这——不是哪个媒体文件在响,是有段代码趁页面歇着的时候干了别的。

⚡

为什么值得看:速卖通只是撞上的那家。真问题在 HN 吵了 280 层楼:浏览器给网页的每个能力,最后会被用到什么份上。

2抓包

包一层构造器,才逮到两个看不见的「播放器」

抓不到现行,就在门口挂个铃铛。

他换了个打法:给 AudioContext 构造函数包一层壳,AudioNode.connect 也包上。谁创建音频上下文、谁往音频出口接线,日志里就记一笔。进没进门,嘴上说了不算,铃响了才算。

铃铛很快响了两下。页面空闲时创建了两个 AudioContext,都进入 running,都连上了 destination,也就是系统音频总出口。调用栈指向 assets.aliexpress-media.com 上 AWSC 目录下的 collina.js(1.140.0)和 fireyejs.js(1.231.67),属阿里巴巴的风控反爬组件,混淆得没法直接读。

核心

两个隐藏音频上下文,零个媒体元素,零次 play() 调用。静音按钮从头到尾都使不上劲:它能管的东西,这条链路上一件都没有。

从混淆代码里还是抠出了骨架:一条从振荡器一路接到系统出口的完整管线。画出来一目了然。

3空转

音量是零,可整条链路在真跑

锯齿波振荡器 → 分析器 → ScriptProcessor → 增益 0 → 系统出口。

看懂它,得把整条链拆开看。头上,振荡器生成一个已知的锯齿波;中间,AnalyserNode 测这个波被浏览器音频栈渲染之后的样子;末端,增益归零再接进系统出口。人耳什么都听不见,但浏览器在真实渲染这条链,操作系统据此判定:有声音在播。多点耳机的仲裁逻辑很朴素,谁在播就把占线权给谁,手机那头的歌,就这么被一段没有声音的声音挤掉了。

打个比方

像把车挂空挡踩着油门:轮子不动,发动机在真转、真烧油,车位也真被占着。多点耳机就是停车场管理员,一看电脑这边发动机响着,就把唯一的车位判过去。

说白了,静音键管的是「让你听不见」,从来管不了「系统认不认为在播」。这两件事平时重合,我们就当成了一件事。这回它俩分了家。

A ZERO-GAIN AUDIO CHAIN STOLE THE HEADPHONES' LINEcollina.js · fireyejs.jsAlibaba AWSC risk-control scripts · 2 hidden AudioContextsSILENT AUDIO GRAPH IN THE PAGEinjectOscillatorNodesawtooth waveAnalyserNodeScriptProcessorNodeGainNodegain=0 · mutedAudioContext.destinationTHE SIDE EFFECTAudio stackstays activeSystem decides“now playing”Multipoint earbudshand the link to the PCPhone-side audiogets pushed outaudio data flowscript injection · side effect
Source: blogger laserphile's hands-on teardown of an AliExpress product page (2026/8). Silent fingerprinting shows itself only through its side effects.
4指纹

它按设计在运转:这是一台指纹机

同一个波形,一万台设备渲染出一万种微小的不同。

指纹机的原理:不同的硬件、驱动、系统、浏览器版本,渲染同一个波形会带出各自的微小偏差。单看没意义,凑一起就是一枚能区分设备的指纹,风控拿它认设备、抓机器人、追踪回头客。脚本里量的远不止音频这一路:canvas 渲染、WebGL 信息、屏幕尺寸、硬件并发数、插件列表、WebRTC 行为、鼠标触摸轨迹,量完加密上报。cookie 一清就没,这套东西你清不掉。

WebAudio 设计初衷

给网页做合成器、游戏音效、可视化。规范通篇讲的是怎么发出声音。

这次的实际用法

发一段没人听的声音,量渲染偏差,给设备按指纹。全程静默。

凯文·凯利在《失控》里写过一个规律:给系统加的每个能力,都会长出设计者没预料的用法。WebAudio 的设计者想的是让网页出声,没想过「渲染声音的过程」本身能当尺子使。能力一旦交出去,用法就不归设计者管了。

5告密者

隐蔽的采集,栽在一个没人算到的副作用上

全程静默的系统,被一副耳机供了出来。

这套指纹在无数台电脑上跑过,绝大多数人毫无察觉。让它现形的另有其人:蓝牙多点的占线仲裁,另一个同样在设计之外的机制。两个「设计外用法」迎面相撞,才炸出这一声响。副作用是复杂系统的告密者,系统里瞒着人干的活,迟早从哪个零件上漏出动静。

这类角色我自己也当过。2024 年我给自家 SaaS 的登录页接过一个免费的第三方防刷脚本,阿坤在微信上抱怨:「你这后台一开着,我笔记本风扇就起飞。」我不信,当晚开着任务管理器把登录页晾了一小时:页面明明闲着,GPU 占用每三十来秒跳一下,是那脚本在反复跑 canvas 指纹渲染。我把它拆了,自己写了八十行计数加频控,他的风扇当晚就安静了。用户看不见的活,机器替他看见了,那回告密的是风扇。

HN 上也有人替速卖通说话:盗号、薅优惠券、爬虫下单,风控确实得认设备,指纹比 cookie 难伪造,这是真需求。这话不假。可争的从来不在要不要风控,在告不告诉你:页面零提示,代码往死里混淆,静音键还管不住。评论区反复出现一句话,两边都认:浏览器给的每个能力,都会被用满。

核心

审计与披露都没做到的事,一条蓝牙仲裁规则做到了。这类行为靠制度查不出来,靠碰撞才暴露,而碰撞什么时候来,谁也排不了期。

6你能做什么

这对你意味着什么

三件小事,一个心法。

音频莫名被占线、蓝牙莫名切设备,先怀疑网页:把标签页挨个关掉试,比重启耳机管用。想直接拦,博主给了两条 uBlock Origin 规则,精确封掉 collina.js 和 fireyejs.js 两个脚本族;他实测拦掉后页面照常渲染,隐藏音频上下文不再出现。要是你自己也在做产品,接第三方脚本前记着阿坤的风扇:它在用户机器上干什么,你不盯一眼是真不知道。

拦截风控脚本可能换来更多验证码,登录支付异常时应临时放行;规则只覆盖观察到的两个脚本族,随时可能失效。这两条我自己没实测过,细节以原始报道为准。

更值钱的是心法。设备闹脾气,别急着当故障处理,先当线索看。日志能混淆,声明能美化,零件不会:风扇转没转、耳机切没切,机器从不配合演出。耳机没坏,它只是提前把实话说了。

本文框架取材自凯文·凯利《失控》;事件与技术细节以原始报道与博文为准。

技术

静音也拦不住:速卖通网页在你听不见的频率上,开着一台锯齿波发生器

2026年8月21日 · 凯文·凯利《失控》约 6 分钟

耳机同时连着电脑和手机,手机在放歌。打开速卖通首页,几秒后歌停了;关掉那个标签页,歌又回来。静音标签、静音浏览器、静音整个系统,全没用。一位博主盯着这个邪门现象看了半天:页面上连个播放器的影子都没有。

30 秒读懂
1怪事

歌被掐了,页面上却查无凶手

所有常规嫌疑人都有不在场证明。

博主第一反应跟你我一样:多半是哪个商品视频在自动播放。他把常规嫌疑人挨个过了一遍:

查什么结果
<audio> / <video> 元素零个
媒体 play() 调用零次
Media Session 播放状态none
媒体类网络请求没有

四条线全断。剩下一个细节:问题不在开页那一刻,是页面闲了几秒之后才来。你别看这点小,其实方向全在这——不是哪个媒体文件在响,是有段代码趁页面歇着的时候干了别的。

⚡

为什么值得看:速卖通只是撞上的那家。真问题在 HN 吵了 280 层楼:浏览器给网页的每个能力,最后会被用到什么份上。

2抓包

包一层构造器,才逮到两个看不见的「播放器」

抓不到现行,就在门口挂个铃铛。

他换了个打法:给 AudioContext 构造函数包一层壳,AudioNode.connect 也包上。谁创建音频上下文、谁往音频出口接线,日志里就记一笔。进没进门,嘴上说了不算,铃响了才算。

铃铛很快响了两下。页面空闲时创建了两个 AudioContext,都进入 running,都连上了 destination,也就是系统音频总出口。调用栈指向 assets.aliexpress-media.com 上 AWSC 目录下的 collina.js(1.140.0)和 fireyejs.js(1.231.67),属阿里巴巴的风控反爬组件,混淆得没法直接读。

核心

两个隐藏音频上下文,零个媒体元素,零次 play() 调用。静音按钮从头到尾都使不上劲:它能管的东西,这条链路上一件都没有。

从混淆代码里还是抠出了骨架:一条从振荡器一路接到系统出口的完整管线。画出来一目了然。

3空转

音量是零,可整条链路在真跑

锯齿波振荡器 → 分析器 → ScriptProcessor → 增益 0 → 系统出口。

看懂它,得把整条链拆开看。头上,振荡器生成一个已知的锯齿波;中间,AnalyserNode 测这个波被浏览器音频栈渲染之后的样子;末端,增益归零再接进系统出口。人耳什么都听不见,但浏览器在真实渲染这条链,操作系统据此判定:有声音在播。多点耳机的仲裁逻辑很朴素,谁在播就把占线权给谁,手机那头的歌,就这么被一段没有声音的声音挤掉了。

打个比方

像把车挂空挡踩着油门:轮子不动,发动机在真转、真烧油,车位也真被占着。多点耳机就是停车场管理员,一看电脑这边发动机响着,就把唯一的车位判过去。

说白了,静音键管的是「让你听不见」,从来管不了「系统认不认为在播」。这两件事平时重合,我们就当成了一件事。这回它俩分了家。

一条增益为零的音频链,抢走了耳机的占线权collina.js · fireyejs.js阿里巴巴 AWSC 风控脚本 · 2 个隐藏 AudioContext页面里的无声音频链注入OscillatorNode锯齿波AnalyserNodeScriptProcessorNodeGainNodegain=0 · 静音AudioContext.destination副作用音频栈保持活跃系统判定「正在播放」蓝牙多点耳机把占线权判给电脑手机侧的音频被挤掉音频数据流脚本注入 · 副作用
来源:博主 laserphile 对速卖通页面的实测拆解(2026 年 8 月)。无声的指纹采集,靠副作用现了形。
4指纹

它按设计在运转:这是一台指纹机

同一个波形,一万台设备渲染出一万种微小的不同。

指纹机的原理:不同的硬件、驱动、系统、浏览器版本,渲染同一个波形会带出各自的微小偏差。单看没意义,凑一起就是一枚能区分设备的指纹,风控拿它认设备、抓机器人、追踪回头客。脚本里量的远不止音频这一路:canvas 渲染、WebGL 信息、屏幕尺寸、硬件并发数、插件列表、WebRTC 行为、鼠标触摸轨迹,量完加密上报。cookie 一清就没,这套东西你清不掉。

WebAudio 设计初衷

给网页做合成器、游戏音效、可视化。规范通篇讲的是怎么发出声音。

这次的实际用法

发一段没人听的声音,量渲染偏差,给设备按指纹。全程静默。

凯文·凯利在《失控》里写过一个规律:给系统加的每个能力,都会长出设计者没预料的用法。WebAudio 的设计者想的是让网页出声,没想过「渲染声音的过程」本身能当尺子使。能力一旦交出去,用法就不归设计者管了。

5告密者

隐蔽的采集,栽在一个没人算到的副作用上

全程静默的系统,被一副耳机供了出来。

这套指纹在无数台电脑上跑过,绝大多数人毫无察觉。让它现形的另有其人:蓝牙多点的占线仲裁,另一个同样在设计之外的机制。两个「设计外用法」迎面相撞,才炸出这一声响。副作用是复杂系统的告密者,系统里瞒着人干的活,迟早从哪个零件上漏出动静。

这类角色我自己也当过。2024 年我给自家 SaaS 的登录页接过一个免费的第三方防刷脚本,阿坤在微信上抱怨:「你这后台一开着,我笔记本风扇就起飞。」我不信,当晚开着任务管理器把登录页晾了一小时:页面明明闲着,GPU 占用每三十来秒跳一下,是那脚本在反复跑 canvas 指纹渲染。我把它拆了,自己写了八十行计数加频控,他的风扇当晚就安静了。用户看不见的活,机器替他看见了,那回告密的是风扇。

HN 上也有人替速卖通说话:盗号、薅优惠券、爬虫下单,风控确实得认设备,指纹比 cookie 难伪造,这是真需求。这话不假。可争的从来不在要不要风控,在告不告诉你:页面零提示,代码往死里混淆,静音键还管不住。评论区反复出现一句话,两边都认:浏览器给的每个能力,都会被用满。

核心

审计与披露都没做到的事,一条蓝牙仲裁规则做到了。这类行为靠制度查不出来,靠碰撞才暴露,而碰撞什么时候来,谁也排不了期。

6你能做什么

这对你意味着什么

三件小事,一个心法。

音频莫名被占线、蓝牙莫名切设备,先怀疑网页:把标签页挨个关掉试,比重启耳机管用。想直接拦,博主给了两条 uBlock Origin 规则,精确封掉 collina.js 和 fireyejs.js 两个脚本族;他实测拦掉后页面照常渲染,隐藏音频上下文不再出现。要是你自己也在做产品,接第三方脚本前记着阿坤的风扇:它在用户机器上干什么,你不盯一眼是真不知道。

拦截风控脚本可能换来更多验证码,登录支付异常时应临时放行;规则只覆盖观察到的两个脚本族,随时可能失效。这两条我自己没实测过,细节以原始报道为准。

更值钱的是心法。设备闹脾气,别急着当故障处理,先当线索看。日志能混淆,声明能美化,零件不会:风扇转没转、耳机切没切,机器从不配合演出。耳机没坏,它只是提前把实话说了。

本文框架取材自凯文·凯利《失控》;事件与技术细节以原始报道与博文为准。

テクノロジー

静音也拦不住:速卖通网页在你听不见的频率上,开着一台锯齿波发生器

2026年8月21日 · 凯文·凯利《失控》約 6 分

耳机同时连着电脑和手机,手机在放歌。打开速卖通首页,几秒后歌停了;关掉那个标签页,歌又回来。静音标签、静音浏览器、静音整个系统,全没用。一位博主盯着这个邪门现象看了半天:页面上连个播放器的影子都没有。

30 秒读懂
1怪事

歌被掐了,页面上却查无凶手

所有常规嫌疑人都有不在场证明。

博主第一反应跟你我一样:多半是哪个商品视频在自动播放。他把常规嫌疑人挨个过了一遍:

查什么结果
<audio> / <video> 元素零个
媒体 play() 调用零次
Media Session 播放状态none
媒体类网络请求没有

四条线全断。剩下一个细节:问题不在开页那一刻,是页面闲了几秒之后才来。你别看这点小,其实方向全在这——不是哪个媒体文件在响,是有段代码趁页面歇着的时候干了别的。

⚡

为什么值得看:速卖通只是撞上的那家。真问题在 HN 吵了 280 层楼:浏览器给网页的每个能力,最后会被用到什么份上。

2抓包

包一层构造器,才逮到两个看不见的「播放器」

抓不到现行,就在门口挂个铃铛。

他换了个打法:给 AudioContext 构造函数包一层壳,AudioNode.connect 也包上。谁创建音频上下文、谁往音频出口接线,日志里就记一笔。进没进门,嘴上说了不算,铃响了才算。

铃铛很快响了两下。页面空闲时创建了两个 AudioContext,都进入 running,都连上了 destination,也就是系统音频总出口。调用栈指向 assets.aliexpress-media.com 上 AWSC 目录下的 collina.js(1.140.0)和 fireyejs.js(1.231.67),属阿里巴巴的风控反爬组件,混淆得没法直接读。

核心

两个隐藏音频上下文,零个媒体元素,零次 play() 调用。静音按钮从头到尾都使不上劲:它能管的东西,这条链路上一件都没有。

从混淆代码里还是抠出了骨架:一条从振荡器一路接到系统出口的完整管线。画出来一目了然。

3空转

音量是零,可整条链路在真跑

锯齿波振荡器 → 分析器 → ScriptProcessor → 增益 0 → 系统出口。

看懂它,得把整条链拆开看。头上,振荡器生成一个已知的锯齿波;中间,AnalyserNode 测这个波被浏览器音频栈渲染之后的样子;末端,增益归零再接进系统出口。人耳什么都听不见,但浏览器在真实渲染这条链,操作系统据此判定:有声音在播。多点耳机的仲裁逻辑很朴素,谁在播就把占线权给谁,手机那头的歌,就这么被一段没有声音的声音挤掉了。

打个比方

像把车挂空挡踩着油门:轮子不动,发动机在真转、真烧油,车位也真被占着。多点耳机就是停车场管理员,一看电脑这边发动机响着,就把唯一的车位判过去。

说白了,静音键管的是「让你听不见」,从来管不了「系统认不认为在播」。这两件事平时重合,我们就当成了一件事。这回它俩分了家。

ゲインゼロの音声チェーンが、ヘッドホンの接続権を奪ったcollina.js · fireyejs.jsアリババ AWSC リスク対策スクリプト · 隠れた AudioContext ×2ページ内の無音オーディオグラフ注入OscillatorNodeノコギリ波AnalyserNodeScriptProcessorNodeGainNodegain=0 · 消音AudioContext.destination副作用音声スタックは活性のままシステムが「再生中」と判定マルチポイント機は接続権をPCへ渡すスマホ側の音声が追い出される音声データの流れスクリプト注入 · 副作用
出典:ブロガー laserphile による AliExpress ページの実測分解(2026年8月、詳細は元の報道に準じる)。無音の指紋採取は、副作用によって初めて姿を現す。
4指纹

它按设计在运转:这是一台指纹机

同一个波形,一万台设备渲染出一万种微小的不同。

指纹机的原理:不同的硬件、驱动、系统、浏览器版本,渲染同一个波形会带出各自的微小偏差。单看没意义,凑一起就是一枚能区分设备的指纹,风控拿它认设备、抓机器人、追踪回头客。脚本里量的远不止音频这一路:canvas 渲染、WebGL 信息、屏幕尺寸、硬件并发数、插件列表、WebRTC 行为、鼠标触摸轨迹,量完加密上报。cookie 一清就没,这套东西你清不掉。

WebAudio 设计初衷

给网页做合成器、游戏音效、可视化。规范通篇讲的是怎么发出声音。

这次的实际用法

发一段没人听的声音,量渲染偏差,给设备按指纹。全程静默。

凯文·凯利在《失控》里写过一个规律:给系统加的每个能力,都会长出设计者没预料的用法。WebAudio 的设计者想的是让网页出声,没想过「渲染声音的过程」本身能当尺子使。能力一旦交出去,用法就不归设计者管了。

5告密者

隐蔽的采集,栽在一个没人算到的副作用上

全程静默的系统,被一副耳机供了出来。

这套指纹在无数台电脑上跑过,绝大多数人毫无察觉。让它现形的另有其人:蓝牙多点的占线仲裁,另一个同样在设计之外的机制。两个「设计外用法」迎面相撞,才炸出这一声响。副作用是复杂系统的告密者,系统里瞒着人干的活,迟早从哪个零件上漏出动静。

这类角色我自己也当过。2024 年我给自家 SaaS 的登录页接过一个免费的第三方防刷脚本,阿坤在微信上抱怨:「你这后台一开着,我笔记本风扇就起飞。」我不信,当晚开着任务管理器把登录页晾了一小时:页面明明闲着,GPU 占用每三十来秒跳一下,是那脚本在反复跑 canvas 指纹渲染。我把它拆了,自己写了八十行计数加频控,他的风扇当晚就安静了。用户看不见的活,机器替他看见了,那回告密的是风扇。

HN 上也有人替速卖通说话:盗号、薅优惠券、爬虫下单,风控确实得认设备,指纹比 cookie 难伪造,这是真需求。这话不假。可争的从来不在要不要风控,在告不告诉你:页面零提示,代码往死里混淆,静音键还管不住。评论区反复出现一句话,两边都认:浏览器给的每个能力,都会被用满。

核心

审计与披露都没做到的事,一条蓝牙仲裁规则做到了。这类行为靠制度查不出来,靠碰撞才暴露,而碰撞什么时候来,谁也排不了期。

6你能做什么

这对你意味着什么

三件小事,一个心法。

音频莫名被占线、蓝牙莫名切设备,先怀疑网页:把标签页挨个关掉试,比重启耳机管用。想直接拦,博主给了两条 uBlock Origin 规则,精确封掉 collina.js 和 fireyejs.js 两个脚本族;他实测拦掉后页面照常渲染,隐藏音频上下文不再出现。要是你自己也在做产品,接第三方脚本前记着阿坤的风扇:它在用户机器上干什么,你不盯一眼是真不知道。

拦截风控脚本可能换来更多验证码,登录支付异常时应临时放行;规则只覆盖观察到的两个脚本族,随时可能失效。这两条我自己没实测过,细节以原始报道为准。

更值钱的是心法。设备闹脾气,别急着当故障处理,先当线索看。日志能混淆,声明能美化,零件不会:风扇转没转、耳机切没切,机器从不配合演出。耳机没坏,它只是提前把实话说了。

本文框架取材自凯文·凯利《失控》;事件与技术细节以原始报道与博文为准。