Megosztás a következőn keresztül:


CA3003: Fájlútvonal-injektálási biztonsági rések kódjának áttekintése

Tulajdonság Érték
Szabályazonosító CA3003
Cím Fájlútvonal-injektálási biztonsági rések kódjának áttekintése
Kategória Biztonság
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Nem

Ok

A potenciálisan nem megbízható HTTP-kérés bemenete eléri a fájlművelet elérési útját.

Ez a szabály alapértelmezés szerint a teljes kódbázist elemzi, de ez konfigurálható.

Szabály leírása

A webes kérésekből származó nem megbízható bemenetek használatakor ügyeljen arra, hogy a fájlok elérési útjainak megadásakor felhasználó által vezérelt bemenetet használjon. Előfordulhat, hogy a támadó képes olvasni egy nem kívánt fájlt, ami bizalmas adatok felfedését eredményezi. Vagy előfordulhat, hogy a támadó nem kívánt fájlba tud írni, ami a bizalmas adatok jogosulatlan módosítását vagy a kiszolgáló biztonságát veszélyezteti. A támadók gyakori módszere a Path Traversal, amely a kívánt könyvtáron kívüli fájlokat éri el.

Ez a szabály egy fájlművelet elérési útját elérő HTTP-kérésekből próbál bemenetet keresni.

Feljegyzés

Ez a szabály nem tudja nyomon követni az adatokat a szerelvények között. Ha például az egyik szerelvény beolvassa a HTTP-kérés bemenetét, majd átadja azt egy fájlba író másik szerelvénynek, ez a szabály nem fog figyelmeztetést eredményezni.

Feljegyzés

Konfigurálható korlátja van annak, hogy ez a szabály milyen mélyre fogja elemezni az adatfolyamokat a metódushívások között. A korlátozás Szerkesztőkonfigurációs fájlban való konfigurálásáról az Analyzer Configuration című témakörben olvashat.

Szabálysértések kijavítása

  • Ha lehetséges, korlátozza a felhasználói bemeneten alapuló fájlelérési útvonalakat egy kifejezetten ismert biztonságos listára. Ha például az alkalmazásnak csak a "red.txt", a "green.txt" vagy a "blue.txt" hozzáférést kell elérnie, csak ezeket az értékeket engedélyezze.
  • Ellenőrizze a nem megbízható fájlneveket, és ellenőrizze, hogy a név megfelelően van-e formázva.
  • Az elérési utak megadásakor használjon teljes elérési utat.
  • Kerülje a potenciálisan veszélyes szerkezeteket, például az elérési út környezeti változóit.
  • Csak akkor fogadja el a hosszú fájlneveket, és ellenőrizze a hosszú nevet, ha a felhasználó rövid neveket küld be.
  • A végfelhasználói bevitel korlátozása érvényes karakterekre.
  • Elveti azokat a neveket, ahol MAX_PATH hossz túllépve van.
  • A fájlnevek szó szerint, értelmezés nélkül kezelhetők.
  • Határozza meg, hogy a fájlnév egy fájlt vagy eszközt jelöl-e.

Mikor kell letiltani a figyelmeztetéseket?

Ha az előző szakaszban leírt módon ellenőrizte a bemenetet, akkor nyugodtan letilthatja ezt a figyelmeztetést.

Kód konfigurálása elemzéshez

A következő beállítások segítségével konfigurálhatja, hogy a kódbázis mely részein futtassa ezt a szabályt.

Ezeket a beállításokat konfigurálhatja csak erre a szabályra, az összes szabályra, vagy az ebben a kategóriában szereplő összes szabályra (Biztonság), amelyekre vonatkozik. További információ: Kódminőségi szabály konfigurációs beállításai.

Adott szimbólumok kizárása

Bizonyos szimbólumokat, például típusokat és metódusokat kizárhat az elemzésből. Ha például meg szeretné adni, hogy a szabály ne fusson a nevesített MyTypetípusok egyikén sem, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

Engedélyezett szimbólumnévformátumok a beállításértékben (a következővel |elválasztva):

  • Csak szimbólumnév (a névvel ellátott összes szimbólumot tartalmazza, függetlenül attól, hogy milyen típusú vagy névtérrel rendelkezik).
  • A szimbólum dokumentációazonosító-formátumában szereplő teljes nevek. Minden szimbólumnévhez szimbólum típusú előtag szükséges, például M: metódusokhoz, T: típusokhoz és N: névterekhez.
  • .ctor konstruktorok és .cctor statikus konstruktorok számára.

Példák:

Beállítás értéke Összegzés
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType Megegyezik az összes elnevezett MyTypeszimbólummal.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 Megegyezik az összes elnevezett MyType1 szimbólummal vagy MyType2.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) Megfelel a megadott metódusnak MyMethod a megadott teljes jogosultsággal rendelkező aláírással.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) Egyezik az adott metódusokkal MyMethod1 és MyMethod2 a megfelelő, teljes mértékben minősített aláírásokkal.

Adott típusok és származtatott típusok kizárása

Bizonyos típusokat és azok származtatott típusait kizárhatja az elemzésből. Ha például meg szeretné adni, hogy a szabály ne fusson a nevesített MyType és származtatott típusok egyik metódusán sem, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

Engedélyezett szimbólumnévformátumok a beállításértékben (a következővel |elválasztva):

  • Csak típusnév (a névvel rendelkező összes típust tartalmazza, függetlenül attól, hogy milyen típust vagy névteret tartalmaz).
  • A szimbólum dokumentációazonosító-formátumában szereplő teljes nevek opcionális T: előtaggal.

Példák:

Beállítás értéke Összegzés
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType Megfelel az összes névvel ellátott MyType típusnak és az összes származtatott típusnak.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 Megfelel az összes névvel ellátott MyType1 típusnak, vagy MyType2 az összes származtatott típusnak.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType Egyezik MyType a megadott teljes névvel és az összes származtatott típusával.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 Egyezik az adott típusokkal MyType1 és MyType2 a megfelelő teljes névvel, valamint az összes származtatott típussal.

Példák pszeudokódokra

Megsértése

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