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


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&lt;allowedUser&gt;oscar&lt;/allowedUser&gt;
<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 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.