ตรวจพบค่า Request.Path ที่อาจเป็นอันตรายจากไคลเอ็นต์ (*)


218

ฉันได้รับข้อผิดพลาดที่อธิบายตนเองได้ค่อนข้างดี:

ตรวจพบค่า Request.Path ที่อาจเป็นอันตรายจากไคลเอ็นต์ (*)

ปัญหานี้เกิดจาก*ใน URL คำขอ:

https://stackoverflow.com/Search/test*/0/1/10/1

URL นี้ใช้เพื่อเติมหน้าการค้นหาที่ 'test *' เป็นคำค้นหาและส่วนที่เหลือของ url เกี่ยวข้องกับตัวกรองอื่น ๆ

มีวิธีง่ายๆในการอนุญาตให้ใช้อักขระพิเศษเหล่านี้ใน URL หรือไม่? ฉันได้ลองแก้ไขweb.configแล้วเพื่อไม่เป็นประโยชน์

ฉันควรเข้ารหัส / ถอดรหัสอักขระพิเศษด้วยตนเองหรือไม่ หรือมีวิธีปฏิบัติที่ดีที่สุดสำหรับการทำเช่นนี้ฉันต้องการหลีกเลี่ยงการใช้สตริงการสืบค้น - แต่อาจเป็นตัวเลือก

แอปพลิเคชันนั้นเป็นc# asp.netแอปพลิเคชัน webforms ที่ใช้การกำหนดเส้นทางเพื่อสร้าง URL ที่ดีด้านบน


1
หน้าของคุณมีValidateRequest=falseที่ด้านบน?
Neil Knight

ฉันไม่ทราบสาเหตุที่เว็บไซต์พยายามเปลี่ยนเส้นทางภายในซึ่งสร้าง URL เช่น ' localhost /: // localhost / myWebsiteName ' ซึ่งทำให้ฉันมีข้อผิดพลาดเดียวกัน ฉันไม่รู้ว่าทำไมไปป์ไลน์ ASP.net จึงถือเป็น URL ของคำขอที่เป็นอันตราย
RBT

คำตอบ:


97

*ตัวละครที่ไม่ได้รับอนุญาตในเส้นทางของ URL แต่มีปัญหาในการใช้มันในสตริงแบบสอบถามไม่มี:

http://localhost:3286/Search/?q=test*

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

ตัวอย่างเช่นการใช้อักขระตามอำเภอใจเป็นอักขระ escape:

query = query.Replace("x", "xxx").Replace("y", "xxy").Replace("*", "xyy");

และถอดรหัส:

query = query.Replace("xyy", "*").Replace("xxy", "y").Replace("xxx", "x");

15
เกม "xxx" "xxy" "xyy" นั้นค่อนข้างฉลาด คุณอาจต้องการอธิบายรายละเอียดเกี่ยวกับเหตุผลเบื้องหลังเพื่อไม่ให้ผู้อ่านเกิดความสับสน
SimpleVar

2
คำขอคือการใช้ในPATHและไม่ได้อยู่ในการสอบถาม
Hugo Delsing

ฉันพบสถานการณ์เดียวกันกับที่หนึ่งในพารามิเตอร์ของฉันคือ URL แม้เมื่อเข้ารหัส URL อย่างถูกต้องฉันจะได้รับข้อผิดพลาดนี้ ในที่สุดฉันก็แค่ base64 เข้ารหัสพารามิเตอร์ (และถอดรหัสใน api ของฉัน) ซึ่งง่ายกว่าการพยายามคิดว่าเกิดอะไรขึ้น อาจเป็นทางเลือกที่ดีกว่าที่จะใช้รูทีนการแทนที่ของคุณเองเช่นกัน
SpokaneDJ

1
คุณไม่สามารถใช้aa<=> aและab<=> *เป็นรูปแบบการเข้ารหัสที่ง่ายขึ้นได้หรือไม่
คำเหมือน Jared

สำหรับตอนนี้สิ่งนี้ช่วยฉันด้วยขอบคุณ แต่ในเวลาที่เหมาะสมฉันต้องการตรวจสอบคำแนะนำนี้: stackoverflow.com/a/603962/1830909และฉันจะดีใจถ้าได้ยินความคิดของคุณ
QMaster

316

หากคุณใช้. NET 4.0 คุณควรอนุญาต URL เหล่านี้ผ่าน web.config

<system.web>
    <httpRuntime 
            requestPathInvalidCharacters="&lt;,&gt;,%,&amp;,:,\,?" />
</system.web>

หมายเหตุฉันเพิ่งลบเครื่องหมายดอกจัน (*) สตริงเริ่มต้นเดิมคือ:

<httpRuntime 
          requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?" />

ดูคำถามนี้สำหรับรายละเอียดเพิ่มเติม


5
มีวิธีใดที่จะทำสิ่งนี้โดยใช้แอ็ตทริบิวต์ mvc บนการดำเนินการดังนั้นฉันไม่จำเป็นต้องปิดคุณลักษณะนี้สำหรับแอปทั้งหมด? คล้ายกับคำตอบนี้ที่นี่: stackoverflow.com/a/1540976/298758
longda

4
@longda: ลองห่อด้วยองค์ประกอบ <location path = "my / path"> สำหรับ URL ที่คุณต้องการ การใช้การไตร่ตรองนั้นง่ายมากจากมุมมองของโลก แต่ฉันไม่แน่ใจเกี่ยวกับการตั้งค่าบนพื้นฐานของตัวควบคุม / แอ็คชั่น อาจเริ่มคำถาม
Dave Transom

มันไม่ได้ทำงานบนโปรเจ็กต์ ASP.net MVC การรับกระบวนการรันเพื่อกำหนดเลย์เอาต์ใน viewStart มีข้อผิดพลาดนี้: อักขระผิดกฎหมายในพา ธ
QMaster

7

สำหรับฉันฉันกำลังทำงานกับ. net 4.5.2 กับ web api 2.0 ฉันมีข้อผิดพลาดเหมือนกันฉันตั้งค่ามันเพียงแค่เพิ่ม requestPathInvalidCharacters = "" ใน RequestPathInvalidCharacters คุณต้องตั้งค่าตัวอักษรที่ไม่อนุญาต ทำให้เกิดปัญหานี้

<system.web>
     <httpRuntime targetFramework="4.5.2" requestPathInvalidCharacters="" />
     <pages  >
      <namespaces>
     ....
 </namespaces>
    </pages> 
  </system.web>

** โปรดทราบว่ามันไม่ใช่วิธีปฏิบัติที่ดีอาจเป็นการโพสต์ด้วยพารามิเตอร์นี้เนื่องจากคุณลักษณะของวัตถุนั้นดีกว่าหรือพยายามเข้ารหัสอักขระพิเศษ - หลังจากค้นหาวิธีปฏิบัติที่ดีที่สุดสำหรับการออกแบบส่วนที่เหลือฉันพบว่าในการค้นหาเรียงลำดับและการแยกหน้าเราต้องจัดการพารามิเตอร์การค้นหาเช่นนี้

/companies?search=Digital%26Mckinsey

และสิ่งนี้จะช่วยแก้ปัญหาเมื่อเราเข้ารหัส & และวางมันบน url อีกครั้งโดย% 26 ทุกวิธีบนเซิร์ฟเวอร์เราได้รับพารามิเตอร์ที่ถูกต้อง Digital & Mckinsey

ลิงค์นี้อาจช่วยในการปฏิบัติที่ดีที่สุดในการออกแบบเว็บส่วนที่เหลือ api https://hackernoon.com/restful-api-designing-guidelines-the-best-practices-60e1d954e7c9


6

คุณควรเข้ารหัสค่าเส้นทางและจากนั้น (ถ้าจำเป็น) ถอดรหัสค่าก่อนค้นหา


ขอบคุณสำหรับคำตอบของคุณ คุณหมายถึง effectivley กำลังทำสิ่งแทนที่บนสิ่งต่าง ๆ เช่น * แล้วเปลี่ยนมันกลับเมื่อคุณอ่านหรือไม่?

คุณสามารถแสดงตัวอย่างรหัสของการเข้ารหัสและถอดรหัสค่าได้หรือไม่
Ciaran Gallagher

1

สำหรับฉันเมื่อพิมพ์ url ผู้ใช้ใช้ / a แทนโดยไม่ตั้งใจ? เพื่อเริ่มพารามิเตอร์เคียวรี

เช่น:

url.com/endpoint/parameter=SomeValue&otherparameter=Another+value

ซึ่งควรจะได้รับ:

url.com/endpoint?parameter=SomeValue&otherparameter=Another+value


ใช่เหมือนกันสำหรับฉัน url.com/endpoint¶meter=SomeValue&otherparameter=AnotherValue
Bhargav Konda

0

ข้อยกเว้นนี้เกิดขึ้นในแอปพลิเคชันของฉันและค่อนข้างทำให้เข้าใจผิด

มันถูกโยนทิ้งเมื่อฉันเรียกหน้าเว็บ. aspx โดยใช้วิธีการเรียก ajax ผ่านวัตถุอาร์เรย์ JSON ลายเซ็นวิธีการเว็บเพจมีอาร์เรย์ของวัตถุ. NET ที่พิมพ์อย่างยิ่ง OrderDetails คุณสมบัติ Actual_Qty ถูกกำหนดเป็น int และคุณสมบัติ JSAL Actual_Qty ของวัตถุมี "4" (อักขระเว้นวรรค) หลังจากลบพื้นที่พิเศษแล้วการแปลงก็เป็นไปได้วิธีการเว็บเพจก็สำเร็จโดยการเรียก ajax


0

ลองตั้งค่าเซิร์ฟเวอร์ของโปรเจ็กต์เว็บให้เป็น Local IIS หากเป็น IIS Express ตรวจสอบให้แน่ใจว่า URL โครงการถูกต้องและสร้างไดเรกทอรีที่มีไวรัส


0

เมื่อจัดการกับ Uniform Resource Locator (URL) s มีบางมาตรฐานไวยากรณ์ในสถานการณ์นี้โดยเฉพาะเราจะจัดการกับตัวละครลิขสิทธิ์

มากถึงRFC 3986อักขระที่สงวนไว้อาจ (หรืออาจไม่) ถูกกำหนดเป็นตัวคั่นโดยไวยากรณ์ทั่วไปโดยแต่ละไวยากรณ์ของแต่ละโครงการ และเครื่องหมายดอกจัน (*) เป็นตัวละครที่สงวนไว้

แนวทางปฏิบัติที่ดีที่สุดคือการใช้อักขระที่ไม่ได้จองใน URL หรือคุณสามารถลองเข้ารหัสได้

ให้ขุด:


1
ข้อผิดพลาดนี้ยังเกิดขึ้นหากอักขระที่สงวนไว้ใน URL นั้นเข้ารหัสเป็นเปอร์เซ็นต์เช่น%25แทนที่จะเป็น%ดังนั้น IIS อาจส่งคืนข้อผิดพลาดนี้สำหรับ URL ที่ถูกต้องสมบูรณ์
Florian Winter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.