Chrome 将不再允许 https:// 页面加载 HTTP 资源

Google宣布,Chrome浏览器将逐步阻止加载HTTP子资源,即使在HTTPS页面上。此改动旨在提高网页安全性,防止混合内容带来的风险。自Chrome79起开始测试,到Chrome81将全面实施,包括自动升级音频、视频和图像资源为HTTPS,无法升级的将被阻止。

点击上方“芋道源码”,选择“设为星标

做积极的人,而不是积极废人!

源码精品专栏

 

来源:oschina.net/news/110345/

Chrome 安全小组近日在一篇博客文章中表示,计划使 https:// 页面不再加载 HTTP 子资源。

根据 Google 的说法,Chrome 用户现在在所有主要平台上的 HTTPS 上花费了 90% 以上的浏览时间。但是,那些安全页面加载不安全的 HTTP 子资源却是很常见的。这些子资源中的许多默认情况下都是被阻止的,但有些会作为图像、音频和视频或“混合内容”潜入,混合内容可能会使用户面临风险,比如脚本、iframe 与媒体文件。

从今年 12 月开始测试的 Chrome 79 开始,Chrome 将会逐步阻止所有混合内容。到 2020 年 1 月,Chrome 80 会将所有混合音频和视频资源自动升级为 HTTPS,如果无法通过 HTTPS 加载,则将自动被阻止。最终,在 2020 年 2 月,Chrome 81 将所有混合图像、音频与视频自动升级为 HTTPS,并且阻止那些无法通过 HTTPS 加载的图像。

同时,Chrome 79 中还将添加一个新设置项,用户可以用来取消阻止特定站点上的混合内容。

这样的过渡使开发人员有时间将其混合内容迁移到 HTTPS 上。

类似的措施,此前我们报导过,谷歌 Chrome 工程师 Emily Stark 已经在 W3C 邮件列表上提出,计划在 HTTPS 网站上默认禁止一些通过 HTTP 下载的行为,当涉及到下载 EXE、DMG(Mac 应用二进制文件)、CRX(Chrome 扩展包) 与诸如 ZIP、GZIP、BZIP、TAR、RAR 和 7Z 等主流压缩/打包文件时,浏览器将阻止下载。默认阻止下载的这些文件类型被认为是“高风险”的,因为它们最有可能被滥用来隐藏恶意程序。

????那么问题就来了,你们全站都更换 HTTPS 了么?

我们已经换了,美滋滋。嘿嘿。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:


如果你喜欢这篇文章,喜欢,转发。

生活很美好,明天见(。・ω・。)ノ♡

在 Chromium 中实现打开 `chrome://` 开头的 URL 后将其替换为 `xiaozhi://` 开头的 URL 且不重新加载页面,需要在浏览器内核层面进行干预,同时确保地址栏显示更新但页面状态保持不变。这可以通过 `NavigationThrottle` 和 `WebContents` 的 URL 显示控制机制来实现。 ### 3.1 使用 `NavigationThrottle` 拦截导航请求 Chromium 提供了 `NavigationThrottle` 接口,允许在导航开始前进行干预。通过实现该接口,可以检测到以 `chrome://` 开头的 URL,并将其重定向为 `xiaozhi://`,但该方式会触发页面重新加载。 ```cpp class XiaozhiNavigationThrottle : public content::NavigationThrottle { public: explicit XiaozhiNavigationThrottle(content::NavigationHandle* handle) : content::NavigationThrottle(handle) {} const char* GetName() const override { return "XiaozhiNavigationThrottle"; } content::NavigationThrottle::ThrottleCheckResult WillStartRequest() override { const GURL& url = navigation_handle()->GetURL(); if (url.SchemeIs("chrome")) { GURL::Replacements replacements; replacements.SetSchemeStr("xiaozhi"); GURL new_url = url.ReplaceComponents(replacements); return content::NavigationThrottle::ThrottleCheckResult( content::NavigationThrottle::ACTION_REDIRECT, new_url); } return content::NavigationThrottle::ThrottleCheckResult( content::NavigationThrottle::ACTION_CONTINUE); } }; ``` 此类需在 `content::BrowserContext` 的 `GetNavigationThrottles` 方法中注册,确保每个导航请求都会被处理[^2]。 ### 3.2 通过 `WebContents` 控制地址栏显示而不重新加载页面 若希望在页面加载完成后仅修改地址栏显示的 URL 而不重新加载页面,则应通过 `WebContents` 的 `DidChangeVisibleSecurityState` 或 `DidFinishNavigation` 方法更新 URL 显示状态。 ```cpp void OnDidFinishNavigation(content::NavigationHandle* handle) { if (handle->IsInMainFrame() && handle->HasCommitted() && handle->GetURL().SchemeIs("chrome")) { GURL::Replacements replacements; replacements.SetSchemeStr("xiaozhi"); GURL new_url = handle->GetURL().ReplaceComponents(replacements); handle->GetWebContents()->GetController().GetVisibleEntry()->SetURL(new_url); handle->GetWebContents()->NotifyNavigationStateChanged(content::INVISIBLE); } } ``` 此方法不会触发页面重新加载,仅修改地址栏显示内容,适用于需要保持页面状态的场景[^4]。 ### 3.3 注册自定义协议 `xiaozhi://` 为了让浏览器识别 `xiaozhi://` 协议并正常加载资源,需在 `ContentBrowserClient` 中注册自定义协议的 `URLLoaderFactory`。 ```cpp void MyContentBrowserClient::RegisterNonNetworkSubresourceURLLoaderFactories( content::RenderFrameHost* frame_host, NonNetworkURLoaderFactoryMap* factories) { factories->Add( frame_host, std::make_unique<XiaozhiURLLoaderFactory>(frame_host->GetProcess()->GetID())); } ``` ### 3.4 页面加载后通过 JavaScript 替换 URL(可选) 若需在页面加载完成后通过前端脚本修改地址栏显示,可以使用 `history.replaceState` 方法,仅改变地址栏内容而不触发页面重新加载。 ```javascript if (window.location.protocol === 'chrome:') { window.history.replaceState({}, '', window.location.href.replace(/^chrome:/, 'xiaozhi:')); } ``` 该脚本可通过 `content::RenderFrameObserver` 注入到页面中,确保在页面加载后自动执行[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值