ValidateRequest =“ false” ไม่ทำงานใน Asp.Net 4


156

ฉันมีแบบฟอร์มที่ฉันใช้ ckeditor แบบฟอร์มนี้ใช้งานได้ดีที่ Asp.Net 2.0 และ 3.5 แต่ตอนนี้มันใช้งานไม่ได้ใน Asp.Net 4+ ฉันมีคำสั่ง ValidateRequest = "false" ข้อเสนอแนะใด ๆ


มีบทความสั้น ๆ เกี่ยวกับการเรนเดอร์การตรวจสอบความถูกต้องหากใครสนใจ: การตรวจสอบความผิดพลาดใน. NET 4
Ian

มีใครบ้างโปรดแจ้งให้เราทราบว่าอะไรคือข้อเสียของการใช้ ValidationRequest = false
fc123

คำตอบ:


194

พบวิธีแก้ไขที่หน้าข้อผิดพลาด เพียงแค่ต้องการเพิ่ม requestValidationMode = "2.0"

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime requestValidationMode="2.0" />
</system.web>

ข้อมูล MSDN: คุณสมบัติ HttpRuntimeSection.RequestValidationMode


1
มันยอดเยี่ยม แต่ไม่มีใครรู้วิธีตั้งค่านี้ต่อหน้า? นอกจากนี้ฉันจะใส่ไว้ใน web.config เพื่อที่จะยังคงทำงานกับ. NET 2 ได้อย่างไร
MK

1
@MK: ฉันไม่คิดว่าจะมีหน้าคำสั่งสำหรับการตั้งค่านี้ คุณไม่สามารถทำให้มันทำงานบน. net 2 ฉันไม่คิดว่ามันจะจำเป็น เพราะคุณสามารถสร้างแอปพลิเคชันเว็บที่กำหนดเป้าหมายเฟรมเวิร์กเวอร์ชันเดียวเท่านั้น เพียงคัดลอกบรรทัดนี้ .net 4 web.config ที่ต้องการมัน ...
HasanG

2
แต่สิ่งที่มีการเปลี่ยนแปลงในการตรวจสอบสำหรับ. net 4? มีวิธีการโดยไม่เปลี่ยนโหมดการตรวจสอบหรือไม่?
Sly

4
@Sly: คุณสามารถหาคำตอบได้ที่นี่: asp.net/learn/whitepapers/aspnet4/…
HasanG

ทุกคนได้โปรดแจ้งให้เราทราบว่าทำไมในแอปพลิเคชัน asp.net 4.0 โดยใช้ requestValidationMode = "2.0" เป็นความคิดที่ดี?
fc123

102

มีวิธีเปลี่ยนการตรวจสอบกลับเป็น 2.0 สำหรับหนึ่งหน้า เพียงเพิ่มรหัสด้านล่างลงใน web.config ของคุณ:

<configuration>
    <location path="XX/YY">
        <system.web>
            <httpRuntime requestValidationMode="2.0" />
        </system.web>
    </location>

    ...
    the rest of your configuration
    ...

</configuration>

ตำแหน่งคือพา ธ ใด ๆ และขึ้นอยู่กับโหนดใด ๆ ด้านล่างโฟลเดอร์ที่คุณระบุในแผนผัง
DFTR

7
นี้เป็นทางออกที่ดีกว่าคำตอบที่ได้รับการยอมรับเพราะมันไม่ได้เป็นโปรแกรมค่อนข้างกว้างแคบขอบเขตเฉพาะที่คุณกำหนดในเส้นทางสถานที่
ชาร์ลส์เวสลีย์

5
การประกาศ <location .. > ด้านบนควรอยู่ในการประกาศ <configuration> แต่ไม่ซ้อนกันเพิ่มเติม
rbassett

1
ดูเหมือนว่าการตั้งค่าต่อหน้าจะไม่ทำงานสำหรับโครงการที่กำหนดเป้าหมาย. NET 4.6.1
Dennis T

56

ฉันรู้ว่านี้เป็นคำถามที่เก่า แต่ถ้าคุณพบปัญหานี้ใน MVC 3 แล้วคุณสามารถตกแต่งของคุณActionMethodด้วย[ValidateInput(false)]และเพียงแค่ปิดการตรวจสอบคำขอสำหรับเดียวActionMethodซึ่งเป็นประโยชน์ และคุณไม่จำเป็นต้องทำการเปลี่ยนแปลงใด ๆ กับweb.configไฟล์ดังนั้นคุณยังสามารถใช้การตรวจสอบคำขอ. NET 4 ได้ทุกที่

เช่น

[ValidateInput(false)]
public ActionMethod Edit(int id, string value)
{
    // Do your own checking of value since it could contain XSS stuff!
    return View();
}

1
@RossCooper นี้ใช้สำหรับ asp.net MVC เท่านั้น
mxmissile

28

สิ่งนี้ทำงานโดยไม่เปลี่ยนโหมดการตรวจสอบ

ที่คุณต้องใช้ผู้ช่วยจากSystem.Web.Helpers.Validation.Unvalidated System.Web.WebPages.dllมันจะส่งคืนUnvalidatedRequestValuesวัตถุที่อนุญาตให้เข้าถึงแบบฟอร์มและ QueryString โดยไม่มีการตรวจสอบความถูกต้อง

ตัวอย่างเช่น,

var queryValue = Server.UrlDecode(Request.Unvalidated("MyQueryKey"));

ทำงานได้สำหรับฉันสำหรับ MVC3 และ. NET 4


1
คุณช่วยยกตัวอย่างวิธีดึงข้อมูล queryString ด้วยวิธีนี้ได้ไหม ฉันได้รับ 'Unvalidated ไม่ใช่สมาชิกของ ... ' วัตถุทั้งหมดที่ฉันพยายามผนวกเข้าด้วย ฉันคิดว่าฉันอาจจะหายไปรวม
CodedMonkey

3
var queryValue = Server.UrlDecode (Request.Unvalidated ("MyQueryKey"));
sfuqua

1
นี่เป็นคำตอบที่ได้รับการยอมรับอย่างแน่นอน รักษาความปลอดภัยและมีความยืดหยุ่นอย่างมากเนื่องจากคุณสามารถใช้งานแบบเลือกได้
cmartin

สำหรับแบบฟอร์มบนเว็บคุณต้องแทนที่รายการในชุด QueryString เพื่อหลีกเลี่ยงข้อผิดพลาดในการตรวจสอบ - ตรวจพบค่า Request.QueryString ที่อาจเป็นอันตรายจากไคลเอ็นต์เมื่อส่งมาร์กอัป html จากการเรียกโพสต์ jquery เป็นหน้า asp.net
Michael Freidgeim

15

โปรดทราบว่าวิธีการอื่นคือการคงไว้ซึ่งพฤติกรรมการตรวจสอบความถูกต้อง 4.0 แต่เพื่อกำหนดคลาสของคุณเองที่มาจากRequestValidatorและตั้งค่า:

<httpRuntime requestValidationType="YourNamespace.YourValidator" />

(อยู่ที่ไหนYourNamespace.YourValidatorดีคุณควรจะเดาได้ ... )

วิธีนี้คุณจะได้รับประโยชน์จากพฤติกรรม 4.0s (โดยเฉพาะอย่างยิ่งการตรวจสอบความถูกต้องเกิดขึ้นก่อนหน้านี้ในการประมวลผล) ในขณะที่ยังช่วยให้คำขอที่คุณต้องการให้ผ่านผ่าน


7
นี่เป็นเรื่องดีที่จะรู้ แต่ฉันยังคิดว่าฟีเจอร์การตรวจสอบคำขอทั้งหมดของ ASP.Net นั้นเข้าใจผิด อินพุตนั้นไม่ใช่ปัญหา แต่เป็นสิ่งที่คุณทำกับมัน สามารถใช้งานได้อย่างสมบูรณ์ในการรับรหัส SQL, HTML หรือ JavaScript เป็นอินพุตในแอปของคุณตราบใดที่คุณเข้ารหัส / หนีออกมาอย่างถูกต้องก่อนที่จะส่งออกหรือเก็บไว้ในฐานข้อมูลของคุณ
Jordan Rieger

2
@JordanRieger ฉันเห็นด้วยบางส่วน OOTB อย่างน้อยก็มีข้อดีของการเริ่มต้นการรักษาความปลอดภัย (อย่าคิดว่าสิ่งใดผ่านและคุณได้รับข้อผิดพลาดมากกว่า 0wned) แต่มันเป็นเรื่องที่น่ารำคาญและพฤติกรรม pre-4.0 นั้นไม่น่ารำคาญเลย มีบางอย่างที่ความสามารถในการมีชั้นการตรวจสอบความถูกต้องที่นำมาใช้ก่อนการประมวลผลอื่นเช่นเดียวกับ requestValidationType ที่กำหนดเอง แต่การตรวจสอบจำนวนมากจำเป็นต้องเชื่อมโยงกับการประมวลผลอื่น ๆ ในทั้งหมดที่ฉันคิดว่ามันจะมากขึ้นเพื่อปกป้องผู้คนที่มีนิสัยไม่ดีจาก spl0its (แต่ไม่ทั้งหมด) กว่าเพื่อส่งเสริมนิสัยที่ดี
Jon Hanna
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.