yêu cầu vượt quá maxQueryStringLength đã định cấu hình khi sử dụng [Authorize]


122

nhập mô tả hình ảnh ở đây
Tôi có một trang web MVC3 trong C #, tôi có một chế độ xem cụ thể đang được cung cấp các tham số truy vấn từ một hàm JavaScript, hàm chuyển hướng đến trang web qua

window.location.href = "../ActionName?" + chuỗi truy vấn;

query_string là chuỗi tham số truy vấn động được tạo bởi hàm JavaScript.

Lý do cho sự kì quái này là đôi khi các chức năng tương tự qua URL đến một ASP.Net Webform do đó phải sử dụng ReportViewer kiểm soát, hành động thay thế là để tiết kiệm một số thông số trong trường hợp này nó đi để xem. (Có thể nói rõ hơn nếu điều đó không hợp lý)

Toàn bộ mọi thứ hoạt động tốt cho đến khi tôi giới thiệu [Ủy quyền] cho phương thức hành động. Ngắt nếu nó ở đúng vị trí, hoạt động tốt mà không cần và [Ủy quyền] hoạt động tốt trên tất cả các phương pháp khác.

Toàn bộ URL trong trường hợp này dài 966 ký tự, sau khi nghiên cứu, có vẻ như giá trị maxQueryStringLength là 2048 theo mặc định nhưng có thể bị ghi đè thành bất kỳ giá trị nào của kiểu số nguyên, vì vậy tôi đã thêm

<security>
  <requestFiltering>
    <requestLimits maxQueryString="2048"></requestLimits>
  </requestFiltering>
</security>

vào tệp cấu hình web bên dưới khóa.

Không có niềm vui ở đó, vì vậy tôi đã trở nên buồn cười và làm cho nó 4096, vẫn không có niềm vui.

Bây giờ với toàn bộ URL dài 966 ký tự, thuộc tính ủy quyền không thể thực sự thêm 1082-3130 ký tự khác, vì vậy làm cách nào để xác định lỗi thực sự là gì hoặc tại sao cài đặt không có hiệu lực.

VS2010 Pro SP1


Vui lòng thêm thông báo lỗi chi tiết mà bạn đang nhận được.
Consultellorben

Câu trả lời:


70

Khi có yêu cầu trái phép, toàn bộ yêu cầu được mã hóa URL và được thêm dưới dạng chuỗi truy vấn vào yêu cầu vào biểu mẫu ủy quyền, vì vậy tôi có thể biết điều này có thể dẫn đến sự cố ở đâu trong trường hợp của bạn.

Theo MSDN, phần tử chính xác cần sửa đổi để đặt lại maxQueryStringLength trong web.config là <httpRuntime>phần tử bên trong <system.web>phần tử, xem Phần tử httpRuntime (Lược đồ cài đặt ASP.NET) . Hãy thử sửa đổi phần tử đó.


1
Than ôi, đặt nó vào đúng vị trí dường như là một mẹo nhỏ, việc xen kẽ đủ các intellisense sẽ hướng dẫn tôi đến cùng một khóa ở vị trí ban đầu tôi đã đăng nó.
Sabre

8
Cũng cần biết rằng giá trị tối đa cho thông số này là 2097151 - lúc đầu tôi đã cố gắng sử dụng Int32.MaxValue, nhưng ngoại lệ được đưa ra trong thời gian chạy đã chỉ cho tôi sử dụng giá trị từ 0 đến 2097151.
TimDog


1
Tôi tin rằng mặc dù bạn có thể đặt giá trị tối đa cho thông số này thành 2097151, nhưng có những thông số khác ảnh hưởng đến độ dài truy vấn tối đa được chấp nhận. Tôi có một chuỗi truy vấn ngắn hơn nhiều so với mức tối đa này không được chấp nhận - nó dài 3.393 ký tự. Một truy vấn khác dài 3.200 ký tự hoạt động tốt.
markthewizard1234

@ markthewizard1234: Đồng ý: Tôi đã tăng mỏ của tôi từ 2048 lên 4096. Điều này đã có một số ảnh hưởng, vì thông báo lỗi ban đầu với 404. một cái gì đó cho chuỗi truy vấn dài không xuất hiện nữa. Nhưng bây giờ, một thông báo lỗi khác với mã 400 được trả về, cũng cho biết một chuỗi truy vấn quá dài.
HOẶC Mapper

213

Trong thư mục gốc web.configcho dự án của bạn, dưới system.webnút:

<system.web>
    <httpRuntime maxUrlLength="10999" maxQueryStringLength="2097151" />
...

Ngoài ra, tôi phải thêm cái này vào bên dưới system.webServernút nếu không tôi gặp lỗi bảo mật cho chuỗi truy vấn dài của mình:

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxUrl="10999" maxQueryString="2097151" />
      </requestFiltering>
    </security>
...

1
Việc mở ra có tạo ra bất kỳ lỗi bảo mật nghiêm trọng nào không? Có những phủ định nào khi đặt maxurl và maxquery thành 2097151?
Brian

1
Brian, đó là một câu hỏi hay - Tôi không thể thấy bất kỳ lỗi bảo mật nào trừ khi bằng cách nào đó việc đặt thứ gì đó dài hơn vào chuỗi truy vấn bên cạnh giới hạn trình duyệt có thể gây hại. Các chuỗi truy vấn độ dài tối đa của trình duyệt có được ưu tiên hơn giá trị này hay không là một câu hỏi khác mà tôi không có câu trả lời. Cảm ơn bạn đã hỏi, có thể ai đó ở đây có thể làm sáng tỏ hơn về điều này.
theJerm

Tôi đoán có một lỗ hổng DOS tiềm ẩn nhưng điều đó phụ thuộc vào cách bạn thực sự xử lý yêu cầu. Tôi đã gặp phải vấn đề này trong khi cố gắng thêm 100 người dùng trong một yêu cầu. Dù sao cũng không phải là điều tôi muốn xảy ra.
Martin

4
Điều này đã giải quyết vấn đề của tôi ngay lập tức, vì tôi đã gặp vấn đề tương tự trên một dự án MVC 4. Thêm cả hai điều trên đã giải quyết được lỗi của tôi. Cảm ơn bạn rất nhiều!!
Ed DeGagne

3
Lưu ý rằng maxQueryStringđộ dài tính bằng byte dưới dạng uint với giá trị tối đa là 4294967295 và maxQueryStringLengthlà độ dài tính bằng ký tự dưới dạng int nhưng với phạm vi 0-2097151.
marsze

5

Đối với bất kỳ ai khác có thể gặp phải vấn đề này và nó không được giải quyết bằng một trong hai tùy chọn ở trên, đây là những gì đã làm việc cho tôi.

1. Click on the website in IIS
2. Double Click on Authentication under IIS
3. Enable Anonymous Authentication

Tôi đã vô hiệu hóa điều này vì chúng tôi đang sử dụng Auth của riêng mình, nhưng điều đó dẫn đến vấn đề tương tự và câu trả lời được chấp nhận không giúp ích gì theo bất kỳ cách nào.


4

tôi gặp lỗi này khi sử dụng datatables.net

tôi đã sửa thay đổi ajax mặc định Nhận đến POST trong các thuộc tính của DataTable ()

"ajax": {
        "url": "../ControllerName/MethodJson",
        "type": "POST"
    },

Tôi cũng đang sử dụng các dữ liệu và sau khi thử các đề xuất ở trên không thành công, thủ thuật này đã thực hiện được.
AidaM
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.