คำขอเกิน maxQueryStringLength ที่กำหนดไว้เมื่อใช้ [Authorize]


122

ใส่คำอธิบายภาพที่นี่
ฉันมีไซต์ MVC3 ใน C # ฉันมีมุมมองเฉพาะที่ถูกป้อนพารามิเตอร์การสืบค้นจากฟังก์ชัน JavaScript ฟังก์ชันจะเปลี่ยนเส้นทางไปยังไซต์ผ่าน

window.location.href = "../ActionName?" + query_string;

query_string เป็นสตริงพารามิเตอร์เคียวรีแบบไดนามิกที่สร้างโดยฟังก์ชัน JavaScript

สาเหตุของความแปลกนี้คือบางครั้งฟังก์ชันเดียวกันจะส่ง URL ไปยังเว็บฟอร์ม ASP.Net เนื่องจากต้องใช้ตัวควบคุมReportviewerการดำเนินการทางเลือกคือการบันทึกพารามิเตอร์บางตัวในกรณีนี้ที่ส่งผ่านไปยังมุมมอง (สามารถอธิบายเพิ่มเติมได้หากไม่สมเหตุสมผล)

ทุกอย่างทำงานได้ดีจนกว่าฉันจะแนะนำ [Authorize] ให้กับวิธีการดำเนินการ หยุดทำงานถ้าอยู่ในสถานที่ทำงานได้ดีโดยไม่ต้องและ [Authorize] ทำงานได้ดีกับวิธีการอื่น ๆ ทั้งหมด

URL ทั้งหมดในกรณีนี้มีความยาว 966 ตัวอักษรหลังจากการวิจัยดูเหมือนว่าค่าmaxQueryStringLengthคือ 2048 ตามค่าเริ่มต้น แต่สามารถแทนที่ค่าใดก็ได้ของประเภทจำนวนเต็มดังนั้นสำหรับการยิ้มฉันจึงเพิ่ม

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

คีย์ไปยังไฟล์กำหนดค่าเว็บภายใต้คีย์

ไม่มีความสุขที่นั่นฉันจึงไร้สาระและทำมันเป็น 4096 แต่ก็ยังไม่มีความสุข

ขณะนี้ URL ทั้งหมดมีความยาว 966 ตัวอักษรแอตทริบิวต์ authorize จึงไม่สามารถเพิ่มอักขระ 1082-3130 อื่นได้อย่างจริงจังดังนั้นฉันจะทราบได้อย่างไรว่าข้อผิดพลาดคืออะไรหรือเหตุใดการตั้งค่าจึงไม่มีผล

VS2010 Pro SP1


โปรดเพิ่มข้อความแสดงข้อผิดพลาดโดยละเอียดที่คุณได้รับ
ปรึกษาเบ็น

คำตอบ:


70

เมื่อมีคำขอที่ไม่ได้รับอนุญาตเข้ามาคำขอทั้งหมดจะถูกเข้ารหัส URL และเพิ่มเป็นสตริงข้อความค้นหาในคำขอไปยังแบบฟอร์มการให้สิทธิ์ดังนั้นฉันจึงสามารถดูได้ว่าสิ่งนี้อาจทำให้เกิดปัญหาตามสถานการณ์ของคุณที่ใด

ตามที่ MSDN องค์ประกอบที่ถูกต้องในการปรับเปลี่ยนการตั้งค่าใหม่ maxQueryStringLength ใน web.config เป็น<httpRuntime>องค์ประกอบภายใน<system.web>องค์ประกอบดูhttpRuntime ธาตุ (ASP.NET การตั้งค่า Schema) ลองปรับเปลี่ยนองค์ประกอบนั้น


1
อนิจจาการวางไว้ในตำแหน่งที่ถูกต้องดูเหมือนจะเป็นเคล็ดลับการสอดแทรก Intellisense ที่เพียงพอจะช่วยนำทางฉันไปยังคีย์เดียวกันในตำแหน่งที่ฉันโพสต์ไว้ในตอนแรกเช่นกัน
กระบี่

8
สิ่งที่ควรทราบก็คือค่าสูงสุดสำหรับพารามิเตอร์นี้คือ 2097151 - ตอนแรกฉันพยายามใช้ Int32.MaxValue แต่ข้อยกเว้นที่เกิดขึ้นที่รันไทม์ชี้ให้ฉันใช้ค่าระหว่าง 0 ถึง 2097151
TimDog

ไม่ทำงานดูสิ่งนี้ stackoverflow.com/questions/31624710/…
Jitendra Pancholi

1
ฉันเชื่อว่าแม้ว่าคุณจะสามารถตั้งค่าสูงสุดสำหรับพารามิเตอร์นี้เป็น 2097151 แต่ก็มีพารามิเตอร์อื่น ๆ ที่ส่งผลต่อความยาวการสืบค้นสูงสุดที่ยอมรับได้ ฉันมีสตริงการสืบค้นที่สั้นกว่าค่าสูงสุดนี้ซึ่งไม่ได้รับการยอมรับมากซึ่งมีความยาว 3,393 อักขระ ข้อความค้นหาอื่นที่ยาว 3,200 อักขระใช้งานได้ดี
markthewizard1234

@ markthewizard1234: ตกลง: ฉันได้เพิ่มของฉันจากปี 2048 เป็น 4096 สิ่งนี้มีผลบางอย่างเนื่องจากข้อความแสดงข้อผิดพลาดเดิมที่มี 404 บางสิ่งสำหรับสตริงการสืบค้นที่ยาวเกินไปจะไม่ปรากฏอีกต่อไป แต่ตอนนี้ข้อผิดพลาดอีกด้วยรหัส 400 จะถูกส่งกลับยังชี้สตริงแบบสอบถามยืดเยื้อ
หรือผู้ทำแผนที่

213

ในรูทweb.configสำหรับโปรเจ็กต์ของคุณภายใต้system.webโหนด:

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

นอกจากนี้ฉันต้องเพิ่มสิ่งนี้ภายใต้system.webServerโหนดหรือฉันได้รับข้อผิดพลาดด้านความปลอดภัยสำหรับสตริงการสืบค้นแบบยาวของฉัน:

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

1
การเปิดสิ่งนี้ทำให้เกิดข้อบกพร่องด้านความปลอดภัยที่ร้ายแรงหรือไม่? มีข้อเสียอะไรบ้างในการตั้งค่า maxurl และ maxquery เป็น 2097151
Brian

1
Brian นั่นเป็นคำถามที่ดี - ฉันไม่เห็นข้อบกพร่องด้านความปลอดภัยใด ๆ เว้นแต่จะใส่สิ่งที่ยาวกว่าในสตริงการสืบค้นนอกเหนือจากขีด จำกัด ของเบราว์เซอร์อาจเป็นอันตรายได้ สตริงการสืบค้นความยาวสูงสุดของเบราว์เซอร์มีความสำคัญเหนือค่านี้เป็นอีกคำถามที่ฉันไม่มีคำตอบ ขอบคุณที่ถามว่าอาจมีใครบางคนในที่นี่สามารถให้ความกระจ่างเกี่ยวกับเรื่องนี้ได้
theJerm

ฉันเดาว่ามีช่องโหว่ของ DOS แต่ขึ้นอยู่กับว่าคุณจัดการกับคำขอนั้นอย่างไร ฉันพบปัญหานี้ขณะพยายามเพิ่มผู้ใช้ 100 คนในคำขอเดียว ไม่ใช่สิ่งที่ฉันต้องการให้เกิดขึ้นอยู่แล้ว
Martin

4
สิ่งนี้แก้ไขปัญหาของฉันได้ทันทีเนื่องจากฉันมีปัญหาเดียวกันในโครงการ MVC 4 การเพิ่มทั้งสองข้อข้างต้นแก้ไขข้อผิดพลาดของฉัน ขอบคุณมาก!!
Ed DeGagne

3
ใจที่maxQueryStringมีความยาวเป็นไบต์เป็น uint โดยมีค่าสูงสุด 4294967295 และmaxQueryStringLengthมีความยาวเป็นอักขระ int แต่มีช่วง 0-2097151
marsze

5

สำหรับใครก็ตามที่อาจพบปัญหานี้และไม่สามารถแก้ไขได้ด้วยตัวเลือกใดตัวเลือกหนึ่งข้างต้นนี่คือสิ่งที่ได้ผลสำหรับฉัน

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

ฉันปิดใช้งานสิ่งนี้เนื่องจากเราใช้ Auth ของเราเอง แต่นั่นนำไปสู่ปัญหาเดียวกันนี้และคำตอบที่ยอมรับไม่ได้ช่วย แต่อย่างใด


4

ฉันมีข้อผิดพลาดนี้เมื่อใช้ datatables.net

ฉันแก้ไขการเปลี่ยนค่าเริ่มต้น ajax Get to POST ในคุณสมบัติของ DataTable ()

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

ฉันใช้ดาต้าด้วยเช่นกันและหลังจากลองคำแนะนำข้างต้นไม่สำเร็จเคล็ดลับนี้ก็ทำได้
AidaM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.