CA3009: Zkontrolujte ohrožení zabezpečení injektáží XML v kódu
Vlastnost | Hodnota |
---|---|
ID pravidla | CA3009 |
Název | Zkontrolujte ohrožení zabezpečení injektáží XML v kódu |
Kategorie | Zabezpečení |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 9 | No |
Příčina
Potenciálně nedůvěryhodný vstup požadavku HTTP dosáhne nezpracovaného výstupu XML.
Ve výchozím nastavení toto pravidlo analyzuje celý základ kódu, ale dá se nakonfigurovat.
Popis pravidla
Při práci s nedůvěryhodným vstupem mějte na paměti útoky prostřednictvím injektáže XML. Útočník může pomocí injektáže XML vložit speciální znaky do dokumentu XML a vytvořit tak neplatný kód XML dokumentu. Nebo útočník může zlými úmysly vložit uzly XML podle svého výběru.
Toto pravidlo se pokusí najít vstup z požadavků HTTP při dosažení nezpracovaného zápisu XML.
Poznámka:
Toto pravidlo nemůže sledovat data napříč sestaveními. Pokud například jedno sestavení přečte vstup požadavku HTTP a pak ho předá jinému sestavení, které zapisuje nezpracovaný KÓD XML, toto pravidlo nevygeneruje upozornění.
Poznámka:
Existuje konfigurovatelný limit toho, jak toto pravidlo bude analyzovat tok dat napříč voláními metod. Informace o konfiguraci limitu v souboru EditorConfig najdete v tématu Konfigurace analyzátoru.
Jak opravit porušení
Pokud chcete opravit porušení, použijte jednu z následujících technik:
- Nezapisujte nezpracovaný KÓD XML. Místo toho použijte metody nebo vlastnosti, které kódují jejich vstup XML.
- Před zápisem nezpracovaného XML kódu zakódujte vstup XML.
- Ověřte uživatelský vstup pomocí sanitizátorů pro převod primitivního typu a kódování XML.
Kdy potlačit upozornění
Nepotlačujte upozornění z tohoto pravidla.
Příklady pseudokódu
Porušení
V tomto příkladu je vstup nastaven na InnerXml vlastnost kořenového prvku. Vzhledem k tomu, že vstup obsahuje platný kód XML, může uživatel se zlými úmysly dokument zcela změnit. Všimněte si, že alice
po přidání vstupu uživatele do dokumentu už není povolený uživatel.
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
Pokud útočník použije tento vstup: some text<allowedUser>oscar</allowedUser>
, dokument XML bude:
<root>some text<allowedUser>oscar</allowedUser>
</root>
Řešení
Chcete-li toto porušení opravit, nastavte vstup na InnerText vlastnost kořenového prvku namísto InnerXml vlastnosti.
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
Pokud útočník použije tento vstup: some text<allowedUser>oscar</allowedUser>
, dokument XML bude:
<root>some text<allowedUser>oscar</allowedUser>
<allowedUser>alice</allowedUser>
</root>
Konfigurace kódu pro analýzu
Pomocí následujících možností můžete nakonfigurovat, pro které části základu kódu se má toto pravidlo spouštět.
Tyto možnosti můžete nakonfigurovat jenom pro toto pravidlo, pro všechna pravidla, která platí, nebo pro všechna pravidla v této kategorii (zabezpečení), na která platí. Další informace naleznete v tématu Možnosti konfigurace pravidla kvality kódu.
Vyloučení konkrétních symbolů
Z analýzy můžete vyloučit konkrétní symboly, jako jsou typy a metody. Pokud chcete například určit, že pravidlo by se nemělo spouštět u žádného kódu v rámci pojmenovaných MyType
typů, přidejte do souboru .editorconfig v projektu následující dvojici klíč-hodnota:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Povolené formáty názvů symbolů v hodnotě možnosti (oddělené ):|
- Pouze název symbolu (zahrnuje všechny symboly s názvem bez ohledu na typ nebo obor názvů).
- Plně kvalifikované názvy ve formátu ID dokumentace symbolu. Každý název symbolu vyžaduje předponu typu symbolu, například
M:
pro metody,T:
typy aN:
obory názvů. .ctor
pro konstruktory a.cctor
statické konstruktory.
Příklady:
Hodnota možnosti | Shrnutí |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Odpovídá všem symbolům s názvem MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Porovná všechny symboly pojmenované buď MyType1 nebo MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Odpovídá konkrétní metodě MyMethod se zadaným plně kvalifikovaným podpisem. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Odpovídá konkrétním metodám MyMethod1 a MyMethod2 příslušným plně kvalifikovaným podpisům. |
Vyloučení konkrétních typů a jejich odvozených typů
Z analýzy můžete vyloučit konkrétní typy a jejich odvozené typy. Pokud chcete například určit, že pravidlo by se nemělo spouštět u žádné metody v rámci pojmenovaných MyType
typů a jejich odvozených typů, přidejte do souboru .editorconfig v projektu následující dvojici klíč-hodnota:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Povolené formáty názvů symbolů v hodnotě možnosti (oddělené ):|
- Pouze název typu (zahrnuje všechny typy s názvem bez ohledu na typ nebo obor názvů).
- Plně kvalifikované názvy ve formátu ID dokumentace symbolu s volitelnou
T:
předponou.
Příklady:
Hodnota možnosti | Shrnutí |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Odpovídá všem pojmenovaným MyType typům a všem jejich odvozeným typům. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Odpovídá všem typům pojmenovaným buď MyType1 nebo MyType2 a všem jejich odvozeným typům. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Odpovídá určitému typu MyType s daným plně kvalifikovaným názvem a všemi jeho odvozenými typy. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Odpovídá konkrétním typům MyType1 a MyType2 příslušným plně kvalifikovaným názvům a všem jejich odvozeným typům. |