CA3003: Dosya yolu ekleme güvenlik açıkları için kodu gözden geçirin

Özellik Değer
Kural Kimliği CA3003
Başlık Dosya yolu ekleme güvenlik açıkları için inceleme kodu
Kategori Güvenlik
Düzeltme bozucu ya da bozmayan olabilir Kesintisiz
.NET 10'da varsayılan olarak etkin Hayır
Geçerli diller C# ve Visual Basic

Neden

Potansiyel olarak güvenilmeyen HTTP istek girdisi, bir dosya işlemi yoluna ulaşır.

Varsayılan olarak, bu kural tüm kod tabanını analiz eder, ancak bu yapılandırılabilir.

Kural açıklaması

Web isteklerinden gelen güvenilmeyen girişlerle çalışırken, dosyaların yollarını belirtirken kullanıcı tarafından denetlenen girişi kullanmaya dikkat edin. Saldırgan istenmeyen bir dosyayı okuyarak hassas verilerin bilgilerin açığa çıkmasına neden olabilir. Ya da bir saldırgan istenmeyen bir dosyaya yazabilir ve bu da hassas verilerin yetkisiz değiştirilmesine veya sunucunun güvenliğinin tehlikeye atılmasıyla sonuçlanabilir. Yaygın bir saldırgan tekniği Yol Geçişi, hedeflenen dizinin dışındaki dosyalara erişmektir.

Bu kural, dosya işleminde bir yola ulaşan HTTP isteklerinden gelen girişleri bulmayı dener.

Not

Bu kural, derlemeler arasında verileri takip edemiyor. Örneğin, bir derleme HTTP isteği girişini okur ve bir dosyaya yazan başka bir derlemeye geçirirse, bu kural uyarı üretmez.

Not

Bu kuralın yöntem çağrıları arasında veri akışını ne kadar derin analiz edeceğine yönelik yapılandırılabilir bir sınır vardır. EditorConfig dosyasında sınırı nasıl yapılandıracağınızı öğrenmek için Çözümleyici Yapılandırması'na bakın.

İhlalleri düzeltme

  • Mümkünse, kullanıcı girişine göre dosya yollarını açıkça bilinen güvenli bir listeyle sınırlayın. Örneğin, uygulamanızın yalnızca "red.txt", "green.txt" veya "blue.txt" değerlerine erişmesi gerekiyorsa, yalnızca bu değerlere izin verin.
  • Güvenilmeyen dosya adlarını denetleyin ve adın iyi biçimlendirilmiş olduğunu doğrulayın.
  • Yolları belirtirken tam yol adlarını kullanın.
  • Yol ortamı değişkenleri gibi tehlikeli olabilecek yapılardan kaçının.
  • Yalnızca uzun dosya adlarını kabul edin ve kullanıcı kısa adlar gönderdiğinde uzun adı doğrulayın.
  • Son kullanıcı girişini geçerli karakterlerle kısıtlayın.
  • MAX_PATH uzunluğunun aşıldığı adları reddedin.
  • Dosya adlarını yorumlamadan tam anlamıyla işleyin.
  • Dosya adının bir dosyayı mı yoksa cihazı mı temsildiğini belirleyin.

Uyarıların ne zaman bastırılması gerekiyor?

Önceki bölümde açıklandığı gibi girişi doğruladıysanız, bu uyarıyı gizlemeniz sorun değil.

Kod çözümleme için konfigüre et

Bu kuralın kod tabanınızın hangi bölümlerinde çalıştırılacaklarını yapılandırmak için aşağıdaki seçenekleri kullanın.

Bu seçenekleri yalnızca bu kural için, uyguladıkları tüm kurallar için veya bu kategorideki tüm kurallar için (Güvenlik) yapılandırabilirsiniz. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.

Belirli simgeleri hariç tutma

excluded_symbol_names seçeneğini ayarlayarak türler ve yöntemler gibi belirli simgeleri analizden hariç tutabilirsiniz. Örneğin, kuralın adlı MyTypetürlerdeki herhangi bir kodda çalışmaması gerektiğini belirtmek için, projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

Not

XXXX CAXXXX bölümünü geçerli kuralın kimliğiyle değiştirin.

Seçenek değerinde izin verilen simge adı biçimleri (ile |ayrılmış):

  • Yalnızca sembol adı (içerildiği tür veya ad alanından bağımsız olarak ada sahip tüm simgeleri içerir).
  • Simgelerin dökümantasyon kimliği formatındaki tam adlar. Her sembol adı için, yöntemler için M:, türler için T:, ve ad alanları için N: gibi bir sembol türü ön eki gerekir.
  • .ctor oluşturucular ve .cctor statik oluşturucular için.

Örnekler:

Seçenek Değeri Özet
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType adlı MyTypetüm simgelerle eşleşir.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 MyType1 veya MyType2 adlı tüm simgelerle eşleşir.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) Belirtilen tam imza ile belirli bir yöntemi MyMethod eşleştirir.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) Belirli yöntemlerle MyMethod1 ve MyMethod2 ilgili tam imzalarla eşleşir.

Belirli türleri ve türetilmiş türlerini dışlama

excluded_type_names_with_derived_types seçeneğini ayarlayarak belirli türleri ve türetilmiş türlerini analizden dışlayabilirsiniz. Örneğin, kuralın adlı MyType ve türetilmiş türleri içindeki hiçbir yöntemde çalışmaması gerektiğini belirtmek için, projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

Not

XXXX CAXXXX bölümünü geçerli kuralın kimliğiyle değiştirin.

Seçenek değerinde izin verilen simge adı biçimleri (ile |ayrılmış):

  • Yalnızca tür adı (içeren tür veya ad alanına bakılmaksızın adı olan tüm türleri içerir).
  • Simgenin belge kimliği biçiminde, isteğe bağlı T: ön ek içeren tam adlar.

Örnekler:

Seçenek değeri Özet
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType Adı MyType olan tüm türleri ve türevlerini eşleştirir.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 MyType1 veya MyType2 adlı tüm türleri ve bunların türetilmiş türlerinin tamamını eşleştirir.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType Belirli bir türü MyType verilen tam adla ve türetilmiş tüm türleriyle eşleştirir.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 Belirli türler MyType1 ve MyType2 ile bunların türetilmiş tüm türleri, ilgili tam adlarla eşleşir.

Sahte kod örnekleri

Ihlal

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