CA3009: Az XML-injektálási biztonsági rések kódjának áttekintése
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA3009 |
Cím | Xml-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 nyers XML-kimenetet é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 az XML-injektálási támadásokra. A támadók XML-injektálás használatával speciális karaktereket szúrhatnak be egy XML-dokumentumba, így a dokumentum érvénytelen XML-fájlként használható. Vagy egy támadó rosszindulatúan szúrhat be az általuk választott XML-csomópontokat.
Ez a szabály nyers XML-írást 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 egy másik, nyers XML-t író 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
A szabálysértés kijavításához használja az alábbi technikák egyikét:
- Ne írjon nyers XML-t. Ehelyett olyan metódusokat vagy tulajdonságokat használjon, amelyek XML-kódolással kódolják a bemenetüket.
- XML-kódolás a nyers XML írása előtt.
- Ellenőrizze a felhasználói bemenetet fertőtlenítőkkel a primitív típusátalakításhoz és az XML-kódoláshoz.
Mikor kell letiltani a figyelmeztetéseket?
Ne tiltsa le a szabály figyelmeztetéseit.
Példák pszeudokódokra
Megsértése
Ebben a példában a bemenet a InnerXml gyökérelem tulajdonságára van állítva. Az érvényes XML-t tartalmazó bemenetek miatt a rosszindulatú felhasználók ezután teljesen megváltoztathatják a dokumentumot. Figyelje meg, hogy alice
már nem engedélyezett felhasználó, miután hozzáadta a felhasználói bemenetet a dokumentumhoz.
protected void Page_Load(object sender, EventArgs e)
{
XmlDocument d = new XmlDocument();
XmlElement root = d.CreateElement("root");
d.AppendChild(root);
XmlElement allowedUser = d.CreateElement("allowedUser");
root.AppendChild(allowedUser);
allowedUser.InnerXml = "alice";
string input = Request.Form["in"];
root.InnerXml = input;
}
Sub Page_Load(sender As Object, e As EventArgs)
Dim d As XmlDocument = New XmlDocument()
Dim root As XmlElement = d.CreateElement("root")
d.AppendChild(root)
Dim allowedUser As XmlElement = d.CreateElement("allowedUser")
root.AppendChild(allowedUser)
allowedUser.InnerXml = "alice"
Dim input As String = Request.Form("in")
root.InnerXml = input
End Sub
Ha egy támadó ezt használja a bemenethez: some text<allowedUser>oscar</allowedUser>
akkor az XML-dokumentum a következő lesz:
<root>some text<allowedUser>oscar</allowedUser>
</root>
Megoldás
A szabálysértés kijavításához állítsa a bemenetet a InnerText gyökérelem tulajdonságára a InnerXml tulajdonság helyett.
protected void Page_Load(object sender, EventArgs e)
{
XmlDocument d = new XmlDocument();
XmlElement root = d.CreateElement("root");
d.AppendChild(root);
XmlElement allowedUser = d.CreateElement("allowedUser");
root.AppendChild(allowedUser);
allowedUser.InnerText = "alice";
string input = Request.Form["in"];
root.InnerText = input;
}
Sub Page_Load(sender As Object, e As EventArgs)
Dim d As XmlDocument = New XmlDocument()
Dim root As XmlElement = d.CreateElement("root")
d.AppendChild(root)
Dim allowedUser As XmlElement = d.CreateElement("allowedUser")
root.AppendChild(allowedUser)
allowedUser.InnerText = "alice"
Dim input As String = Request.Form("in")
root.InnerText = input
End Sub
Ha egy támadó ezt használja a bemenethez: some text<allowedUser>oscar</allowedUser>
akkor az XML-dokumentum a következő lesz:
<root>some text<allowedUser>oscar</allowedUser>
<allowedUser>alice</allowedUser>
</root>
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. |