ไทย

เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ · URL ตัวเข้ารหัสและตัวถอดรหัส

การเข้ารหัสการเปลี่ยนเส้นทาง URL ภายในพารามิเตอร์การค้นหาโดยไม่ทำลาย

· มันทำงานอย่างไร

การเข้ารหัส URL พารามิเตอร์แบบสอบถาม ความปลอดภัย คำสาบาน

การเข้ารหัส URL ที่สมบูรณ์เป็นค่าพารามิเตอร์การค้นหาเดียว โดยคงโครงสร้างไว้ด้วยการเข้ารหัสเปอร์เซ็นต์
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

การซ้อน URL หนึ่งรายการไว้ในอีกรายการหนึ่งเป็นสาเหตุที่พบบ่อยที่สุดที่การเข้ารหัสเปอร์เซ็นต์ผิดพลาด โพสต์นี้แสดงให้เห็นว่าเหตุใด URL ภายใน ?, & และ = จึงต้องเข้ารหัส วิธีการดำเนินการ และวิธีการตรวจสอบผลลัพธ์

ลิงก์ย้อนกลับที่ลดพารามิเตอร์ลงครึ่งหนึ่ง - URL ภายใน & ถูกกลืนโดยสตริงข้อความค้นหาภายนอก

ลิงก์ย้อนกลับที่ลดพารามิเตอร์ลงครึ่งหนึ่งคือรูปแบบการดีบักที่นักพัฒนาทุกคนพบ ผู้ใช้เข้าสู่ระบบ แอปพลิเคชันพยายามเปลี่ยนเส้นทางไปยัง ?next=https://example.com/page?id=1&user=alice, และสิ้นสุดที่ example.com/page?id=1 เครื่องหมายและใน URL ภายในถูกแยกวิเคราะห์เป็นตัวคั่นระหว่างพารามิเตอร์การสืบค้นภายนอก URL สองรายการที่มีตัวคั่นต่างกันหมายความว่า URL ภายในต้องได้รับการเข้ารหัส

เมื่อซ้อน URL หนึ่งรายการไว้ภายในอีกรายการหนึ่งเป็นพารามิเตอร์การสืบค้น ที่อยู่ภายในนั้นจะกลายเป็นข้อมูลทึบไปยังเลเยอร์ด้านนอก เครื่องหมายคำถาม เครื่องหมายแอมเปอร์แซนด์ และเครื่องหมายเท่ากับต้องไม่สามารถอ่านได้ในฐานะตัวคั่นเชิงโครงสร้าง การเข้ารหัสเปอร์เซ็นต์จะแปลง: ? กลายเป็น %3F, & กลายเป็น %26, = กลายเป็น %3D ตัวแยกวิเคราะห์ภายนอกถือว่าสตริงที่เข้ารหัสเป็นค่าพารามิเตอร์เดียว

URL สองรายการ ตัวคั่นสองชุด — เพราะเหตุใด URL ภายในจึงเป็นเพียงค่าของ URL ภายนอก

encodeURIComponent บน URL ภายในที่สมบูรณ์จะสร้างการป้องกันแบบเต็ม: encodeURIComponent("https://example.com/a?b=1&c=2") ส่งคืน "https%3A%2F%2Fexample.com%2Fa%3Fb%3D1%26c%3D2" ตัวละครโครงสร้างทุกตัวจะกลายเป็น %XX สัญกรณ์เพื่อให้ parser ภายนอกไม่สามารถตีความตัวคั่นที่ซ้อนกันผิด วิธีการแข่งขันเช่น encodeURI ปล่อยให้เครื่องหมายทับและเครื่องหมายคำถามไม่ถูกแตะต้อง ทำให้เกิดความกำกวมอีกครั้งเมื่อผลลัพธ์นั้นกลายเป็นค่าการสืบค้น

เซิร์ฟเวอร์ถอดรหัสเพียงครั้งเดียว หลังจากแยกพารามิเตอร์ถัดไปแล้ว การเรียก decodeURIComponent ครั้งเดียวจะคืนค่า URL ภายในให้เป็นรูปแบบดั้งเดิม แยกวิเคราะห์ผลลัพธ์เป็นสตริงแบบสอบถามใหม่ จากนั้นจะเห็นโครงสร้างพารามิเตอร์ที่ถูกต้อง การถอดรหัสซ้ำซ้อนถือเป็นความเสี่ยงเมื่อค่าเดียวกันผ่านหลายเลเยอร์ %26 กลายเป็น & หลังจากการถอดรหัสหนึ่งครั้ง และคงอยู่ & หลังจากวินาที

encodeURIComponent ใน URL ภายในทั้งหมด — อะไรที่ได้รับการเข้ารหัส รวมถึง :, / และ ?

กฎพื้นฐานนั้นง่ายมาก: อักขระใดๆ ที่มีความหมายในรูปแบบ URL รวมถึง : / ? = & # จะต้องเข้ารหัสเป็นเปอร์เซ็นต์เมื่อปรากฏในค่าพารามิเตอร์การค้นหา เพื่อให้แน่ใจว่าโปรแกรมแยกวิเคราะห์ภายนอกจะเห็นเฉพาะโครงสร้างพารามิเตอร์ที่คุณต้องการ และไม่มีตัวคั่นโดยไม่ตั้งใจที่ซ่อนอยู่ภายในค่าที่คุณส่ง ใช้ encodeURIComponent เพื่อจัดการการเข้ารหัสนี้อย่างสมบูรณ์และเชื่อถือได้

ทดสอบการเข้ารหัสนี้ในตัวเข้ารหัสและตัวถอดรหัส URL: วาง URL ภายใน เข้ารหัสในโหมดค่า สังเกตเอาต์พุต %XX ใช้โหมดถอดรหัสเพื่อตรวจสอบว่าการเดินทางไปกลับตรงกันทุกประการ เครื่องมือนี้สาธิตการเข้ารหัสตั้งแต่ต้นจนจบ เพื่อให้คุณสามารถคัดลอกผลลัพธ์ลงในโค้ดแอปพลิเคชันของคุณได้โดยตรงอย่างมั่นใจ

ตัวอย่างการทำงาน: การสร้าง ?next=https://example.com/a?b=1&c=2 อย่างถูกต้อง — สตริงที่เข้ารหัสและการถอดรหัสบนฝั่งเซิร์ฟเวอร์

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

การเข้ารหัสช่วยแก้ไขปัญหาการแยกวิเคราะห์ การตรวจสอบความถูกต้องช่วยแก้ไขปัญหาด้านความปลอดภัย สิ่งเหล่านี้เป็นข้อกังวลที่แยกจากกันในชั้นต่างๆ URL ตัวเข้ารหัสและตัวถอดรหัสสาธิตการเข้ารหัสอย่างถูกต้อง เซิร์ฟเวอร์จะต้องเพิ่มการตรวจสอบ: ตรวจสอบกับรายการ ตรวจสอบโดเมน หรือขอการยืนยัน หากไม่มีการตรวจสอบความถูกต้อง การเปลี่ยนเส้นทางที่เข้ารหัสอย่างถูกต้องไปยังโดเมนใดๆ ยังคงสามารถหาประโยชน์ได้

ความเสี่ยงในการเปลี่ยนเส้นทางแบบเปิด — เหตุใดเซิร์ฟเวอร์จึงต้องตรวจสอบปลายทางที่ถอดรหัส ไม่ใช่แค่ถอดรหัสเท่านั้น

ข้อผิดพลาดทั่วไปสะสมอยู่ที่นี่ บางครั้งนักพัฒนาจะเข้ารหัสเฉพาะส่วนการสืบค้น โดยไม่แตะต้องเครื่องหมายทับ ซึ่งจะทำให้โครงสร้างเสียหาย อื่นๆ เข้ารหัสพารามิเตอร์ที่สร้างขึ้นทั้งหมด รวมถึง ?next= การสร้างการเข้ารหัสสองครั้ง ตรวจสอบความถูกต้องบางอย่างโดยการแยกวิเคราะห์โดยไม่ต้องถอดรหัส อ่านโครงสร้างที่เข้ารหัสผิด การสร้างด้วย encodeURIComponent ช่วยให้มั่นใจถึงความสอดคล้องและความถูกต้องในทุกกรณี

ข้อผิดพลาดทั่วไปอีกประการหนึ่งคือการไว้วางใจเบราว์เซอร์ให้แก้ไขพารามิเตอร์ที่มีรูปแบบไม่ถูกต้องโดยอัตโนมัติ URL คือข้อมูลและต้องได้รับการปฏิบัติอย่างแม่นยำเสมือนเป็นข้อมูล encodeURIComponent เป็นเครื่องมือมาตรฐานสำหรับงานนี้ URL ตัวเข้ารหัสและตัวถอดรหัสเก็บกระบวนการนี้ไว้ในเครื่อง เพื่อให้คุณสามารถตรวจสอบไบต์ที่แน่นอนก่อนจัดส่งไปยังการใช้งานจริง

ข้อผิดพลาดทั่วไป — เข้ารหัสเฉพาะส่วนแบบสอบถาม หรือไว้วางใจให้เบราว์เซอร์แก้ไข

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

พารามิเตอร์สถานะใน OAuth ใช้การเข้ารหัสร่วมกับลายเซ็นที่เข้ารหัสเพื่อการป้องกัน CSRF ตัวระบุแฟรกเมนต์จะอยู่บนฝั่งไคลเอ็นต์และจะไม่เดินทางไปยังเซิร์ฟเวอร์ โทเค็นผู้ถือจะต้องไม่ถูกวางใน URL การเปลี่ยนเส้นทางโดยไม่คำนึงถึงการเข้ารหัส เนื่องจาก URL จะปรากฏในบันทึก ประวัติเบราว์เซอร์ และส่วนหัวของผู้อ้างอิง

สิ่งนี้ไม่ครอบคลุม — พารามิเตอร์สถานะ OAuth และการออกแบบการป้องกัน CSRF

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

การพิมพ์ผิดเช่น %2e แทนที่จะเป็น %2E อาจถอดรหัสได้อย่างถูกต้อง แต่ไม่ผ่านการตรวจสอบแบบไปกลับในระบบรองที่คาดหวังความสอดคล้องกัน การเข้ารหัสที่ไม่ตรงกันระหว่างไลบรารีบนแพลตฟอร์มที่ต่างกันนั้นเกิดขึ้นได้ยากแต่เป็นไปได้ การทดสอบการเดินทางแบบไปกลับทั้งหมดจะจับพวกมันได้ก่อนที่จะเกิดปัญหาการผลิตและการร้องเรียนจากลูกค้า

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

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

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