为什么声明了特定键的扩展可以访问 chrome:// 页面?
Why the extension with specific key declared can access chrome:// pages?
据我们所知,默认情况下 chrome 扩展无法访问 chrome://
页面,例如 chrome://extensions
和 chrome://settings
。 (当然我们可以更改 chrome://flags/#extensions-on-chrome-urls
标志,但是 以下问题是基于我们没有更改默认标志 )。
最近我碰巧发现ChromeVox(由chrome.google.com提供)在包括chrome://
页面在内的所有页面中都能很好地工作。我查看了这个扩展的源代码,发现只要我们在manifest.json
中为任何扩展添加下面一行,这个扩展就可以在chrome://
页面中正常运行.
"key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEGBi/oD7Yl/Y16w3+gee/95/EUpRZ2U6c+8orV5ei+3CRsBsoXI/DPGBauZ3rWQ47aQnfoG00sXigFdJA2NhNK9OgmRA2evnsRRbjYm2BG1twpaLsgQPPus3PyczbDCvhFu8k24wzFyEtxLrfxAGBseBPb9QrCz7B4k2QgxD/CwIDAQAB"
所以看起来 chrome 有类似白名单的东西允许特定的扩展打破默认限制。我对吗?是否有官方指南来澄清这种行为?
附录:
下面是一个示例扩展,你会发现使用key
,即使在chrome://extensions
页,控制台也会输出test
;但是一旦删除 key
,什么也没有发生。
manifest.json:
{
"manifest_version": 2,
"name": "Test",
"version": "1.0",
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"js": [
"content.js"
]
}
],
"key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEGBi/oD7Yl/Y16w3+gee/95/EUpRZ2U6c+8orV5ei+3CRsBsoXI/DPGBauZ3rWQ47aQnfoG00sXigFdJA2NhNK9OgmRA2evnsRRbjYm2BG1twpaLsgQPPus3PyczbDCvhFu8k24wzFyEtxLrfxAGBseBPb9QrCz7B4k2QgxD/CwIDAQAB"
}
content.js:
console.log('test');
"key"
属性 在 manifest.json 中唯一 defines the extension's ID 加密形式。
一些 Google 扩展是不公平的(?)whitelisted 在 chromium 源代码中的 ID。
在这种情况下,ChromeVox:
scripting_whitelist_.push_back(extension_misc::kChromeVoxExtensionId);
然后检查此白名单以查看扩展是否可以 运行 在 PermissionsData::CanExecuteScriptEverywhere, which is accessed in CheckRestrictedUrls 中的任何地方 我们可以看到受限制的方案:chrome://
, chrome-extension://
, chrome-debugger://
据我们所知,默认情况下 chrome 扩展无法访问 chrome://
页面,例如 chrome://extensions
和 chrome://settings
。 (当然我们可以更改 chrome://flags/#extensions-on-chrome-urls
标志,但是 以下问题是基于我们没有更改默认标志 )。
最近我碰巧发现ChromeVox(由chrome.google.com提供)在包括chrome://
页面在内的所有页面中都能很好地工作。我查看了这个扩展的源代码,发现只要我们在manifest.json
中为任何扩展添加下面一行,这个扩展就可以在chrome://
页面中正常运行.
"key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEGBi/oD7Yl/Y16w3+gee/95/EUpRZ2U6c+8orV5ei+3CRsBsoXI/DPGBauZ3rWQ47aQnfoG00sXigFdJA2NhNK9OgmRA2evnsRRbjYm2BG1twpaLsgQPPus3PyczbDCvhFu8k24wzFyEtxLrfxAGBseBPb9QrCz7B4k2QgxD/CwIDAQAB"
所以看起来 chrome 有类似白名单的东西允许特定的扩展打破默认限制。我对吗?是否有官方指南来澄清这种行为?
附录:
下面是一个示例扩展,你会发现使用key
,即使在chrome://extensions
页,控制台也会输出test
;但是一旦删除 key
,什么也没有发生。
manifest.json:
{
"manifest_version": 2,
"name": "Test",
"version": "1.0",
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"js": [
"content.js"
]
}
],
"key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEGBi/oD7Yl/Y16w3+gee/95/EUpRZ2U6c+8orV5ei+3CRsBsoXI/DPGBauZ3rWQ47aQnfoG00sXigFdJA2NhNK9OgmRA2evnsRRbjYm2BG1twpaLsgQPPus3PyczbDCvhFu8k24wzFyEtxLrfxAGBseBPb9QrCz7B4k2QgxD/CwIDAQAB"
}
content.js:
console.log('test');
"key"
属性 在 manifest.json 中唯一 defines the extension's ID 加密形式。一些 Google 扩展是不公平的(?)whitelisted 在 chromium 源代码中的 ID。
在这种情况下,ChromeVox:scripting_whitelist_.push_back(extension_misc::kChromeVoxExtensionId);
然后检查此白名单以查看扩展是否可以 运行 在 PermissionsData::CanExecuteScriptEverywhere, which is accessed in CheckRestrictedUrls 中的任何地方 我们可以看到受限制的方案:
chrome://
,chrome-extension://
,chrome-debugger://