การเข้ารหัส URL: คู่มือฉบับสมบูรณ์
การเข้ารหัส URL (หรือที่เรียกว่า percent-encoding) เป็นกลไกที่จำเป็นสำหรับการทำให้ข้อมูลปลอดภัยในการส่งผ่าน URL URL สามารถมีอักขระ ASCII บางตัวเท่านั้น การเข้ารหัส URL แปลงอักขระที่ไม่ปลอดภัยหรืออักขระพิเศษเป็นรูปแบบที่สามารถส่งได้อย่างปลอดภัยผ่านอินเทอร์เน็ต คู่มือนี้จะอธิบายว่าการเข้ารหัส URL ทำงานอย่างไร เมื่อไหร่ต้องใช้ และวิธีใช้อย่างถูกต้องในแอปพลิเคชันของคุณ
ทำไมถึงต้องการการเข้ารหัส URL?
URL ต้องประกอบด้วยอักขระ ASCII ที่จำกัดเท่านั้น มาตรฐาน URL (RFC 3986) กำหนดว่าอักขระใดปลอดภัยที่จะใช้โดยตรงและอักขระใดต้องเข้ารหัส นี่ไม่ใช่ข้อจำกัดโดยพลการ—มันมีเหตุผลทางประวัติศาสตร์และทางเทคนิคที่ดี อักขระสงวน: อักขระบางตัวมีความหมายพิเศษใน URL และไม่สามารถใช้ตามตัวอักษรได้: ? แยกเส้นทางออกจาก query string, & แยกพารามิเตอร์ query, = กำหนดค่าให้กับพารามิเตอร์, # ระบุส่วน fragment, / แยกส่วนเส้นทาง, : ใช้ใน scheme และ port, @ ใช้ในข้อมูลผู้ใช้, [ ] ใช้ใน IPv6 address หากคุณต้องการใช้อักขระเหล่านี้เป็นข้อมูลจริง (ไม่ใช่ตามความหมายพิเศษของมัน) คุณต้องเข้ารหัสพวกมัน อักขระที่ไม่ปลอดภัย: อักขระบางตัวอาจถูกตีความผิดหรือเสียหายระหว่างการส่ง: ช่องว่าง (ช่องว่างที่สามารถพังได้หรือเป็นตัวคั่น), อักขระควบคุม (ตัวอักษร ASCII ที่ต่ำกว่า 32), อักขระที่ไม่ใช่ ASCII (อักขระ Unicode, emoji), เครื่องหมายคำพูด (อาจสิ้นสุดสตริง), < > (อาจตีความเป็น HTML), เปอร์เซ็นต์เอง (% ใช้สำหรับการเข้ารหัส) อักขระทั้งหมดนี้ควรได้รับการเข้ารหัสในพารามิเตอร์ URL การใช้งานในโลกจริง: พิจารณาแบบฟอร์มการค้นหาที่ผู้ใช้พิมพ์ 'Tom & Jerry' คุณไม่สามารถสร้าง URL เช่น https://example.com/search?q=Tom & Jerry ได้—& จะแยกพารามิเตอร์ออก คุณต้องเข้ารหัส: https://example.com/search?q=Tom%20%26%20Jerry ตอนนี้มันชัดเจนว่า & เป็นส่วนหนึ่งของข้อมูลค้นหา ไม่ใช่ตัวคั่นพารามิเตอร์ อักขระนานาชาติ: URL เดิมออกแบบสำหรับ ASCII เท่านั้น อักขระ Unicode ต้องได้รับการเข้ารหัส ตัวอย่างเช่น 'สวัสดี' (ภาษาไทย) กลายเป็น %E0%B8%AA%E0%B8%A7%E0%%B8%B1%E0%B8%AA%E0%B8%94%E0%B8%B5 นี่ทำให้ URL รองรับภาษาใดก็ได้และอักขระใดก็ได้ ความปลอดภัย: การเข้ารหัส URL ที่เหมาะสมช่วยป้องกันช่องโหว่ด้านความปลอดภัย ข้อมูลที่ไม่ได้เข้ารหัสอย่างถูกต้องสามารถนำไปสู่การแทรก URL, XSS หรือปัญหาการแยกวิเคราะห์ที่ทำให้เซิร์ฟเวอร์สับสนได้
วิธีการทำงานของการเข้ารหัส URL
การเข้ารหัส URL (percent-encoding) แทนที่อักขระด้วยเปอร์เซ็นต์ตามด้วยรหัสฐานสิบหก กระบวนการนั้นง่าย: แปลงอักขระเป็นไบต์ของมัน (โดยใช้ UTF-8), แสดงแต่ละไบต์เป็นฐานสิบหก, เพิ่มหน้า % ไปที่แต่ละฐานสิบหก ตัวอย่าง: ช่องว่าง (' ') → 0x20 ใน ASCII → เข้ารหัสเป็น %20, แอมเพอร์แซนด์ ('&') → 0x26 → %26, เครื่องหมายคำถาม ('?') → 0x3F → %3F, อักษร Unicode 'ก' (ไทย) → 0xE0 0xB8 0x81 ใน UTF-8 → %E0%B8%81 อักขระที่ไม่จำเป็นต้องเข้ารหัส: อักขระบางตัวปลอดภัยโดยไม่ต้องการการเข้ารหัส: A-Z, a-z (ตัวอักษร), 0-9 (ตัวเลข), - . _ ~ (อักขระที่ไม่สงวน) อักขระเหล่านี้สามารถปรากฏในตัวมันเองใน URL ได้ อักขระอื่นทั้งหมดควรได้รับการเข้ารหัสในพารามิเตอร์ query กรณีพิเศษสำหรับช่องว่าง: ช่องว่างสามารถเข้ารหัสได้สองวิธี: %20 (percent-encoding ที่เหมาะสม), + (ในบริบท query string เท่านั้น, รูปแบบที่เก่ากว่า) สำหรับความสม่ำเสมอ แนะนำให้ใช้ %20 ทุกที่ แต่เข้าใจว่า + เป็นทางเลือกสำหรับ query string การเข้ารหัสองค์ประกอบ URL ที่ต่างกัน: ไม่ใช่ส่วนทั้งหมดของ URL ที่เข้ารหัสในลักษณะเดียวกัน: Scheme (http:, https:)—ไม่เคยเข้ารหัส, Host (example.com)—กรณีพิเศษ (ดู Punycode สำหรับโดเมนนานาชาติ), Path (/search/results)—เข้ารหัสทุกอย่างยกเว้น /, Query parameters (?q=value&page=2)—เข้ารหัสทั้ง key และ value, Fragment (#section)—เข้ารหัสเนื้อหา แต่ไม่ใช่ # เอง การเข้ารหัสซ้อน: ระวังการเข้ารหัสซ้ำ ถ้าคุณเข้ารหัส 'Tom & Jerry' เป็น 'Tom%20%26%20Jerry' แล้วเข้ารหัสอีกครั้ง คุณจะได้ 'Tom%2520%2526%2520Jerry' (% เองถูกเข้ารหัสเป็น %25) สิ่งนี้เป็นบั๊กทั่วไป เข้ารหัสข้อมูลเพียงครั้งเดียวก่อนวางใน URL
แนวปฏิบัติที่ดีที่สุด
เข้ารหัสเสมอที่จุดสร้าง: เข้ารหัสข้อมูลทันทีก่อนใส่ใน URL อย่าเก็บข้อมูลในรูปแบบที่เข้ารหัสแล้ว—เก็บข้อมูลดิบและเข้ารหัสเมื่อสร้าง URL เมื่อคุณรับ URL ให้ถอดรหัสทันทีหลังจากแยกพารามิเตอร์ วิธีการนี้ทำให้ข้อมูลของคุณสะอาดและป้องกันข้อผิดพลาดการเข้ารหัสซ้อน ใช้ฟังก์ชันที่เหมาะสม: JavaScript: encodeURIComponent() สำหรับพารามิเตอร์ query และองค์ประกอบ URL encodeURI() สำหรับ URL ทั้งหมด (เข้ารหัสน้อยกว่า—ใช้อย่างระมัดระวัง) อย่าใช้ escape() (เลิกใช้และไม่ถูกต้อง) Python: urllib.parse.quote() หรือ quote_plus() PHP: urlencode() หรือ rawurlencode() Java: URLEncoder.encode() ใช้เมธอดที่เหมาะสมสำหรับภาษาของคุณ—อย่าสร้างการเข้ารหัสของคุณเอง เข้ารหัสองค์ประกอบแยกกัน: สร้าง URL ทีละชิ้น เข้ารหัสแต่ละพารามิเตอร์แยกกัน จากนั้นรวมพวกมัน ไม่ถูกต้อง: let url = 'https://api.com/search?q=' + encodeURIComponent(query + '&category=' + category); ถูกต้อง: let url = 'https://api.com/search?q=' + encodeURIComponent(query) + '&category=' + encodeURIComponent(category); โครงสร้าง URL (?, &, =) ไม่ควรถูกเข้ารหัส เฉพาะค่าเท่านั้น จัดการอักขระพิเศษ: + ในข้อมูล: ถ้าข้อมูลของคุณมี + encodeURIComponent() จะรักษาไว้อย่างถูกต้อง แต่บางระบบที่เก่ากว่าอาจตีความว่าเป็นช่องว่าง พิจารณาเข้ารหัสเป็น %2B เพื่อความชัดเจน ช่องว่าง: ใช้ %20 สำหรับความสม่ำเสมอ + ทำงานใน query string แต่ %20 เป็นสากล Unicode: encodeURIComponent() จัดการอักขระ Unicode อย่างถูกต้อง ตรวจสอบให้แน่ใจว่าไคลเอ็นต์และเซิร์ฟเวอร์ของคุณคาดหวัง UTF-8 ตรวจสอบความยาว: พารามิเตอร์ URL ที่เข้ารหัสสามารถยาวขึ้นอย่างมาก อักขระ Unicode กลายเป็น 9+ ไบต์ (%E0%B8%81 = 9 ไบต์สำหรับอักขระเดียว) เบราว์เซอร์มีขีดจำกัดความยาว URL (โดยทั่วไป 2000-8000 อักขระ) เซิร์ฟเวอร์มีขีดจำกัดของพวกเขา สำหรับข้อมูลขนาดใหญ่ พิจารณาใช้ POST แทน GET การแก้ไขข้อผิดพลาดทั่วไป: การเข้ารหัสซ้อน—เข้ารหัสเพียงครั้งเดียว การเข้ารหัส URL ทั้งหมด—เข้ารหัสเฉพาะค่า ไม่ใช่โครงสร้าง การลืมเข้ารหัส—เข้ารหัสเสมอเมื่อข้อมูลของผู้ใช้เข้าสู่ URL การใช้ escape() ใน JavaScript—ใช้ encodeURIComponent() ไม่ได้จัดการ + อย่างถูกต้อง—เซิร์ฟเวอร์ของคุณต้องรู้ว่าจะถอดรหัสอย่างไร
ลองใช้เครื่องมือ
เข้ารหัส/ถอดรหัส URL
เรียนรู้เพิ่มเติม
คำถามที่พบบ่อย
เข้ารหัส/ถอดรหัส URL
คำถามที่พบบ่อย →