共用方式為


CA3003:檢閱程式碼是否有檔案路徑插入式攻擊弱點

屬性
規則識別碼 CA3003
職稱 檢閱程式碼是否有檔案路徑插入式攻擊弱點
類別 安全性
修正程式是中斷或非中斷 不中斷
在 .NET 10 中預設啟用 No

原因

可能不受信任的 HTTP 要求輸入會到達檔案作業的路徑。

根據預設,此規則會分析整個程式代碼基底,但這是可設定

檔案描述

使用來自 Web 要求的不受信任輸入時,請留意在指定檔案路徑時使用使用者控制的輸入。 攻擊者可能會讀取非預期的檔案,導致敏感數據的資訊洩漏。 或者,攻擊者可能能夠寫入非預期的檔案,進而未經授權修改敏感數據或危害伺服器的安全性。 常見的攻擊者技術是 路徑周遊 ,可存取預定目錄外的檔案。

此規則會嘗試從 HTTP 要求尋找在檔案作業中到達路徑的輸入。

注意

此規則無法追蹤元件之間的數據。 例如,如果某個元件讀取 HTTP 要求輸入,然後將它傳遞至寫入檔案的另一個元件,則此規則不會產生警告。

注意

此規則在方法呼叫之間分析數據流的深度有可設定的限制。 如需如何在EditorConfig檔案中設定限制,請參閱 分析器 組態。

如何修正違規

  • 可能的話,請根據使用者輸入將檔案路徑限制為明確已知的安全清單。 例如,如果您的應用程式只需要存取 「red.txt」、「green.txt」 或 「blue.txt」 則只允許這些值。
  • 檢查不受信任的檔名,並驗證名稱的格式是否正確。
  • 指定路徑時,請使用完整路徑名稱。
  • 避免潛在的危險建構,例如路徑環境變數。
  • 只有在使用者提交簡短名稱時,才接受長檔名並驗證長名稱。
  • 將使用者輸入限制為有效的字元。
  • 拒絕超過MAX_PATH長度的名稱。
  • 以字面方式處理檔名,而不進行解譯。
  • 判斷檔名是否代表檔案或裝置。

隱藏警告的時機

如果您已如上一節所述驗證輸入,可以隱藏此警告。

設定程式代碼以分析

使用下列選項來設定程式代碼基底要執行此規則的部分。

您可以只針對此規則、套用至的所有規則,或套用至此類別的所有規則(安全性)設定這些選項。 如需詳細資訊,請參閱 程式代碼品質規則組態選項

排除特定符號

您可以藉由設定 [excluded_symbol_names] 選項,從分析中排除特定符號,例如類型和方法。 例如,若要指定規則不應該在名為 MyType的任何程式代碼上執行,請將下列機碼/值組新增至 專案中的 .editorconfig 檔案:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

注意

以適用規則的標識碼取代 XXXXCAXXXX 部分。

選項值中允許的符號名稱格式(以 |分隔):

  • 只包含符號名稱(包含名稱的所有符號,不論包含類型或命名空間為何)。
  • 符號 檔案識別碼格式的完整名稱。 每個符號名稱都需要符號種類前置詞,例如 M: 方法、 T: 類型和 N: 命名空間。
  • .ctor 用於建構函式和 .cctor 靜態建構函式。

範例:

選項值 摘要
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType 符合所有名為 MyType的符號。
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 比對名為 MyType1MyType2的所有符號。
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) 比對特定方法 MyMethod 與指定的完整簽章。
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) 比對特定方法和MyMethod1MyMethod2個別的完整簽章。

排除特定類型及其衍生類型

您可以藉由設定 [excluded_type_names_with_derived_types] 選項,從分析中排除特定類型及其衍生類型。 例如,若要指定規則不應該在具名 MyType 類型及其衍生型別內的任何方法上執行,請將下列機碼/值組新增至 專案中的 .editorconfig 檔案:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

注意

以適用規則的標識碼取代 XXXXCAXXXX 部分。

選項值中允許的符號名稱格式(以 |分隔):

  • 僅限類型名稱(包含名稱的所有類型,不論包含類型或命名空間為何)。
  • 符號 文件識別碼格式的完整名稱,具有選擇性 T: 前置詞。

範例:

選項值 摘要
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType 比對所有具名 MyType 的類型及其所有衍生型別。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 比對所有名為 MyType1MyType2 的型別,以及其所有衍生型別。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType 比對具有指定完整名稱的特定型 MyType 別及其所有衍生型別。
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 比對特定類型和MyType1MyType2個別的完整名稱,以及其所有衍生型別。

虛擬程式代碼範例

違規

using System;
using System.IO;

public partial class WebForm : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string userInput = Request.Params["UserInput"];
        // Assume the following directory structure:
        //   wwwroot\currentWebDirectory\user1.txt
        //   wwwroot\currentWebDirectory\user2.txt
        //   wwwroot\secret\allsecrets.txt
        // There is nothing wrong if the user inputs:
        //   user1.txt
        // However, if the user input is:
        //   ..\secret\allsecrets.txt
        // Then an attacker can now see all the secrets.

        // Avoid this:
        using (File.Open(userInput, FileMode.Open))
        {
            // Read a file with the name supplied by user
            // Input through request's query string and display
            // The content to the webpage.
        }
    }
}
Imports System
Imports System.IO

Partial Public Class WebForm
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, e As EventArgs)
        Dim userInput As String = Me.Request.Params("UserInput")
        ' Assume the following directory structure:
        '   wwwroot\currentWebDirectory\user1.txt
        '   wwwroot\currentWebDirectory\user2.txt
        '   wwwroot\secret\allsecrets.txt
        ' There is nothing wrong if the user inputs:
        '   user1.txt
        ' However, if the user input is:
        '   ..\secret\allsecrets.txt
        ' Then an attacker can now see all the secrets.

        ' Avoid this:
        Using File.Open(userInput, FileMode.Open)
            ' Read a file with the name supplied by user
            ' Input through request's query string and display
            ' The content to the webpage.
        End Using
    End Sub
End Class