CA3012: Regex-injektálási biztonsági rések kódjának áttekintése

Tulajdonság Érték
Szabályazonosító CA3012
Cím Regex-injektálási biztonsági rések kódjának áttekintése
Kategória Biztonság
A javítás romboló vagy nem romboló Nem törhető
Alapértelmezés szerint engedélyezve a .NET 10-ben Nem
Alkalmazandó nyelvek C# és Visual Basic

Ok

A potenciálisan nem megbízható HTTP-kérési bemenet egy reguláris kifejezésben kerül feldolgozásra.

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

Szabály leírása

Ha nem megbízható bemenettel dolgozik, ügyeljen a regex injektálási támadásokra. A támadó regex-injektálással rosszindulatúan módosíthatja a regex-kifejezést, nem várt eredményeket érhet el, vagy hogy a regex túlzott processzorhasználatot használjon, ami szolgáltatásmegtagadási támadást eredményez.

Ez a szabály egy normál kifejezést 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 felolvassa a HTTP-kérés bemenetét, majd átadja egy másik, normál kifejezést létrehozó 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.

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

A regex injekciók elleni néhány kockázatcsökkentés a következők:

  • Normál kifejezések használatakor mindig használjon egyezés-időtúllépést .
  • Kerülje a felhasználói bemeneten alapuló reguláris kifejezések használatát.
  • A speciális karaktereket hívással System.Text.RegularExpressions.Regex.Escape vagy más módszerrel távolíthatja el a felhasználói bemenetből.
  • Csak nem speciális karakterek engedélyezése a felhasználói bemenetből.

Mikor kell letiltani a figyelmeztetéseket?

Ha tudja, hogy meccs időkorlátot használ, és a felhasználói bemenet nem tartalmaz speciális karaktereket, akkor érdemes elnyomni ezt a figyelmeztetést.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

#pragma warning disable CA3012
// The code that's violating the rule is on this line.
#pragma warning restore CA3012

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

[*.{cs,vb}]
dotnet_diagnostic.CA3012.severity = none

További információ: Kódelemzési figyelmeztetések letiltása.

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ági), amelyekre vonatkoznak. További információ: Kódminőségi szabály konfigurációs beállításai.

Adott szimbólumok kizárása

A excluded_symbol_names beállítással kizárhat bizonyos szimbólumokat, például típusokat és metódusokat 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

Megjegyzés

Cserélje le a XXXXCAXXXX részét a vonatkozó szabály azonosítójára.

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 Az összes MyType1 vagy MyType2 nevű szimbólummal megegyezik.
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) Összepárosítja az adott metódusokat MyMethod1 és MyMethod2 a megfelelő teljesen minősített aláírásokkal.

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

A excluded_type_names_with_derived_types beállítás beállításával kizárhat bizonyos típusokat és azok származtatott típusait 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

Megjegyzés

Cserélje le a XXXXCAXXXX részét a vonatkozó szabály azonosítójára.

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 található teljesen minősített 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 minden olyan típusnak, amelyik vagy a MyType1 vagy a MyType2 nevet viseli, és az összes belőlük származtatott típusnak.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType Az adott MyType típust egyezteti 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 Az MyType1 és MyType2 konkrét típusokat és azoknak a teljes kvalifikált neveket, valamint az összes származtatott típust egyezteti.

Példák pszeudokódokra

Megsértés

using System;
using System.Text.RegularExpressions;

public partial class WebForm : System.Web.UI.Page
{
    public string SearchableText { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
        string findTerm = Request.Form["findTerm"];
        Match m = Regex.Match(SearchableText, "^term=" + findTerm);
    }
}
Imports System
Imports System.Text.RegularExpressions

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

    Public Property SearchableText As String

    Protected Sub Page_Load(sender As Object, e As EventArgs)
        Dim findTerm As String = Request.Form("findTerm")
        Dim m As Match = Regex.Match(SearchableText, "^term=" + findTerm)
    End Sub
End Class