เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ · URL ตัวเข้ารหัสและตัวถอดรหัส
URIError: URI มีรูปแบบไม่ถูกต้อง - เหตุใด decodeURIComponent จึงพ่นและวิธีแก้ไข
· มันทำงานอย่างไร
การเข้ารหัส URL javascript การจัดการข้อผิดพลาด
decodeURIComponent พ่นเมื่อเครื่องหมายเปอร์เซ็นต์ไม่ตามด้วยเลขฐานสิบหกสองหลัก หรือเมื่อไบต์ที่ถอดรหัสไม่ถูกต้อง UTF-8 โพสต์นี้จะแสดงอินพุตที่ทริกเกอร์และวิธีถอดรหัสในเชิงรับ
เครื่องหมายเปอร์เซ็นต์ที่ขัดข้อง - เหตุใด "100% off" จึงแตก decodeURIComponent
แบบฟอร์มรวบรวมรหัสส่วนลด "100% off" JavaScript ส่งผ่านสิ่งนี้เพื่อถอดรหัส URIComponent ในตัวถอดรหัส URL ฟังก์ชันส่ง URIError: URI มีรูปแบบไม่ถูกต้อง เครื่องหมายเปอร์เซ็นต์ไม่ตามด้วยเลขฐานสิบหกสองหลัก สิ่งนี้ละเมิดกฎการเข้ารหัสเปอร์เซ็นต์โดยสิ้นเชิง decodeURIComponent คาดหวังทุก % เพื่อเริ่มต้นแฝดเช่น %20 หรือ %C3 % เดียวคือข้อผิดพลาดทางไวยากรณ์ที่หยุดการดำเนินการทันทีและทำให้เกิดข้อผิดพลาด
การตรวจจับข้อผิดพลาดนี้อย่างปลอดภัยจะช่วยป้องกันแอปพลิเคชันล่มโดยสิ้นเชิง URL มาจากการป้อนข้อมูลของผู้ใช้ การเปลี่ยนเส้นทาง รหัส QR และอีเมล การพิมพ์ผิดเกิดขึ้นบ่อยครั้ง รายงานข้อขัดข้องด้วย URIError จะบอกคุณว่าควรตรวจสอบที่ใดอย่างรวดเร็ว การถอดรหัสเชิงป้องกันช่วยให้แอปพลิเคชันทำงานต่อไป และบันทึกข้อผิดพลาดจะมีประโยชน์สำหรับการดีบัก
ความล้มเหลวสองประเภท - การหลีกเลขฐานสิบหกผิดรูปแบบและลำดับไบต์ UTF-8 ที่ไม่ถูกต้อง
decodeURIComponent พ่นในสองสถานการณ์ ประการแรก: ลำดับการหลีกมีรูปแบบไม่ถูกต้อง เปอร์เซ็นต์ไม่ตามด้วยเลขฐานสิบหกสองหลัก (0-9, A-F, a-f) ตัวอย่าง: %ZZ, %2, %2g ประการที่สอง: แฝดที่ถูกต้องเช่น %E9 ถอดรหัสเป็น UTF-8 ไบต์ที่ไม่ถูกต้อง ประการแรกคือข้อผิดพลาดของรูปแบบ ประการที่สองคือข้อผิดพลาดทางความหมาย ทั้งโยนและหยุดการดำเนินการทันที
UTF-8 มีกฎที่เข้มงวดเกี่ยวกับลำดับไบต์ ไบต์ 0x80–0xFF ปรากฏเฉพาะในลำดับแบบหลายไบต์เท่านั้น %E9 เดี่ยวไม่สามารถใช้ UTF-8 เพียงอย่างเดียวได้ ไบต์ที่ถูกละเลยนี้จะทำให้เกิดข้อผิดพลาด ข้อผิดพลาดของรูปแบบเห็นได้ชัด ข้อผิดพลาดทางความหมายนั้นละเอียดอ่อนแต่ก็จริงไม่แพ้กัน ทั้งสองกรณีจำเป็นต้องมีการจัดการ try/catch ในรหัสที่ใช้งานจริง
การเข้ารหัสแบบไบต์เดี่ยวแบบเดิม — เมื่อ %E9 ส่งเพียงอย่างเดียว แต่ %C3%A9 ยังคงอยู่
ความสับสนเกิดจากประวัติมาตรฐานเว็บ หน้าเก่าใช้ภาษาละติน-1 แทน UTF-8 ในภาษาละติน-1, %E9 แทน é เบราว์เซอร์สมัยใหม่ใช้ UTF-8 โดยเฉพาะ UTF-8 เข้ารหัสéเป็น %C3%A9 ตัวถอดรหัสสมัยใหม่คาดหวัง UTF-8 และปฏิเสธ %E9 ว่ามีรูปแบบไม่ถูกต้อง นี่เป็นพฤติกรรมที่ถูกต้อง ข้อผิดพลาดบ่งบอกถึงปัญหากับแหล่งข้อมูล
ฉันทามติสมัยใหม่: UTF-8 ทุกที่ URL มาตรฐานระบุ UTF-8 เบราว์เซอร์ปัจจุบันทั้งหมดใช้ UTF-8 หากคุณพบ %E9 จากระบบเก่า ให้ตรวจจับข้อผิดพลาดและย้อนกลับไปยังสตริงดิบ อย่าถอดรหัสเป็นภาษาละติน-1ในโค้ดสมัยใหม่ ตรวจสอบว่าข้อมูลมาจากไหน
อินพุตสามรายการ ข้อความแสดงข้อผิดพลาดสามรายการ — เอ็นจิ้นแตกต่างกันอย่างไรในสตริงที่เสียหายเดียวกัน
กลไกของเบราว์เซอร์ปฏิเสธอินพุตที่มีรูปแบบไม่ถูกต้องอย่างสม่ำเสมอ แต่มีข้อผิดพลาดของคำแตกต่างออกไป Chrome รายงานว่า "URI มีรูปแบบไม่ถูกต้อง" Firefox รายงาน "ลำดับ URI มีรูปแบบไม่ถูกต้อง" รายงาน Safari "ไม่สามารถแปลงไม่ได้กำหนดเป็นวัตถุ" เครื่องยนต์ทั้งสามเครื่องปฏิเสธอินพุตที่เหมือนกัน การใช้ถ้อยคำของข้อความที่แน่นอนไม่ได้มาตรฐานสำหรับกลไกหรือเวอร์ชันที่แตกต่างกัน ไม่ต้องอาศัยข้อความแสดงข้อผิดพลาดเพื่อเป็นแนวทางในตรรกะของโค้ด
อย่าจับคู่สตริงกับข้อความแสดงข้อผิดพลาดสำหรับการตัดสินใจของโปรแกรม จับ URIError ตามประเภทเสมอ ฟังก์ชัน decodeUrl จะล้อม decodeURIComponent และจัดเตรียมโค้ดที่สอดคล้องกัน INVALID_PERCENT_ENCODING นี่เป็นการตั้งชื่อตำแหน่งของปัญหาที่แน่นอน ใช้งานได้ข้ามรันไทม์เนื่องจากไม่ได้ขึ้นอยู่กับรูปแบบถ้อยคำของเอ็นจิ้น แนวทางนี้มีความน่าเชื่อถือและบำรุงรักษาได้มากกว่า
อ่านข้อยกเว้นอย่างปลอดภัย — try/catch, การตรวจสอบความถูกต้อง และรูปแบบทางเลือก
รูปแบบการป้องกันที่ง่ายที่สุด: ตัดคำ decodeURIComponent ใน try/catch. หากเกิดข้อผิดพลาด ให้ใช้สตริงดิบหรืออักขระแทนที่ วิธีนี้จะช่วยป้องกันไม่ให้อินพุตที่มีรูปแบบไม่ถูกต้องหยุดทำงาน สำหรับค่าการค้นหา ให้แสดงแบบฟอร์มที่เข้ารหัส URL สำหรับข้อความที่ผู้ใช้เห็น ให้แทรกอักขระแทนที่ สิ่งนี้จะช่วยป้องกันอินพุตที่ไม่ดีไม่ให้แอปพลิเคชันเสียหายและรักษาเสถียรภาพ
ตรวจสอบล่วงหน้าด้วยนิพจน์ทั่วไปเพื่อความรวดเร็วและปลอดภัย ตรวจสอบว่าอินพุตมี triplets %XX ที่ถูกต้องเท่านั้นก่อนถอดรหัส รูปแบบ /%[0-9A-Fa-f]{2/g จับการหลีกเลี่ยงที่ถูกต้อง สิ่งใดก็ตามที่ไม่ตรงกันนั้นไม่ถูกต้อง ข้อผิดพลาดของรูปแบบล้มเหลวอย่างรวดเร็วบนขยะที่ชัดเจน ข้อผิดพลาด UTF-8 ยังคงต้องลอง/catch. เมื่อรวมกันแล้วจะช่วยป้องกันข้อผิดพลาดได้อย่างครอบคลุม
ความล้มเหลวแบบเงียบจะซ่อนจุดบกพร่อง — เหตุใดการถอดรหัสแบบ Blind Decoding จึงมีความเสี่ยงพอๆ กับการเข้ารหัสที่เสียหาย
ความเสี่ยงเล็กน้อย: ตัวถอดรหัสไม่โยนแต่สร้างข้อความผิดโดยไม่มีการแจ้งเตือน รหัสเก่าที่ใช้ unescape ที่เลิกใช้แล้วทำให้ UTF-8 ไม่ถูกต้องในหน่วยความจำ ข้อความดูดีบนหน้าจอจนกว่าจะถึงระบบที่ตรวจสอบ UTF-8 อย่างเคร่งครัด โค้ดสมัยใหม่โยนทิ้งแทนที่จะเสียหายอย่างเงียบๆ ข้อยกเว้นมีความชัดเจนและปลอดภัยกว่าความเสียหายของข้อมูลแบบเงียบที่แพร่กระจายดาวน์สตรีม
สมมติว่าอินพุตของผู้ใช้มีรูปแบบไม่ถูกต้อง ตัดสายทุกครั้ง บันทึกข้อผิดพลาดด้วยอินพุตดั้งเดิมสำหรับการดีบัก อย่าถือว่าทุก % นั้นถูกต้อง การพิมพ์ผิดและการตัดทอนทำให้เกิดการหลบหนีที่ไม่สมบูรณ์ ถือเป็นข้อผิดพลาดของข้อมูล ไม่ใช่ข้อผิดพลาดทางตรรกะ รหัสป้องกันจะรอดพ้นจากการป้อนข้อมูลที่ไม่ถูกต้องและช่วยให้ระบบมีความน่าเชื่อถือ
เครื่องมือที่แท้จริงที่ข้ามไป — พฤติกรรมของเฟรมเวิร์กฝั่งเซิร์ฟเวอร์และการกู้คืนข้อผิดพลาด
เฟรมเวิร์กเซิร์ฟเวอร์จัดการการเข้ารหัสที่มีรูปแบบไม่ถูกต้องได้ผ่อนปรนมากกว่าเบราว์เซอร์ Ruby, Python และ PHP เสนอการกำหนดค่าสำหรับการจัดการ Escape ที่ไม่ถูกต้องใน URL อักขระทดแทนบางตัวทดแทนโดยอัตโนมัติ คนอื่นปล่อยไบต์อย่างเงียบ ๆ มีข้อยกเว้นบางประการเช่น JavaScript ทำ ลักษณะการทำงานจริงจะแตกต่างกันไปตามเฟรมเวิร์กและการตั้งค่าการกำหนดค่าที่นักพัฒนาเลือก
บทความนี้ครอบคลุมถึงพฤติกรรมของเบราว์เซอร์ JavaScript เท่านั้น หากค่ามาจากเซิร์ฟเวอร์ API แสดงว่าเซิร์ฟเวอร์ถอดรหัสหรือข้ามข้อผิดพลาดก่อนที่จะส่ง เซิร์ฟเวอร์สามารถให้อภัยได้มากกว่าไคลเอนต์ เมื่อเขียนสัญญา API ให้ระบุว่าค่าเป็นแบบดิบหรือถอดรหัสล่วงหน้า URL สตริงการสืบค้นควรมาถึงแบบเข้ารหัสเปอร์เซ็นต์ JSON สามารถถอดรหัสล่วงหน้าได้
ตรวจสอบตั้งแต่เนิ่นๆ — ใช้ตัวเข้ารหัสและตัวถอดรหัส URL เพื่อตรวจสอบสตริงที่น่าสงสัยก่อน
ก่อนที่จะส่ง URL ที่น่าสงสัยไปยัง decodeURIComponent ให้วางลงในตัวเข้ารหัสและตัวถอดรหัส URL เครื่องมือนี้แสดงการเข้ารหัสที่แน่นอน ตรวจพบ Escape ที่มีรูปแบบไม่ถูกต้อง และอธิบายข้อผิดพลาดโดยไม่ทำให้แอปพลิเคชันของคุณขัดข้อง ทดสอบกับ %ZZ, %E9 และ 100% เพื่อดูความล้มเหลวต่างๆ และข้อความแสดงข้อผิดพลาดที่แน่นอน ขั้นตอนนี้ใช้เวลาไม่กี่วินาทีและสร้างความมั่นใจ
ตรวจสอบตั้งแต่เนิ่นๆ ตรวจจับข้อผิดพลาดอย่างงดงาม และบันทึกสิ่งที่เสียหาย เครื่องมือถอดรหัสพร้อมตัวถอดรหัสป้องกันช่วยให้แอปพลิเคชันทำงานและแก้ไขจุดบกพร่องได้ URL ตัวเข้ารหัสและตัวถอดรหัสจะเปลี่ยน "URI มีรูปแบบไม่ถูกต้อง" ให้เป็นข้อมูลที่นำไปดำเนินการได้ซึ่งคุณสามารถใช้งานได้ทันที ใช้รูปแบบนี้กับตัวถอดรหัสของคุณเองเพื่อความยืดหยุ่นและการบำรุงรักษาในสภาพแวดล้อมการผลิต