🚀 在 VS Code 中取得

工作區信任延伸模組指南

什麼是工作區信任?

工作區信任是一項功能,其動機來自於使用者在 VS Code 中開啟工作區時,與非預期程式碼執行相關的安全性風險。例如,考慮到語言延伸模組為了提供功能,可能會執行目前載入工作區中的程式碼。在這種情況下,使用者應該信任工作區的內容並非惡意。工作區信任將此決策集中在 VS Code 內,並支援受限模式,以防止自動程式碼執行,讓延伸模組作者不必自行處理此基礎架構。VS Code 提供靜態宣告和 API 支援,以便快速載入延伸模組,而無需在延伸模組之間重複程式碼。

新手入門

靜態宣告

在您延伸模組的 package.json 中,VS Code 支援以下新的 capabilities 屬性 untrustedWorkspaces

capabilities:
  untrustedWorkspaces:
    { supported: true } |
    { supported: false, description: string } |
    { supported: 'limited', description: string, restrictedConfigurations?: string[] }

對於 supported 屬性,接受以下值

  • true - 此延伸模組在受限模式下完全支援,因為它不需要工作區信任即可執行任何功能。它將與之前完全一樣啟用。
  • false - 此延伸模組在受限模式下不受支援,因為它在沒有工作區信任的情況下無法運作。它將保持停用狀態,直到授予工作區信任。
  • 'limited' - 此延伸模組的某些功能在受限模式下受到支援。信任敏感功能應停用,直到授予工作區信任。延伸模組可以使用 VS Code API 來隱藏或停用這些功能。工作區設定可以使用 restrictedConfigurations 屬性自動地依信任進行閘道控制。

對於 description 屬性,必須提供為何需要信任的描述,以幫助使用者了解哪些功能將被停用,或在授予或拒絕工作區信任之前他們應該檢查什麼。如果 supported 設定為 true,則會忽略此屬性。

description 屬性的值應新增至 package.nls.json,然後在 package.json 檔案中參考以取得本地化支援。

restrictedConfigurations 屬性接受組態設定 ID 的陣列。對於列出的設定,當在不受信任工作區的受限模式下時,延伸模組將不會獲得工作區定義的值。

如何支援受限模式?

為了幫助延伸模組作者了解工作區信任的範圍,以及哪些類型功能在受限模式下是安全的,以下列出一些問題供您考量。

我的延伸模組是否有主要進入點?

如果延伸模組沒有 main 進入點(例如佈景主題和語言文法),則延伸模組不需要工作區信任。延伸模組作者不需要針對此類延伸模組採取任何動作,因為無論工作區是否受信任,它們都將繼續獨立運作。

我的延伸模組是否依賴已開啟工作區中的檔案來提供功能?

這可能意味著諸如可由工作區設定的設定,或工作區中的實際程式碼之類的事物。如果延伸模組從未使用工作區的任何內容,則它可能不需要信任。否則,請查看其他問題。

我的延伸模組是否將工作區的任何內容視為程式碼?

最常見的範例是使用專案的工作區相依性,例如儲存在本機工作區中的 Node.js 模組。惡意工作區可能會簽入受損版本的模組。因此,這對使用者和延伸模組而言都是安全性風險。此外,延伸模組可能依賴 JavaScript 或其他組態檔來控制延伸模組或其他模組的行為。還有許多其他範例,例如執行已開啟的程式碼檔案以判斷其輸出來進行錯誤報告。

我的延伸模組是否使用可在工作區中定義的設定來決定程式碼執行?

您的延伸模組可能會使用設定值作為延伸模組執行的 CLI 的旗標。如果這些設定被惡意工作區覆寫,則可能會被用作針對您延伸模組的攻擊媒介。另一方面,如果設定的值僅用於偵測某些條件,那麼它可能不是安全性風險,並且不需要工作區信任。例如,延伸模組可能會檢查偏好的 Shell 設定值是 bash 還是 pwsh,以判斷要顯示哪些文件。組態(設定)章節下方提供設定指南,以協助您找到延伸模組的最佳組態。

這不是可能需要工作區信任的案例的詳盡清單。隨著我們檢閱更多延伸模組,我們將更新此清單。在考慮工作區信任時,請使用此清單來思考您的延伸模組可能正在執行的類似行為。

如果我不對我的延伸模組進行變更會怎麼樣?

如上所述,未在其 package.json 中貢獻任何內容的延伸模組將被視為不支援工作區信任。當工作區處於受限模式時,它將被停用,並且使用者將收到通知,指出某些延伸模組由於工作區信任而無法運作。此措施是對使用者而言最注重安全性的方法。即使這是預設值,但最好設定適當的值,表明作為延伸模組作者,您已努力保護使用者和您的延伸模組免受惡意工作區內容的侵害。

工作區信任 API

如上所述,使用 API 的第一步是將靜態宣告新增至您的 package.json。最簡單的載入方法是針對 supported 屬性使用 false 值。再次強調,即使您什麼都不做,這也是預設行為,但這對使用者來說是一個很好的訊號,表明您已做出審慎的選擇。在這種情況下,您的延伸模組不需要執行任何其他操作。在授予信任之前,它不會被啟動,然後您的延伸模組將知道它是在使用者同意的情況下執行的。但是,如果您的延伸模組僅針對其部分功能需要信任,則這可能不是最佳選項。

對於希望根據工作區信任來閘道控制其功能的延伸模組,它們應該針對 supported 屬性使用 'limited' 值,而 VS Code 提供以下 API

export namespace workspace {
  /**
   * When true, the user has explicitly trusted the contents of the workspace.
   */
  export const isTrusted: boolean;

  /**
   * Event that fires when the current workspace has been trusted.
   */
  export const onDidGrantWorkspaceTrust: Event<void>;
}

使用 isTrusted 屬性來判斷目前工作區是否受信任,並使用 onDidGrantWorkspaceTrust 事件來監聽何時授予工作區信任。您可以使用此 API 來封鎖特定的程式碼路徑,並在工作區受信任後執行任何必要的註冊。

VS Code 也公開了上下文鍵 isWorkspaceTrusted,以便在如下所述的 when 子句中使用。

貢獻點

命令、檢視或其他 UI

當使用者尚未信任工作區時,他們將在受限模式下運作,其有限的功能旨在瀏覽程式碼。您在受限模式下停用的任何功能都應從使用者介面中隱藏。這可以透過when 子句上下文和上下文鍵 isWorkspaceTrusted 來完成。即使命令未顯示在 UI 中,仍然可以呼叫命令,因此您應該根據延伸模組程式碼中上述 API 來封鎖執行或不註冊命令。

組態(設定)

首先,您應該檢閱您的設定,以判斷它們是否需要考慮信任。如上所述,工作區可以為您的延伸模組使用的設定定義一個值,該值可能對使用有害。如果您識別出易受攻擊的設定,則應針對 supported 屬性使用 'limited',並在 restrictedConfigurations 陣列中列出設定 ID。

當您將設定 ID 新增至 restrictedConfigurations 陣列時,VS Code 將僅在受限模式下傳回使用者定義的設定值。然後,您的延伸模組不需要進行任何額外的程式碼變更來處理設定。當授予信任時,除了工作區信任事件之外,還會觸發組態變更事件。

偵錯延伸模組

VS Code 將阻止在受限模式下進行偵錯。因此,偵錯延伸模組通常不需要要求信任,並且應該為 supported 屬性選擇 true。但是,如果您的延伸模組提供額外的功能、命令或設定,這些功能、命令或設定不屬於內建偵錯流程的一部分,則您應該使用 'limited' 並遵循上述指南。

工作提供者

與偵錯類似,VS Code 會阻止在受限模式下執行工作。如果您的延伸模組提供額外的功能、命令或設定,這些功能、命令或設定不屬於內建工作流程的一部分,則您應該使用 'limited' 並遵循上述指南。否則,您可以指定 supported: true

測試工作區信任

請參閱工作區信任使用者指南,以取得有關啟用和組態工作區信任的詳細資訊。