CA3007: Nyílt átirányítási biztonsági rések kódjának áttekintése
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA3007 |
Cím | Nyitott átirányítá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 HTTP-válasz átirányítást ér el.
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 nyílt átirányítási biztonsági résekre. A támadók kihasználhatják a nyílt átirányítási biztonsági rést, hogy a webhelyet használva valódi URL-címet jelentessenek meg, de a gyanútlan látogatót adathalász vagy más rosszindulatú weblapra irányíthatják át.
Ez a szabály egy HTTP-átirányítási URL-címet elérő HTTP-kérések bemenetét próbálja megtalálni.
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 egy másik szerelvénynek, amely HTTP-átirányítással válaszol, 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
A nyílt átirányítási biztonsági rések megoldásának néhány módszere:
- Ne engedélyezze a felhasználóknak, hogy átirányításokat kezdeményezhessenek.
- Átirányítási forgatókönyvben ne engedélyezze a felhasználóknak az URL-cím egy részének megadását.
- Az URL-címek előre definiált "engedélyezési listájára" irányuló átirányítások korlátozása.
- Átirányítási URL-címek ellenőrzése.
- Ha lehetséges, fontolja meg egy jogi nyilatkozati oldal használatát, amikor a felhasználókat átirányítják a webhelyről.
Mikor kell letiltani a figyelmeztetéseket?
Ha tudja, hogy a bemenetet a kívánt URL-címekre korlátozta, akkor nyugodtan letilthatja 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 CA3007
// The code that's violating the rule is on this line.
#pragma warning restore CA3007
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.CA3007.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á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 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. |
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;
public partial class WebForm : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string input = Request.Form["url"];
this.Response.Redirect(input);
}
}
Imports System
Partial Public Class WebForm
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, eventArgs As EventArgs)
Dim input As String = Me.Request.Form("url")
Me.Response.Redirect(input)
End Sub
End Class
Megoldás
using System;
public partial class WebForm : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string input = Request.Form["in"];
if (String.IsNullOrWhiteSpace(input))
{
this.Response.Redirect("https://example.org/login.html");
}
}
}
Imports System
Partial Public Class WebForm
Inherits System.Web.UI.Page
Protected Sub Page_Load(sender As Object, eventArgs As EventArgs)
Dim input As String = Me.Request.Form("in")
If String.IsNullOrWhiteSpace(input) Then
Me.Response.Redirect("https://example.org/login.html")
End If
End Sub
End Class