浏览器控制台CSP报错别慌:manifest-src none拦截不是中毒,而是内容安全策略在保护你

前言:浏览器控制台突然出现CSP报错,提示manifest-src none被拦截,很多人第一反应是电脑中毒了。其实这是内容安全策略在正常工作:网站出于最小权限原则封死了manifest.json加载,或浏览器扩展注入代码触发了拦截。它只影响PWA网页安装到桌面应用这一个功能,不影响正常使用,更不需要杀毒。了解这行红字背后的钓鱼攻击与CVE漏洞案例,你会明白被拦下才是安全。

前几天晚上十一点多,一个朋友突然给我发消息,附了张截图。

浏览器控制台,F12打开那种,一行刺眼的红字。

Loading a manifest from ‘https://gemini.google.com/_/BardChatUi/manifest.json’ violates the following Content Security Policy directive, 「manifest-src ‘none’」. The action has been blocked

他问我,哥,我是不是中毒了,这玩意儿要不要杀毒。

我看完第一反应是想笑。第二反应是,这事儿其实挺有意思的,值得展开聊聊。

因为这可能是普通用户最常遇到、也最容易被吓到的一类报错。它长得凶,红彤彤一大行英文,还有 blocked 这种词,任谁看了心里都咯噔一下。但真相是,这行红字非但不是你的电脑出问题了,反而是你的浏览器在尽职尽责地保护你。

先拆开看这行字到底在说什么。

manifest.json,这东西中文叫应用清单文件。你如果用过 Chrome 或者 Edge 把某个网页「安装」到桌面上,变成一个像App一样的独立窗口,那这个安装包的说明书就是它。这个网页叫什么名字、图标长啥样、点开之后先加载哪个地址、主题色是什么,全写在这个 json 文件里。

网页变App,靠的就是这份说明书
网页变App,靠的就是这份说明书

然后是 Content Security Policy,内容安全策略,圈内都叫它 CSP。这个东西你可以理解成,网站在把页面发给你的浏览器时,顺手附上的一张禁令清单。上面白纸黑字写着,我这个页面,允许从哪儿加载脚本,允许从哪儿加载图片,允许从哪儿加载清单文件。浏览器是个特别听话的保安,清单上没写的,一律拦下。

所以 manifest-src ‘none’ 翻译成人话就是,本页面绝对不允许加载任何应用清单文件,一个都不行。

那为什么 Gemini 的页面上会出现这条禁令,然后又被触发呢。

两种最常见的可能。

一种是网站自己主动关掉了这个功能。Google 的工程师觉得,这个页面压根不打算让用户装成桌面App,那按照安全圈的老规矩,用不到的权限就干脆封死,这叫最小权限原则。门都不用了,那就焊死,连被撬的机会都不给。

另一种,也是你大概率中招的那种,浏览器扩展在捣乱。广告拦截、暗黑模式、翻译插件、页面美化,这类扩展的工作方式,就是往你打开的每个网页里强行注入一点自己的代码。注入的时候,有时候会顺手动到 manifest 相关的东西。而 CSP 这个保安是六亲不认的,它不管你是黑客还是插件,只要碰了禁令清单上的东西,立刻拦截,立刻在控制台拉响警报。

于是你就看到了那行红字。

保安不管你是谁,碰了就拦
保安不管你是谁,碰了就拦

那这事儿对正常使用有影响吗。

没有。真的没有。

它只影响「把这个网页安装成独立App」这一个功能。你正常跟 Gemini 聊天、提问、生成内容,一个字都不耽误。你又不打算把它装到桌面上,那这道门焊没焊死,跟你半毛钱关系都没有。

看到这里,可能有的朋友会觉得,哦,那就这样了,一篇科普文到此结束。

但真正有意思的部分,恰恰在后面。

我后来去查了一圈资料,发现 manifest-src ‘none’ 这条禁令背后,挡着的不是一个抽象的「安全风险」,而是一整类真实存在、而且真的被人玩过的攻击。

你想一下,manifest.json 的权力其实大得吓人。它决定了用户装到桌面上的那个App,叫什么名字,用什么图标,点开后打开哪个网址。假如一个网站有漏洞,黑客往页面里注入了一个自己写好的恶意 manifest,会发生什么。

用户以为自己在安装官方应用。装完之后,桌面上的图标一模一样,名字一模一样,点开却是一个钓鱼站。全屏运行,连地址栏都没有。账号密码输进去,直接送人。

这不是我吓唬人。Chrome 在 2023 年就修过一个编号 CVE-2023-1230 的漏洞,攻击者可以伪造 PWA 安装弹窗的内容。更早的 2020 年,Firefox 的安卓版出过更狠的,编号 CVE-2020-26954,攻击者能给任意网站静默注入恶意 manifest,装出来的假App全屏运行,地址栏随便伪造,甚至还能注册一个假的分享目标,偷走用户分享出去的内容。

你以为装的是它,其实是他
你以为装的是它,其实是他

所以 Google 直接一刀切,manifest-src ‘none’,这道门我不要了,焊死。哪怕哪天我的页面真被注入了恶意代码,黑客想挂一份假清单上去,浏览器也会替我把活儿干完,拦下,报警。

这就是我说的,有意思的地方。

你看到的是一行报错,实际发生的是一次拦截成功。

这行红字不是事故报告,是保安的工作日志。

说到这个,我有时候觉得,我们普通人对「报错」这两个字有一种条件反射式的恐惧。看到红色就慌,看到 blocked 就觉得自己做错了什么。但稍微往里走一步你会发现,绝大多数安全类报错,恰恰是防线正常运转的证据。

真正可怕的,从来不是被拦下来的那些。

而是那些悄无声息、什么提示都没有、直接穿透过去的。

就像你家小区门口,保安拦下一个快递员查证件,你觉得真麻烦。但某天保安开始对所有人放行、笑脸相迎,那才该半夜睡不着。好的安全就是这样,它存在的时候你嫌它烦,它失效的时候你根本感觉不到。

这行红字,就是那个拦下快递员的保安,冲你敬了个礼。

所以回到开头我朋友那个问题,要不要杀毒。

不用。下次再在控制台看到这种 CSP 拦截的提示,深呼吸,该干嘛干嘛。真要较真,就去检查一下自己装了哪些扩展,把不认识的关掉再刷新试试,仅此而已。

大时代啊朋友们,我们每天在网页里进进出出,身后站着一堆我们永远看不见的保安。它们拦下九十九次攻击,我们一次都不会知道。

偶尔拦一次,被你看见了。

别慌,那是它在跟你打招呼。

/ 注意,本项目仅在 SyncMein 的500人小群分享。
/ 谢谢你看完了我的文章,我们下次再见吧。
/ 作者:明察
/ 投稿或爆料,请联系邮箱:mingcha@gqmg.com

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容