工作区信任
Visual Studio Code 非常重视安全性,并希望帮助您安全地浏览和编辑代码,无论其来源或原始作者是谁。通过“工作区信任”功能,您可以决定项目文件夹中的代码是否可以在未经您明确批准的情况下由 VS Code 和扩展程序执行。
安全的代码浏览
公共代码仓库和文件共享中有如此多的可用源代码,这真是太棒了。无论是什么编码任务或问题,很可能在某个地方已经有了很好的解决方案。同样很棒的是,有许多强大的编码工具可以帮助您理解、调试和优化代码。然而,使用开源代码和工具确实存在风险,您可能会让自己面临恶意代码执行和漏洞利用的风险。
当工作区在“受限模式”下打开时,“工作区信任”功能会阻止工作区中任何代码的自动执行,从而在处理不熟悉的代码时提供额外的安全保障。
注意:术语“工作区”和“文件夹”在 VS Code 的用户界面和文档中被广泛使用。您可以将“工作区”看作是一个由 VS Code 创建和使用的、带有额外元数据的文件夹。
受限模式
当“工作区信任”对话框弹出时,如果您选择**“不,我不信任作者”**,VS Code 将进入受限模式以防止代码执行。
工作台顶部会显示一个横幅,其中包含一个链接,您可以通过工作区信任编辑器**管理**您的文件夹。在状态栏中,您还可以看到一个徽章,表明工作区处于受限模式。
受限模式通过禁用或限制 VS Code 的几项功能(任务、调试、工作区设置和扩展)来尝试防止代码自动执行。
要查看在受限模式下禁用的功能的完整列表,您可以通过横幅中的**管理**链接或选择状态栏中的受限模式徽章来打开工作区信任编辑器。
重要提示:工作区信任无法阻止恶意扩展执行代码并忽略**受限模式**。您只应安装和运行来自您信任的知名发布者的扩展。
任务
VS Code 的任务可以运行脚本和工具二进制文件。由于任务定义是在工作区的 .vscode
文件夹中定义的,它们是仓库提交的源代码的一部分,并与该仓库的每个用户共享。如果有人创建了一个恶意任务,任何克隆了该仓库的人都可能在不知情的情况下运行它。
如果您在受限模式下尝试运行甚至枚举任务(**任务** > **运行任务**),VS Code 会显示一个提示,要求您确认信任该文件夹并继续执行任务。如果您取消对话框,VS Code 将保持在受限模式。
调试
与运行 VS Code 任务类似,调试扩展在启动调试会话时可以运行调试器二进制文件。因此,当文件夹在受限模式下打开时,调试功能也会被禁用。
如果您在受限模式下尝试启动调试会话(**调试** > **启动调试**),VS Code 会显示一个提示,要求您确认信任该文件夹并继续启动调试器。如果您取消对话框,VS Code 将保持在受限模式,并且不会启动调试会话。
工作区设置
工作区设置存储在工作区根目录的 .vscode
文件夹中,因此会被克隆该工作区仓库的任何人共享。一些设置包含可执行文件的路径(例如,linter 二进制文件),如果将其设置为指向恶意代码,可能会造成损害。因此,VS Code 在受限模式下运行时会禁用一组工作区设置。
在工作区信任编辑器中,选择“未应用的工作区设置”链接,将打开按 @tag:requireTrustedWorkspace
标签筛选的设置编辑器。
扩展
VS Code 扩展生态系统非常丰富和多样化。人们创建了各种扩展来帮助完成几乎任何编程任务或编辑器自定义。一些扩展提供完整的编程语言支持(IntelliSense、调试、代码分析),而另一些则让您可以播放音乐或拥有虚拟宠物。
大多数扩展都会代表您运行代码,并可能造成危害。一些扩展的设置如果被配置为运行意外的可执行文件,可能会导致它们恶意行事。因此,在受限模式下,默认情况下会禁用那些没有明确选择支持工作区信任的扩展。
您可以通过在工作区信任编辑器中选择**“扩展被禁用或功能受限”**链接来查看已安装扩展的状态,这会显示使用 @workspaceUnsupported
筛选器筛选后的扩展视图。
在受限模式下,未选择支持工作区信任的扩展可能会被禁用或功能受限。
在受限模式下禁用
那些没有明确表示支持在受限模式下运行的扩展会显示在**“在受限模式下禁用”**部分。如果扩展作者确定他们的扩展可能被工作区中的修改(设置或文件)滥用,他们也可以表明不希望在受限模式下被启用。
在受限模式下受限
扩展作者也可以评估其扩展的潜在安全漏洞,并声明在受限模式下运行时提供**有限**支持。此模式意味着扩展可能会禁用某些特性或功能以防止潜在的漏洞利用。
扩展可以在扩展视图的工作区信任徽章上添加自定义文本,解释在不受信任的文件夹中运行时的限制。例如,VS Code 内置的 PHP 扩展将 php.validate.executablePath 设置的使用限制在受信任的文件夹中,因为覆盖此设置可能会运行恶意程序。
您可以使用 extensions.supportUntrustedWorkspaces 设置来覆盖扩展的工作区信任支持级别,具体内容在下文的启用扩展部分有描述。
如果您尝试在受限模式下安装扩展,系统会提示您信任工作区或仅安装扩展。如果该扩展不支持工作区信任,它会被安装,但会被禁用或以功能受限的方式运行。
注意:扩展作者可以阅读工作区信任扩展指南,了解如何更新其扩展以支持工作区信任。
信任工作区
如果您信任某个项目的作者和维护者,您就可以信任该项目在您本地计算机上的文件夹。例如,信任来自知名 GitHub 组织(如 github.com/microsoft 或 github.com/docker)的仓库通常是安全的。
当您打开一个新文件夹时,初始的工作区信任提示让您能够信任该文件夹及其子文件夹。
您也可以调出工作区编辑器,并通过选择**信任**或**信任父文件夹**按钮快速切换文件夹的信任状态。
有几种方法可以调出工作区信任编辑器对话框。
在受限模式下时
- 受限模式横幅中的**管理**链接
- 受限模式状态栏项
您也可以随时使用
- 命令面板(⇧⌘P (Windows, Linux Ctrl+Shift+P))中的**Workspaces: Manage Workspace Trust**(工作区:管理工作区信任)命令
选择文件夹
当您信任一个文件夹时,它会被添加到**受信任的文件夹和工作区**列表中,该列表显示在工作区信任编辑器中。
您可以手动从此列表中添加、编辑和移除文件夹,以启用或禁用工作区信任。活动文件夹在此列表中以粗体高亮显示。
选择父文件夹
当您通过工作区信任编辑器信任一个文件夹时,您可以选择同时信任其父文件夹。这将信任应用于父文件夹及其所有子文件夹。
如果您有许多包含受信任内容的文件夹都位于同一个父文件夹下,那么信任父文件夹会很有帮助。
当您打开一个受信任父文件夹下的子文件夹时,您将不会看到通常的**“不信任”**按钮来让您返回受限模式。取而代之的是,会有一段文字提示您的文件夹因另一个文件夹而被信任。
您可以从**受信任的文件夹和工作区**列表中添加、修改和移除父文件夹条目。
文件夹配置
当您信任一个父文件夹时,所有子文件夹都会被信任,这使您能够通过仓库在磁盘上的位置来控制工作区信任。
例如,您可以将所有受信任的仓库放在一个名为“TrustedRepos”的父文件夹下,而将不熟悉的仓库放在另一个父文件夹下,例如“ForEvaluation”。您将信任“TrustedRepos”文件夹,并有选择地信任“ForEvaluation”下的文件夹。
├── TrustedRepos - Clone trusted repositories under this parent folder
└── ForEvaluation - Clone experimental or unfamiliar repositories under this parent folder
您还可以通过将仓库按特定组织分组到不同的父文件夹下来对它们进行分组和设置信任。
├── github/microsoft - Clone a specific organization's repositories under this parent folder
├── github/{myforks} - Place your forked repositories under this parent folder
└── local - Local un-published repositories
启用扩展
如果您想使用受限模式,但您最喜欢的扩展不支持工作区信任,该怎么办?这种情况可能会发生,因为某个扩展虽然有用且功能齐全,但并未得到积极维护,也未声明其工作区信任支持。为了处理这种情况,您可以使用 extensions.supportUntrustedWorkspaces 设置来覆盖扩展的信任状态。
重要提示:在覆盖扩展的工作区信任支持时要小心。扩展作者可能有充分的理由在受限模式下禁用他们的扩展。如有疑问,请联系扩展作者或查看最近的更新日志以获取更多信息。
在设置编辑器(⌘, (Windows, Linux Ctrl+,))中,您可以通过 **Extensions: Support Untrusted Workspaces** (extensions.supportUntrustedWorkspaces) 设置为单个扩展覆盖工作区信任。
选择**在 settings.json 中编辑**链接来管理扩展 ID 及其支持状态和版本的列表。您可以通过 IntelliSense 建议选择任何已安装的扩展。
下面您可以看到 Prettier 扩展在 settings.json
中的一个条目。
"extensions.supportUntrustedWorkspaces": {
"esbenp.prettier-vscode": {
"supported": true,
"version": "6.4.0"
},
},
您可以使用 supported
属性来启用或禁用工作区信任支持。version
属性指定适用的确切扩展版本,如果您想为所有版本设置状态,可以移除版本字段。
如果您想了解更多关于扩展作者如何评估和决定在受限模式下限制哪些功能的信息,可以阅读工作区信任扩展指南。
打开不受信任的文件
如果您打开一个位于受信任文件夹之外的文件,VS Code 会检测到该文件来自文件夹根目录之外的某个地方,并提示您选择继续打开文件,或在受限模式下的新窗口中打开文件。在受限模式下打开是最安全的选择,一旦您确定文件是可信的,您可以随时在原始的 VS Code 窗口中重新打开它。
如果您不希望在打开来自受信任工作区之外的文件时收到提示,可以将 security.workspace.trust.untrustedFiles 设置为 open
。您还可以将 security.workspace.trust.untrustedFiles 设置为 newWindow
,以始终在受限模式下创建新窗口。在不受信任文件对话框中勾选**为所有工作区记住我的决定**选项会将您的选择应用到 security.workspace.trust.untrustedFiles 用户设置中。
打开不受信任的文件夹
当使用包含多个文件夹的多根工作区时,如果您尝试向一个受信任的多根工作区添加一个新文件夹,系统会提示您决定是否信任该文件夹中的文件,如果选择不信任,整个工作区将切换到受限模式。
空窗口(未打开文件夹)
默认情况下,如果您打开一个新的 VS Code 窗口(实例)而没有打开任何文件夹或工作区,VS Code 会以完全信任的方式运行该窗口。所有已安装的扩展都会被启用,您可以无限制地使用空窗口。
当您打开一个文件时,系统会提示您是否要打开一个不受信任的文件,因为没有父文件夹可以作为其依据。
您可以通过使用工作区信任编辑器(在命令面板中选择**Workspaces: Manage Workspace Trust**(工作区:管理工作区信任))然后选择**“不信任”**,将空窗口切换到受限模式。该空窗口将在当前会话中保持受限模式,但如果您重启或创建新窗口,它将恢复为受信任状态。
如果您希望所有空窗口都处于受限模式,可以将 security.workspace.trust.emptyWindow 设置为 false
。
设置
以下是可用的工作区信任设置
- security.workspace.trust.enabled - 启用工作区信任功能。默认为 true。
- security.workspace.trust.startupPrompt - 是否在启动时显示工作区信任对话框。默认为每个不同的文件夹或工作区仅显示一次。
- security.workspace.trust.emptyWindow - 是否总是信任一个空窗口(未打开文件夹)。默认为 true。
- security.workspace.trust.untrustedFiles - 控制如何处理工作区中的零散文件。默认为 prompt(提示)。
- extensions.supportUntrustedWorkspaces - 覆盖扩展的工作区信任声明。值为 true 或 false。
- security.workspace.trust.banner - 控制何时显示受限模式横幅。默认为
untilDismissed
(直到关闭)。
命令行开关
您可以通过 VS Code 命令行传递 --disable-workspace-trust
来禁用工作区信任。此开关仅影响当前会话。
后续步骤
了解更多
- 工作区信任扩展指南 - 了解扩展作者如何支持工作区信任。
- 什么是 VS Code“工作区”? - 了解更多关于 VS Code“工作区”概念的详细信息。
- GitHub Repositories 扩展 - 直接在仓库上工作,无需将源代码克隆到本地计算机。
常见问题
我还能在受限模式下编辑我的源代码吗?
是的,您仍然可以在受限模式下浏览和编辑源代码。某些语言功能可能会被禁用,但文本编辑始终受支持。
我安装的扩展去哪儿了?
在受限模式下,任何不支持工作区信任的扩展都将被禁用,并且所有 UI 元素(如活动栏图标和命令)都不会显示。
您可以使用 extensions.supportUntrustedWorkspaces 设置来覆盖扩展的工作区信任支持级别,但请谨慎操作。启用扩展部分有更多详细信息。
我可以禁用工作区信任功能吗?
您可以,但不建议这样做。如果您不希望 VS Code 在打开新文件夹或仓库时检查工作区信任,您可以将 security.workspace.trust.enabled 设置为 false。之后,VS Code 的行为将与 1.57 版本发布前一样。
如何取消对文件夹/工作区的信任?
调出工作区信任编辑器(从命令面板中选择**Workspaces: Manage Workspace Trust**(工作区:管理工作区信任))并选择**“不信任”**按钮。您也可以从**受信任的文件夹和工作区**列表中移除该文件夹。
为什么我没有看到“不信任”按钮?
如果您在工作区信任对话框中没有看到**“不信任”**按钮,则该文件夹的信任级别可能是从父文件夹继承的。请检查**受信任的文件夹和工作区**列表,看是否有父文件夹启用了工作区信任。
某些工作流程,例如连接到 GitHub Codespace 或附加到正在运行的 Docker 容器,会被自动信任,因为这些是您应该已经高度信任的受管理环境。
工作区信任可以防范什么?
VS Code 的许多功能允许第三方工具和扩展自动运行,例如在保存时进行 linting 或格式化,或者当您执行某些操作(如编译代码或调试)时。一个不道德的人可能会制作一个看起来无害的项目,在您不知情的情况下运行恶意代码并损害您的本地计算机。工作区信任通过在您评估不熟悉源代码的安全性和完整性时尝试阻止代码执行,从而提供了一层额外的安全保障。