Microsoft baru-baru ini (12-29-2011) merilis pembaruan untuk mengatasi beberapa kerentanan keamanan serius dalam .NET Framework. Salah satu perbaikan yang diperkenalkan oleh MS11-100 sementara mengurangi potensi serangan DoS yang melibatkan tabrakan tabel hash. Tampaknya perbaikan ini merusak halaman yang berisi banyak data POST. Dalam kasus kami, pada halaman yang memiliki daftar kotak centang sangat besar. Mengapa demikian?
Beberapa sumber non-resmi tampaknya menunjukkan bahwa MS11-100 menempatkan batas 500 pada item pos balik. Saya tidak dapat menemukan sumber Microsoft yang mengkonfirmasi ini. Saya tahu bahwa Lihat Status dan fitur kerangka kerja lainnya memakan sebagian dari batas ini. Apakah ada pengaturan konfigurasi yang mengontrol batas baru ini? Kami dapat beralih dari menggunakan kotak centang tetapi ini bekerja dengan baik untuk situasi khusus kami. Kami juga ingin menerapkan tambalan karena melindungi terhadap beberapa hal buruk lainnya.
Sumber tidak resmi membahas batas 500:
Buletin memperbaiki vektor serangan DOS dengan memberikan batasan jumlah variabel yang dapat diajukan untuk satu permintaan HTTP POST. Batas default adalah 500 yang seharusnya cukup untuk aplikasi web normal, tetapi masih cukup rendah untuk menetralisir serangan seperti yang dijelaskan oleh para peneliti keamanan di Jerman.
EDIT: Kode sumber dengan contoh batas (yang tampaknya 1.000, bukan 500) Buat aplikasi MVC standar dan tambahkan kode berikut ke tampilan indeks utama:
@using (Html.BeginForm())
{
<fieldset class="fields">
<p class="submit">
<input type="submit" value="Submit" />
</p>
@for (var i = 0; i < 1000; i++)
{
<div> @Html.CheckBox("cb" + i.ToString(), true) </div>
}
</fieldset>
}
Kode ini berfungsi sebelum tambalan. Itu tidak berhasil setelah itu. Kesalahannya adalah:
[InvalidOperationException: Operasi ini tidak berlaku karena keadaan saat ini objek.]
System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded () 82 System.Web.HttpValueCollection.FillFromEncodedBytes (Byte [] byte, Encoding encoding) 111
System.Web. HttpRequest.FillInFormCollection () +307
Jawaban:
Coba tambahkan pengaturan ini di web.config. Saya baru saja menguji ini pada. NET 4.0 dengan proyek ASP.NET MVC 2 dan dengan pengaturan ini kode Anda tidak melempar:
Itu seharusnya berfungsi sekarang (setelah Anda menerapkan pembaruan keamanan) untuk mengubah batas.
Saya belum memperbarui mesin saya, jadi menggunakan Reflector saya memeriksa kelas HttpValueCollection, dan tidak memiliki
ThrowIfMaxHttpCollectionKeysExceeded
metode:Saya menginstal KB2656351 (pembaruan untuk .NET 4.0), memuat ulang rakitan di Reflector dan metode muncul:
Jadi metode itu pasti baru. Saya menggunakan opsi Disassemble di Reflector, dan dari apa yang saya tahu dari kode itu memeriksa AppSetting:
Jika tidak menemukan nilai di file web.config, itu akan menetapkannya menjadi 1000 in
System.Web.Util.AppSettings.EnsureSettingsLoaded
(kelas statis internal):Juga, Alexey Gusarov tweet tentang pengaturan ini dua hari lalu:
Dan berikut ini adalah jawaban resmi dari tanya jawab dengan Jonathan Ness (Manajer Pengembangan Keamanan, MSRC) dan Pete Voss (Manajer Komunikasi Respons Sr, Komputasi yang Dapat Dipercaya):
sumber
Bagi Anda yang masih menggunakan .NET 1.1, pengaturan ini tidak dikonfigurasi melalui web.config - ini adalah pengaturan registri (ujung topi untuk michielvoo, karena saya hanya menemukan ini melalui Reflektor dengan cara yang sama ia menemukan jawabannya). Contoh di bawah ini diatur
MaxHttpCollectionKeys
ke 5000 pada Windows edisi 32-bit:Untuk edisi Windows 64-bit, atur kunci di bawah Wow6432Node:
sumber
Saya hanya ingin menambahkan $ 0,02 saya di sini untuk orang-orang melihat keanehan.
Jika aplikasi Anda menyimpan informasi halaman ke dalam ASP.NET ViewState, dan melebihi ambang batas server web, Anda akan mengalami masalah ini. Daripada menerapkan masalah perbaikan web.config langsung, Anda mungkin ingin melihat mengoptimalkan kode Anda terlebih dahulu.
Lihat Sumber, dan cari 1000+ bidang tampilan tersembunyi, dan Anda punya masalah.
sumber
ThrowIfMaxHttpCollectionKeysExceeded()
juga telah ditambahkan keSystem.Web.HttpCookieCollection
.Sepertinya ketika
HttpCookieCollection.Get()
dipanggil, itu panggilan internalHttpCookieCollection.AddCookie()
, yang kemudian memanggilThrowIfMaxHttpCollectionKeysExceeded()
.Apa yang kami lihat adalah bahwa selama beberapa jam situs web semakin lambat dan buggier, sampai mulai melempar
InvalidOperationExcpetion
. Kami kemudian mendaur ulang kumpulan aplikasi, yang memperbaiki masalah selama beberapa jam lagi.sumber