Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
| Properti | Nilai |
|---|---|
| ID Aturan | CA3009 |
| Judul | Tinjau kode untuk kerentanan injeksi XML |
| Kategori | Keamanan |
| Perbaikan bersifat merusak atau tidak merusak | Tidak terputus |
| Diaktifkan secara default di .NET 10 | Tidak |
| Bahasa yang berlaku | C# dan Visual Basic |
Penyebab
Input permintaan HTTP yang berpotensi tidak tepercaya mencapai output XML mentah.
Secara default, aturan ini menganalisis seluruh codebase, tetapi ini dapat dikonfigurasi.
Deskripsi aturan
Saat bekerja dengan input yang tidak tepercaya, perhatikan serangan injeksi XML. Penyerang dapat menggunakan injeksi XML untuk menyisipkan karakter khusus ke dalam dokumen XML, membuat dokumen XML tidak valid. Atau, penyerang dapat dengan berbahaya menyisipkan simpul XML yang mereka pilih.
Aturan ini mencoba menemukan input dari permintaan HTTP yang mencapai penulisan XML mentah.
Catatan
Aturan ini tidak dapat melacak data di seluruh assembly. Misalnya, jika satu rakitan membaca input permintaan HTTP lalu meneruskannya ke rakitan lain yang menulis XML mentah, aturan ini tidak akan menghasilkan peringatan.
Catatan
Ada batas yang dapat dikonfigurasi untuk seberapa dalam aturan ini akan menganalisis aliran data di seluruh panggilan metode. Lihat Konfigurasi Penganalisis untuk mengetahui cara mengonfigurasi batas pada file EditorConfig.
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran, gunakan salah satu teknik berikut:
- Jangan tulis XML mentah. Sebagai gantinya, gunakan metode atau properti yang mengodekan XML inputnya.
- Kodekan input ke XML sebelum menulis XML mentah.
- Validasi input pemakai dengan sanitizer untuk konversi tipe data primitif dan pengodean XML.
Kapan harus menekan peringatan
Jangan mengabaikan peringatan dari aturan ini.
Contoh kode semu
Pelanggaran
Dalam contoh ini, input diset ke InnerXml properti elemen root. Mengingat input yang berisi XML yang valid, pengguna berbahaya kemudian dapat sepenuhnya mengubah dokumen. Perhatikan bahwa alice bukan lagi pengguna yang diizinkan setelah input pengguna ditambahkan ke dokumen.
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
Jika penyerang menggunakan ini untuk input: some text<allowedUser>oscar</allowedUser>, maka dokumen XML akan menjadi:
<root>some text<allowedUser>oscar</allowedUser>
</root>
Solusi
Untuk memperbaiki pelanggaran ini, atur input ke properti elemen root InnerText alih-alih dari properti InnerXml.
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
Jika penyerang menggunakan ini untuk input: some text<allowedUser>oscar</allowedUser>, maka dokumen XML akan menjadi:
<root>some text<allowedUser>oscar</allowedUser>
<allowedUser>alice</allowedUser>
</root>
Mengonfigurasi kode yang akan dianalisis
Gunakan opsi berikut untuk mengonfigurasi bagian mana dari codebase Anda yang akan menjalankan aturan ini.
Anda dapat mengonfigurasi opsi ini hanya untuk aturan ini, untuk semua aturan yang dikenakan, atau untuk semua aturan dalam kategori Keamanan yang dikenakan. Untuk informasi selengkapnya, lihat Opsi konfigurasi aturan kualitas kode.
Mengecualikan simbol tertentu
Anda dapat mengecualikan simbol tertentu, seperti jenis dan metode, dari analisis dengan mengatur opsi excluded_symbol_names. Misalnya, untuk menentukan bahwa aturan tidak boleh berjalan pada kode apa pun dalam jenis bernama MyType, tambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Catatan
Ganti bagian XXXXCAXXXX dengan ID aturan yang berlaku.
Format nama simbol yang diizinkan pada nilai opsi (dipisahkan oleh |):
- Nama simbol saja (menyertakan semua simbol dengan nama, terlepas dari jenis atau namespace yang memuatnya).
- Nama yang sepenuhnya memenuhi syarat dalam format ID dokumentasi simbol. Setiap nama simbol memerlukan awalan jenis simbol, seperti
M:untuk metode,T:untuk jenis, danN:untuk namespace. -
.ctoruntuk konstruktor dan.cctoruntuk konstruktor statik.
Contoh:
| Nilai Opsi | Ringkasan |
|---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Mencocokkan semua simbol bernama MyType. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Mencocokkan semua simbol bernama MyType1 atau MyType2. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Mencocokkan metode tertentu MyMethod dengan tanda tangan memenuhi syarat penuh yang ditentukan. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Mencocokkan metode tertentu MyMethod1 dan MyMethod2 dengan tanda tangan lengkap masing-masing. |
Mengecualikan jenis tertentu dan jenis turunannya
Anda dapat mengecualikan jenis tertentu dan jenis turunannya dari analisis dengan mengatur opsi excluded_type_names_with_derived_types. Misalnya, untuk menentukan bahwa aturan tidak boleh dijalankan pada metode apa pun dalam jenis bernama MyType dan jenis turunannya, tambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Catatan
Ganti bagian XXXXCAXXXX dengan ID aturan yang berlaku.
Format nama simbol yang diizinkan pada nilai opsi (dipisahkan oleh |):
- Nama jenis saja (mencakup semua jenis dengan nama, terlepas dari jenis atau namespace yang memuatnya).
- Nama yang sepenuhnya dikualifikasi dalam format ID dokumentasi simbol, dengan awalan
T:yang bersifat opsional.
Contoh:
| Nilai opsi | Ringkasan |
|---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Mencocokkan semua jenis bernama MyType dan semua jenis turunannya. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Mencocokkan semua jenis bernama MyType1 atau MyType2 dan semua jenis turunannya. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Mencocokkan jenis tertentu MyType dengan nama lengkap yang diberikan dan semua jenis turunannya. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Mencocokkan jenis tertentu MyType1 dan MyType2 dengan nama lengkap yang memenuhi syarat, serta semua jenis turunannya. |