ASP.NET MS11-100: làm cách nào tôi có thể thay đổi giới hạn về số lượng giá trị biểu mẫu được đăng tối đa?


196

Microsoft gần đây (12-29-2011) đã phát hành bản cập nhật để giải quyết một số lỗ hổng bảo mật nghiêm trọng trong .NET Framework. Một trong những bản sửa lỗi được MS11-100 giới thiệu tạm thời giảm nhẹ một cuộc tấn công DoS tiềm năng liên quan đến va chạm bảng băm. Nó xuất hiện sửa lỗi này phá vỡ các trang có chứa nhiều dữ liệu POST. Trong trường hợp của chúng tôi, trên các trang có danh sách hộp kiểm rất lớn. Tại sao nó lại là vấn đề?

Một số nguồn không chính thức dường như chỉ ra rằng MS11-100 đặt giới hạn 500 cho các mục sau. Tôi không thể tìm thấy một nguồn Microsoft xác nhận điều này. Tôi biết rằng View State và các tính năng khung khác ăn hết một số giới hạn này. Có bất kỳ cài đặt cấu hình nào kiểm soát giới hạn mới này không? Chúng tôi có thể chuyển sang sử dụng các hộp kiểm nhưng nó hoạt động khá tốt cho tình huống cụ thể của chúng tôi. Chúng tôi cũng muốn áp dụng bản vá vì nó bảo vệ chống lại một số điều khó chịu khác.

Nguồn không chính thức thảo luận về giới hạn 500:

Bản tin sửa lỗi vectơ tấn công DOS bằng cách cung cấp giới hạn số lượng biến có thể được gửi cho một yêu cầu POST HTTP duy nhất. Giới hạn mặc định là 500, đủ cho các ứng dụng web thông thường, nhưng vẫn đủ thấp để vô hiệu hóa cuộc tấn công như được mô tả bởi các nhà nghiên cứu bảo mật ở Đức.

EDIT: Mã nguồn với ví dụ về giới hạn (có vẻ là 1.000, không phải 500) Tạo ứng dụng MVC tiêu chuẩn và thêm mã sau vào chế độ xem chỉ mục chính:

@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>
}

Mã này đã làm việc trước khi vá. Nó không hoạt động sau. Lỗi là:

[UnlimitedOperationException: Hoạt động không hợp lệ do trạng thái hiện tại của đối tượng.]
System.Web.HttpValueCollection.Throw IfMaxHttpCollectionKeysExceeded () +82
System.Web.HttpValueCollection.FillFromEncodingBytes HttpRequest.FillInFormCollection () +307


Làm thế nào về việc thực hiện một số công việc bổ sung và đăng phần có nội dung cụ thể là 500.
OO

3
Đó là điều. Không có phần (từ Microsoft). Chỉ từ những người bình luận không chính thức mà có thể hoặc không thể biết họ đang nói về cái gì. Tôi đã đăng một liên kết và đoạn trích nào.
colithium

1
@Andrew: "danh sách đa lựa chọn" duy nhất tôi có thể nghĩ đến sẽ là ListBox với SelectionMode được đặt thành Nhiều. Điều này thực sự có thể có thể gửi nhiều giá trị. Tuy nhiên, câu hỏi đề cập đến "danh sách thả xuống". Sau đó chúng ta hãy chờ đợi bất kỳ ý kiến ​​từ tác giả câu hỏi.
Wiktor Zychla

1
Một câu hỏi gần đây về chủ đề này đã xác định rằng bản sửa lỗi giảm nhẹ DOS bằng cách giới hạn số lượng bài viết.
John Saunders

1
Xem support.microsoft.com/kb/2661403 để biết chi tiết về điều này.

Câu trả lời:


275

Hãy thử thêm cài đặt này trong web.config. Tôi vừa thử nghiệm điều này trên .NET 4.0 với một dự án ASP.NET MVC 2 và với cài đặt này, mã của bạn không bị ném:

<appSettings>
  <add key="aspnet:MaxHttpCollectionKeys" value="1001" />
</appSettings>

Điều đó sẽ hoạt động ngay bây giờ (sau khi bạn đã áp dụng bản cập nhật bảo mật) để thay đổi giới hạn.


Tôi chưa cập nhật máy của mình, vì vậy, bằng cách sử dụng Reflector, tôi đã kiểm tra lớp HttpValueCollection và nó không có ThrowIfMaxHttpCollectionKeysExceededphương thức:

nhập mô tả hình ảnh ở đây

Tôi đã cài đặt KB2656351 (cập nhật cho .NET 4.0), tải lại các hội đồng trong Reflector và phương thức xuất hiện:

nhập mô tả hình ảnh ở đây

Vì vậy, phương pháp đó chắc chắn là mới. Tôi đã sử dụng tùy chọn Tháo rời trong Reflector và từ những gì tôi có thể biết từ mã, nó sẽ kiểm tra AppSding:

if (this.Count >= AppSettings.MaxHttpCollectionKeys)
{
  throw new InvalidOperationException();
}

Nếu nó không tìm thấy giá trị trong tệp web.config, nó sẽ đặt nó thành 1000 in System.Web.Util.AppSettings.EnsureSettingsLoaded(một lớp tĩnh bên trong):

 _maxHttpCollectionKeys = 0x3e8;

Ngoài ra, Alexey Gusarov đã tweet về thiết lập này hai ngày trước:

đây là câu trả lời chính thức từ một câu hỏi và trả lời với Jonathan Ness (Giám đốc phát triển bảo mật, MSRC) và Pete Voss (Giám đốc truyền thông phản hồi của Sr, Điện toán đáng tin cậy):

Q: AppSinstall.MaxHttpCollectionKeys là tham số mới có chứa số lượng mục nhập biểu mẫu tối đa không?

A: Vâng đúng vậy.


25
Tuyệt vời. Đây là những câu trả lời khiến tôi thích stackoverflow
colithium

4
Nó thực sự hữu ích, tôi ước tôi có một tài khoản khác để tôi có thể cung cấp +2 :)
misha

1
điều này có thể được cập nhật trong applicationationhost.config cho toàn bộ máy chủ không? hoặc máy.config?
andryuha

1
Bất kỳ cách nào để kiểm soát giới hạn này ở cấp độ trên mỗi trang? (Cũng được hỏi ở đâyđây .)
Mike Guthrie

1
Một số người đã đề nghị xem xét trang web vì nó không nên chứa nhiều trường mẫu này. Nhưng chúng tôi đã có một kịch bản rất hợp lệ cho lỗi này - Giỏ hàng trong một trong các trang web Thương mại điện tử của khách hàng của chúng tôi có rất nhiều mặt hàng và chúng tôi đã gặp lỗi này khi cô ấy truy cập trang. Trong những trường hợp như vậy, ghi đè giá trị tối đa là lựa chọn tốt nhất.
Ankur-m

18

Đối với những người vẫn đang sử dụng .NET 1.1, cài đặt này không được định cấu hình qua web.config - đó là cài đặt đăng ký (mẹo mũ cho michielvoo, vì tôi chỉ phát hiện ra điều này thông qua Reflector giống như cách anh ta tìm thấy câu trả lời). Ví dụ dưới đây đặt MaxHttpCollectionKeysthành 5000 trên phiên bản 32 bit của Windows:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0]
"MaxHttpCollectionKeys"=dword:00001388

Đối với phiên bản Windows 64 bit, hãy đặt khóa bên dưới Wow6432Node:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0]
"MaxHttpCollectionKeys"=dword:00001388

Bạn có bất kỳ thông tin nào về việc 5000 có phải là giá trị an toàn hợp lý đối với cuộc tấn công DoS mà bản sửa lỗi bảo mật này được cho là để giảm thiểu không? Chúng tôi đang xem xét sử dụng cùng một giá trị 5000, nhưng tôi không thể tìm thấy bất kỳ thông tin nào về mối quan hệ giữa số lượng giá trị và thời gian CPU tiêu tốn cho mỗi yêu cầu trong một cuộc tấn công ...
Tao

4

Tôi chỉ muốn thêm 0,02 đô la của mình vào đây để mọi người thấy sự kỳ lạ.

Nếu ứng dụng của bạn đưa thông tin trang vào ASP.NET ViewState và vượt quá ngưỡng máy chủ web, bạn sẽ gặp phải vấn đề này. Thay vì áp dụng ngay vấn đề sửa lỗi web.config, bạn có thể muốn xem xét tối ưu hóa mã của mình trước tiên.

Xem nguồn và tìm kiếm hơn 1000 trường ẩn trong chế độ xem và bạn đã gặp sự cố.


Hơn 1000 trường viewstate? Không chỉ có một trường ViewState trên biểu mẫu. Giá trị là những gì tăng khi số lượng trường biểu mẫu tăng.
Ankur-m

3

ThrowIfMaxHttpCollectionKeysExceeded()cũng đã được thêm vào System.Web.HttpCookieCollection.

Có vẻ như khi HttpCookieCollection.Get()được gọi, đó là cuộc gọi nội bộ HttpCookieCollection.AddCookie(), sau đó là cuộc gọi ThrowIfMaxHttpCollectionKeysExceeded().

public HttpCookie Get(string name)
{
    HttpCookie cookie = (HttpCookie) base.BaseGet(name);
    if ((cookie == null) && (this._response != null))
    {
        cookie = new HttpCookie(name);
        this.AddCookie(cookie, true);
        this._response.OnCookieAdd(cookie);
    }
    return cookie;
}

internal void AddCookie(HttpCookie cookie, bool append)
{
    this.ThrowIfMaxHttpCollectionKeysExceeded();
    this._all = null;
    this._allKeys = null;
    if (append)
    {
        cookie.Added = true;
        base.BaseAdd(cookie.Name, cookie);
    }
    else
    {
        if (base.BaseGet(cookie.Name) != null)
        {
            cookie.Changed = true;
        }
        base.BaseSet(cookie.Name, cookie);
    }
}

Những gì chúng ta đang thấy là trong một vài giờ, trang web sẽ dần dần trở nên chậm hơn và lỗi hơn, cho đến khi nó bắt đầu ném InvalidOperationExcpetion. Sau đó chúng tôi tái chế nhóm ứng dụng để khắc phục sự cố thêm vài giờ nữa.


Giới hạn số lượng cookie là một đánh bắt tốt; Đối với sự chậm lại và sự nhàm chán mà bạn mô tả, bạn có biết liệu nó thực sự có liên quan gì đến số lượng cookie trong các yêu cầu không? Bạn đã kiểm tra các yêu cầu khách hàng bạn nhận được? (ứng dụng của bạn có chủ đích làm gì đó với số lượng lớn cookie không?)
Tao

1
Hóa ra chúng tôi đã có một CookieProvider tùy chỉnh đã lấy không chính xác một tham chiếu đơn lẻ đến bộ sưu tập Request.Cookies khi khởi động ứng dụng, sau đó trên mỗi yêu cầu tiếp theo, nó sẽ kiểm tra xem liệu có một hoặc nhiều cookie tồn tại trong bộ sưu tập cookie tĩnh không ... như bạn có thể thấy từ đoạn mã trên, .Net ADDS mặc định cookie đó nếu không tìm thấy. Vì vậy, theo thời gian, khi mỗi người dùng truy cập hệ thống, nhiều cookie khác nhau đã được thêm vào bộ sưu tập đơn lẻ này ... và vì trang web được thiết kế để hoạt động có hoặc không có cookie, lỗi này chưa bao giờ được xác định (cho đến bây giờ)
Joshua Barker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.