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 9-ben | Nem |
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ó.
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.
Megjegyzé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.
Megjegyzé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.
- 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.
Ha az előző szakaszban leírt módon ellenőrizte a bemenetet, akkor nyugodtan letilthatja ezt a figyelmeztetést.
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.
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 MyType
tí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 ésN:
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 MyType szimbó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. |
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. |
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
.NET-visszajelzés
A(z) .NET egy nyílt forráskód projekt. Visszajelzés adásához válasszon egy hivatkozást: