หลังจาก ASP.NET 1.1 ความสามารถในการตรวจสอบโดยอัตโนมัติว่ามี XSS (การโจมตีสคริปต์ข้ามไซต์) สำหรับการส่งแบบฟอร์มหรือไม่ เมื่อผู้ใช้พยายามใช้อินพุตดังกล่าวเพื่อส่งผลกระทบต่อหน้าเพื่อส่งคืนผลลัพธ์เอ็นจิ้น ASP.NET จะกระตุ้น HTTPREQUESTVALIDATIONExceptionIn โดยค่าเริ่มต้นหน้าด้วยข้อความต่อไปนี้จะถูกส่งคืน:
นี่เป็นคุณลักษณะด้านความปลอดภัยที่สำคัญมากโดย ASP.NET เนื่องจากโปรแกรมเมอร์หลายคนไม่มีความคิดเกี่ยวกับความปลอดภัยและพวกเขาก็ไม่รู้ด้วยซ้ำว่ามีการโจมตีเช่น XSS แม้แต่คนที่น้อยกว่าก็รู้ว่าจะใช้ความคิดริเริ่มเพื่อปกป้องพวกเขา asp.net ปลอดภัยโดยค่าเริ่มต้น ณ จุดนี้ สิ่งนี้ช่วยให้โปรแกรมเมอร์ที่ไม่ทราบเกี่ยวกับความปลอดภัยในการเขียนเว็บไซต์ที่มีความสามารถในการป้องกันความปลอดภัยบางอย่าง
อย่างไรก็ตามเมื่อฉัน googled ค้นหา httprequestvalidationexception หรือการร้องขอที่อาจเป็นอันตรายค่าฟอร์มถูกตรวจพบจากลูกค้าฉันรู้สึกประหลาดใจที่พบว่าการแก้ปัญหาที่คนส่วนใหญ่ให้ไว้คือการปิด การ ใช้งาน คุณสมบัตินี้ไม่ได้สนใจว่าเว็บไซต์ของโปรแกรมเมอร์ไม่ต้องการคุณสมบัตินี้หรือไม่ ฉันกลัวมากเมื่อเห็น การรับรู้ด้านความปลอดภัยควรอยู่ในใจของโปรแกรมเมอร์ทุกคน
ทำไมโปรแกรมเมอร์หลายคนต้องการห้าม Validaterequest? ไม่จำเป็นต้องพูดแบบนี้ อีกส่วนหนึ่งไม่ได้เป็นจริงที่ผู้ใช้อนุญาตให้อินพุตของอักขระที่ทำให้เกิด XSS ได้อย่างง่ายดาย แต่เกลียดการรายงานข้อผิดพลาดในรูปแบบนี้ ไม่ใช่ผู้ใช้
สำหรับโปรแกรมเมอร์ที่ต้องการจัดการข้อความแสดงข้อผิดพลาดนี้ได้ดีโดยไม่ต้องใช้ข้อความแสดงข้อผิดพลาดข้อยกเว้น ASP.NET เริ่มต้นโปรดอย่าปิดใช้งาน ValidAteRequest = FALSE
วิธีที่ถูกต้องคือการเพิ่มฟังก์ชั่น page_error () ลงในหน้าปัจจุบันของคุณเพื่อรับข้อยกเว้นทั้งหมดที่เกิดขึ้นระหว่างการประมวลผลหน้าโดยไม่ต้องประมวลผล จากนั้นให้ข้อความแสดงข้อผิดพลาดทางกฎหมายแก่ผู้ใช้ หากหน้าปัจจุบันไม่มี page_error () ข้อยกเว้นนี้จะถูกส่งไปยัง global.asax application_error () สำหรับการประมวลผลและคุณยังสามารถเขียนฟังก์ชั่นการจัดการข้อผิดพลาดข้อยกเว้นทั่วไปได้ที่นั่น หากไม่มีฟังก์ชั่นการจัดการข้อยกเว้นในทั้งสองสถานที่หน้ารายงานข้อผิดพลาดเริ่มต้นนี้จะปรากฏขึ้น
ตัวอย่างเช่นต้องใช้รหัสสั้น ๆ เพียงอย่างเดียวในการจัดการกับข้อยกเว้นนี้ เพิ่มรหัสนี้ลงในหน้ารหัสด้านหลังของหน้า:
| ต่อไปนี้เป็นตัวอย่างที่ยกมา: ProtectedVoidPage_error (ObjectSender, EventArgse) - ExceptionEx = Server.getLasterRor (); if (exishttprequestValidationException) - Response.write (โปรดป้อนสตริงทางกฎหมาย); server.clearerror (); // ถ้า clearError () ไม่ชัดเจน () ข้อยกเว้นนี้จะยังคงส่งต่อไปยัง application_error () - - |
ด้วยวิธีนี้โปรแกรมนี้สามารถสกัดกั้นข้อยกเว้น httpRequestValidationException และสามารถส่งคืนข้อความแสดงข้อผิดพลาดที่สมเหตุสมผลตามความต้องการของโปรแกรมเมอร์
รหัสนี้ง่ายมากดังนั้นฉันหวังว่าเพื่อนทุกคนที่ไม่ได้รับอนุญาตให้ป้อนอักขระเช่นผู้ใช้อย่าห้ามคุณลักษณะด้านความปลอดภัยนี้ . สามารถ.
สำหรับโปรแกรมเมอร์ที่ห้ามคุณลักษณะนี้อย่างชัดเจนพวกเขาจะต้องเข้าใจสิ่งที่พวกเขากำลังทำและต้องตรวจสอบสตริงที่ต้องกรองด้วยตนเองไม่เช่นนั้นไซต์ของคุณจะกระตุ้นการโจมตีสคริปต์ข้ามไซต์ได้อย่างง่ายดาย
หน้าเว็บที่มีตัวแก้ไขข้อความที่หลากหลายควรได้รับการจัดการอย่างไร?
หากหน้ามีการควบคุมด้วยโปรแกรมแก้ไขข้อความที่หลากหลายมันจะนำไปสู่การส่งแท็ก HTML ของคลาสอย่างหลีกเลี่ยงไม่ได้ ในกรณีนี้เราต้อง ValidateRequest = FALSE ดังนั้นจะจัดการกับความปลอดภัยได้อย่างไร?
ตามคำแนะนำของ Microsoft เราควรใช้นโยบายที่เรียกว่า นโยบายความปลอดภัยตามนโยบายที่ได้รับอนุญาตอย่างชัดเจน
ก่อนอื่นเราเข้ารหัสสตริงอินพุตด้วย httputility.htmlencode () และห้ามแท็ก HTML อย่างสมบูรณ์ในนั้น
จากนั้นเราแทนที่แท็กความปลอดภัยที่เราสนใจและถูกแทนที่ด้วยแทนที่ () ตัวอย่างเช่นหากเราต้องการมีฉลากเราจะแทนที่อย่างชัดเจน
รหัสตัวอย่างมีดังนี้:
| ต่อไปนี้เป็นตัวอย่างที่ยกมา: voidsubmitbtn_click (ObjectSender, EventArgse) - // การเข้ารหัสสตริงอินพุตเพื่อให้แท็ก HTML ทั้งหมดจะไม่ถูกต้อง StringBuildersB = NewStringBuilder ( httputility.htmlencode (htmlinputtxt.text)); // จากนั้นเราเลือกอนุญาต <b> และ <i> sb.replace (& lt; b & gt ;, <b>); sb.replace (& lt;/b & gt ;,); sb.replace (& lt; i & gt ;, <i>); sb.replace (& lt;/i & gt ;,); Response.write (sb.toString ()); - |
ด้วยวิธีนี้เราอนุญาตให้แท็ก HTML และห้ามแท็กอันตราย
ตามคำแนะนำที่จัดทำโดย Microsoft เราควรอนุญาตให้แท็ก HTML ต่อไปนี้อย่างระมัดระวังเนื่องจากแท็ก HTML เหล่านี้อาจนำไปสู่การโจมตีสคริปต์ข้ามไซต์
ต่อไปนี้เป็นตัวอย่างที่ยกมา:
|
บางทีสิ่งที่เข้าใจยากที่สุดที่นี่คือ <Img> อย่างไรก็ตามหลังจากอ่านรหัสต่อไปนี้คุณควรเข้าใจอันตราย
| ต่อไปนี้เป็นตัวอย่างที่ยกมา: <imgsrc = JavaScript: Alert ('Hello');> <imgsrc = java 
 สคริปต์: การแจ้งเตือน ('สวัสดี');> <imgsrc = java 
 สคริปต์: การแจ้งเตือน ('hello');> |
เป็นไปได้ที่จะทำให้เกิดการดำเนินการ JavaScript ผ่านแท็ก <IMG> เพื่อให้ผู้โจมตีสามารถทำสิ่งที่เขาต้องการปลอมตัว
เช่นเดียวกันสำหรับ <style>:
| ต่อไปนี้เป็นตัวอย่างที่ยกมา: <styleType = text/javascript> ... การแจ้งเตือน ('สวัสดี'); </style> |
| ต่อไปนี้เป็นตัวอย่างที่ยกมา: ข้อผิดพลาดของเซิร์ฟเวอร์ในแอปพลิเคชัน '/YourApplicationPath' ตรวจพบการร้องขอที่เป็นอันตรายค่าฟอร์มถูกตรวจพบจากลูกค้า (txtName = <b>) คำอธิบาย: การตรวจสอบความถูกต้องได้ตรวจพบค่าอินพุตของลูกค้าที่อาจเป็นอันตรายและการประมวลผลของคำขอถูกยกเลิก โดยการตั้งค่า ValidateRequest = FALSE ในคำสั่งหน้าหรือในส่วนการกำหนดค่า รายละเอียดข้อยกเว้น: System.web.httprequestValidationException: ตรวจพบค่าฟอร์มที่อาจเป็นอันตรายได้จากไคลเอนต์ (txtName = <b>) - |