CA3009: XML ekleme güvenlik açıkları için kodu gözden geçirme

Özellik Değer
Kural Kimliği CA3009
Başlık XML ekleme güvenlik açıkları için inceleme kodu
Kategori Güvenlik
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Hayır

Neden

Güvenilmeyen http isteği girişi ham XML çıkışına ulaşır.

Varsayılan olarak, bu kural tüm kod tabanını analiz eder, ancak bu yapılandırılabilir.

Kural açıklaması

Güvenilmeyen girişlerle çalışırken XML ekleme saldırılarına dikkat edin. Saldırgan, XML belgesine özel karakterler eklemek için XML ekleme özelliğini kullanarak belgeyi geçersiz XML yapabilir. Ya da bir saldırgan kendi seçtiği XML düğümlerini kötü amaçlı olarak ekleyebilir.

Bu kural, ham XML yazma işlemine ulaşan HTTP isteklerinden gelen girişleri bulmayı dener.

Not

Bu kural, derlemeler arasında verileri izleyemiyor. Örneğin, bir derleme HTTP isteği girişini okur ve sonra ham XML yazan başka bir derlemeye geçirirse, bu kural uyarı üretmez.

Not

Bu kuralın yöntem çağrıları arasında veri akışını ne kadar derin analiz edeceğine yönelik yapılandırılabilir bir sınır vardır. EditorConfig dosyasında sınırı yapılandırma hakkında bilgi için bkz . Çözümleyici Yapılandırması.

İhlalleri düzeltme

Bir ihlali düzeltmek için aşağıdaki tekniklerden birini kullanın:

  • Ham XML yazmayın. Bunun yerine, XML ile girişlerini kodlayan yöntemleri veya özellikleri kullanın.
  • Ham XML yazmadan önce XML kodlama girişi.
  • İlkel tür dönüştürme ve XML kodlaması için dezenfektanları kullanarak kullanıcı girişini doğrulayın.

Uyarıların ne zaman bastırılması gerekiyor?

Bu kuraldan gelen uyarıları gizlemeyin.

Sahte kod örnekleri

Ihlal

Bu örnekte, giriş kök öğesinin InnerXml özelliğine ayarlanır. Geçerli XML içeren girişler göz önüne alındığında, kötü amaçlı bir kullanıcı belgeyi tamamen değiştirebilir. alice Belgeye kullanıcı girişi eklendikten sonra artık izin verilen bir kullanıcı olmadığına dikkat edin.

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

Bir saldırgan giriş için bunu kullanırsa, some text<allowedUser>oscar</allowedUser>XML belgesi şöyle olur:

<root>some text<allowedUser>oscar</allowedUser>
</root>

Çözüm

Bu ihlali düzeltmek için girişi InnerText özelliği yerine kök öğesinin özelliğine InnerXml ayarlayın.

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

Bir saldırgan giriş için bunu kullanırsa, some text<allowedUser>oscar</allowedUser>XML belgesi şöyle olur:

<root>some text&lt;allowedUser&gt;oscar&lt;/allowedUser&gt;
<allowedUser>alice</allowedUser>
</root>

Çözümlemek için kod yapılandırma

Bu kuralın kod tabanınızın hangi bölümlerinde çalıştırılacaklarını yapılandırmak için aşağıdaki seçenekleri kullanın.

Bu seçenekleri yalnızca bu kural, geçerli olduğu tüm kurallar veya bu kategorideki (Güvenlik) tüm kurallar için yapılandırabilirsiniz. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.

Belirli simgeleri hariç tutma

Türler ve yöntemler gibi belirli simgeleri analizden hariç tutabilirsiniz. Örneğin, kuralın adlı MyTypetürlerdeki herhangi bir kodda çalışmaması gerektiğini belirtmek için, projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

Seçenek değerinde izin verilen simge adı biçimleri (ile |ayrılmış):

  • Yalnızca sembol adı (içeren tür veya ad alanı ne olursa olsun, ada sahip tüm simgeleri içerir).
  • Simgenin belge kimliği biçimindeki tam adlar. Her simge adı için yöntemlerT:, türler ve N: ad alanları gibi M: bir sembol türü ön eki gerekir.
  • .ctor oluşturucular ve .cctor statik oluşturucular için.

Örnekler:

Seçenek Değeri Özet
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType adlı MyTypetüm simgelerle eşleşir.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 veya MyType2adlı MyType1 tüm simgelerle eşleşir.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) Belirtilen tam imza ile belirli bir yöntemi MyMethod eşleştirir.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) Belirli yöntemlerle MyMethod1 ve MyMethod2 ilgili tam imzalarla eşleşir.

Belirli türleri ve türetilmiş türlerini dışlama

Belirli türleri ve türetilmiş türlerini analizden dışlayabilirsiniz. Örneğin, kuralın adlı MyType ve türetilmiş türleri içindeki hiçbir yöntemde çalışmaması gerektiğini belirtmek için, projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

Seçenek değerinde izin verilen simge adı biçimleri (ile |ayrılmış):

  • Yalnızca tür adı (içeren tür veya ad alanına bakılmaksızın adı olan tüm türleri içerir).
  • Simgenin belge kimliği biçiminde, isteğe bağlı T: ön ek içeren tam adlar.

Örnekler:

Seçenek Değeri Özet
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType Adlı MyType tüm türleri ve türetilmiş türlerinin tümünü eşleştirir.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 veya MyType2 adlı MyType1 tüm türleri ve türetilmiş türlerinin tümünü eşleştirir.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType Belirli bir türü MyType verilen tam adla ve türetilmiş tüm türleriyle eşleştirir.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 Belirli türleri MyType1 ve MyType2 ilgili tam adlarla ve bunların türetilmiş tüm türleriyle eşleşir.