Công cụ dành cho nhà phát triển · Bộ mã hóa và giải mã URL
RFC 3986 ký tự dành riêng và không được đặt trước: tiêu chuẩn URI nói gì
· Lý lịch
url-encoding rfc3986 percent-encoding
RFC 3986 chia các ký tự thành dành riêng, không đặt trước và mọi thứ khác, đồng thời sự phân chia đó giải thích mọi quy tắc mã hóa phần trăm mà bạn đã đáp ứng. Bài viết này đọc các phần có liên quan rõ ràng.
RFC 3986 ký tự dành riêng và không được đặt trước—điều quan trọng khi bạn tạo URL
RFC 3986 chia các ký tự thành ba loại: không đặt trước, dành riêng và mọi thứ khác phải được mã hóa. Các ký tự không được đặt trước không bao giờ cần mã hóa—đây là các chữ cái, chữ số, dấu gạch nối, dấu chấm, dấu gạch dưới và dấu ngã. RFC liệt kê những điều này một cách rõ ràng trong phần 2.3, nêu rõ chúng an toàn khi không được mã hóa trong bất kỳ bối cảnh URI nào. Thử nghiệm trong bộ mã hóa và giải mã URL với các ký tự này cho thấy chúng truyền qua không thay đổi. Các ký tự dành riêng chia thành các ký tự gen (: / ? # [ ] @) và các ký tự phụ (! $ & ' ( ) * + , ; =), mỗi ký tự có ý nghĩa cấu trúc trong các thành phần URL khác nhau.
Khi nào một ký tự cần mã hóa? Các ký tự dành riêng chỉ được mã hóa phần trăm khi chúng tạo ra sự mơ hồ. Dấu gạch chéo đánh dấu các đoạn đường dẫn; trong giá trị truy vấn nó phải là %2F. Một dấu và phân tách các tham số; & trong một giá trị yêu cầu %26. Các ký tự không được đặt trước không bao giờ cần mã hóa—dấu gạch nối vẫn là dấu gạch nối. Tiêu chuẩn URL đảm bảo phân tích cú pháp chính xác. Thử nghiệm với bộ mã hóa & giải mã URL: nhập "hello/world" với mã hóaURIComponent sẽ tạo ra "hello%2Fworld"; với EncodeURI nó giữ nguyên dấu gạch chéo.
Không được bảo vệ: các chữ cái, chữ số, dấu gạch nối, dấu chấm, dấu gạch dưới và dấu ngã - các ký tự không bao giờ cần mã hóa và không bao giờ được mã hóa
Mã hóa phần trăm sử dụng %HH trong đó HH là ký hiệu thập lục phân. ASCII chữ A (mã 65) trở thành %41. Non-ASCII é yêu cầu mã hóa UTF-8: é (U+00E9) trở thành %C3%A9. Các tiêu chuẩn hiện đại chỉ định UTF-8 một cách thống nhất trên các trình duyệt.
Các URL hoàn chỉnh cần có cú pháp cấu trúc nguyên vẹn; giá trị truy vấn cần các ký tự dành riêng bên trong vô hại. Tham số truy vấn ?q=R&D phải mã hóa & dưới dạng %26 nếu thủ công, nếu không thì ký hiệu và sẽ trở thành dấu phân cách. Các giá trị có dấu gạch chéo lên trở thành %2F trong chế độ thành phần. Mã hóa thành phần (encodeURIComponent) xử lý việc này bằng cách mã hóa mọi thứ ngoại trừ các chữ cái, chữ số và - _ . ! ~ * ' ( ). Thử nghiệm cho thấy sự khác biệt giữa các phương pháp một cách rõ ràng.
Dành riêng: gen-delims và sub-delims - hai nhóm, thành viên và vai trò cấu trúc của chúng
Chuỗi truy vấn chứng minh tại sao các ký tự dành riêng lại quan trọng. Dấu và phân tách các cặp khóa=giá trị: ?utm_source=email&utm_campaign=sale có nghĩa là hai tham số. Bên trong một giá trị, ký hiệu không thoát và kết thúc cặp. Bằng phân tách khóa khỏi giá trị. Phân tích cú pháp xảy ra ở nhiều lớp; mỗi người đều áp dụng các quy tắc giống nhau.
Các ký tự yêu cầu mã hóa trong giá trị truy vấn bao gồm ký hiệu và, bằng, hàm băm, dấu chấm hỏi, dấu cách và các chữ cái không phải ASCII. Hàm băm lén lút nhất: #anything trở thành mã định danh phân đoạn, không bao giờ được gửi đến máy chủ. Tên chiến dịch kết thúc bằng hàm băm sẽ mất mọi thứ sau nó trước khi yêu cầu rời khỏi trình duyệt. Dấu cách phải trở thành %20. Thử nghiệm với bộ mã hóa & giải mã URL sẽ hiển thị các chế độ thành phần và biểu mẫu. Hiểu vị trí xác định nhu cầu mã hóa.
Khi các ký tự dành riêng phải được mã hóa - chỉ khi chúng bị nhầm lẫn với dấu phân cách, từng thành phần
Mã hóa phần trăm vẫn tồn tại trong RFC 3986. Bộ không đặt trước vẫn nhỏ đảm bảo tính di động. Các ký tự không được mã hóa theo phần trăm có thể giải mã mà không thay đổi ý nghĩa. Giải mã %41 thành A là chính xác vì A không được bảo vệ. Giải mã %2F thành / thay đổi ý nghĩa khi dấu gạch chéo là dữ liệu chứ không phải dấu phân cách. RFC 3986 phần chuẩn hóa 6 bao gồm các cách tiếp cận cú pháp.
Các nhân vật dành riêng ở các vị trí khác nhau có vai trò khác nhau. Dấu hai chấm trong lược đồ đánh dấu lược đồ:ranh giới thẩm quyền; dấu hai chấm trong userinfo là dữ liệu. Dấu hỏi mở phần truy vấn; dấu gạch chéo trong giá trị truy vấn là chữ. Đoạn bắt đầu có dấu băm. Vị trí xác định nhu cầu mã hóa. Chuỗi truy vấn mang các giá trị mà bản thân chúng là URI. Mã hóa chuyển hướng URL như https://example.com/page?param=value làm tham số yêu cầu mã hóa dấu gạch chéo và dấu hai chấm thành %2F và %3A. Bối cảnh luôn xác định các ký tự an toàn.
Ví dụ đã hoạt động: phân loại mọi ký tự của URL thực - không được đặt trước, dành riêng dưới dạng dấu phân cách, dành riêng dưới dạng dữ liệu
RFC 1738 (1994) được coi là nhiều ký tự không an toàn. Khi việc triển khai được chuẩn hóa trên UTF-8, các tiêu chuẩn sau này đã nới lỏng các hạn chế. Dấu ngã (~) minh họa cho quá trình tiến hóa: RFC 1738 bắt buộc %7E, RFC 2396 (1998) đã chuyển dấu ngã sang không được đặt trước, RFC 3986 đã xác nhận trạng thái không được đặt trước. Sự tiến hóa phản ánh các bài học triển khai. Tiêu chuẩn duy trì khả năng tương thích ngược.
RFC chuẩn hóa cho phép giải mã các ký tự không được mã hóa theo phần trăm không cần thiết. %41 bình thường hóa một cách an toàn thành A. Các ký tự dành riêng được mã hóa như %2F không bao giờ giải mã; thay đổi ý nghĩa phá vỡ cấu trúc. Sự đồng thuận hiện đại sử dụng RFC 3986 làm đường cơ sở tham chiếu. Bộ mã hóa và giải mã URL tuân theo RFC 3986 xuyên suốt, cung cấp tham chiếu cố định tách biệt với hoạt động của trình duyệt. WHATWG URL Tiêu chuẩn bổ sung các bộ mã hóa dành riêng cho thành phần ngoài RFC. Các tiêu chuẩn cùng tồn tại: RFC 3986 cho phân tích cú pháp chung URL, WHATWG cho trình duyệt web. Thư viện khác nhau; kiểm tra tài liệu.
Hướng dẫn chuẩn hóa trong phần 6 — quy tắc phân đoạn đường dẫn và quy tắc giải mã không đặt trước và trường hợp hex
Việc kiểm tra RFC 3986 đảm bảo URL hoạt động trên phần mềm kéo dài hàng thập kỷ. Bộ mã hóa và giải mã URL cung cấp đường cơ sở mã hóa RFC 3986 để áp dụng cho các thành phần được xây dựng. Đọc tài liệu tiêu chuẩn giải thích mọi quyết định mã hóa trong thư viện URL. WHATWG URL được xây dựng trên RFC 3986 thay vì thay thế hoàn toàn. Xây dựng URL cho các trình duyệt chung? Theo dõi RFC 3986; trình duyệt áp dụng quy tắc WHATWG ở trên cùng. Hệ thống cũ hơn? Kiểm tra việc triển khai thực tế. Bình thường hóa để lưu trữ? Áp dụng RFC 3986 một cách nhất quán. Hiểu sự khác biệt dành riêng/unreserved sẽ cho bạn biết các ký tự an toàn.
Mã hóa URL không phải là quá trình dọn dẹp bảo mật. Mỗi ngữ cảnh—SQL, HTML, JavaScript, URI—cần mã hóa đầu ra riêng. Mã hóa phần trăm chỉ bảo vệ cấu trúc URL. Áp dụng phòng thủ bên phải ở lớp bên phải.
Điều này không bao gồm những gì — bộ mã hóa khác nhau của WHATWG URL tiêu chuẩn và cách xử lý IRI
RFC 2396 (1998) đã làm rõ các bộ ký tự chặt chẽ hơn RFC 1738. Nó chính thức hóa các ký tự dành riêng phục vụ cấu trúc URI và không được đặt trước dưới dạng dữ liệu bằng chữ. Mở rộng không cần đặt trước bao gồm dấu gạch nối, dấu chấm, dấu gạch dưới, dấu ngã so với các định nghĩa ban đầu. RFC 2396 đã giới thiệu sự phân biệt giữa gen-delims (:, /, ?, #, [, ], @) và sub-delims (!, $, &, ', (, ), *, +, ,, ;, =). Mỗi nhóm có vai trò cấu trúc khác nhau trong URL. Việc đặt tên làm rõ các ký tự dành riêng chia thành hai nhóm. Biết tên giúp thảo luận kỹ thuật.
RFC 3986 (2005) là tài liệu tham khảo hiện đại. Nó giữ lại sự phân biệt/unreserved dành riêng nhưng ký hiệu được đơn giản hóa. Các cơ quan tiêu chuẩn không phá vỡ web một cách hồi tố. Mã hóa có chủ ý biết tiêu chuẩn của bạn. Bộ mã hóa và giải mã URL cung cấp tham chiếu RFC 3986.
Bài học rút ra: tiêu chuẩn ngắn gọn và chính xác — cách hai chế độ của bộ mã hóa và giải mã URL tương ứng với việc mã hóa dữ liệu so với việc giữ nguyên các dấu phân cách
Việc lựa chọn tiêu chuẩn phụ thuộc vào bối cảnh. Xây dựng URL cho các trình duyệt chung? Theo dõi RFC 3986; trình duyệt áp dụng quy tắc WHATWG. Hệ thống cũ hơn? Kiểm tra việc triển khai thực tế. Bình thường hóa để lưu trữ? Áp dụng RFC 3986 một cách nhất quán. Các quy tắc mã hóa phần trăm đã phát triển từ quy tắc bảo thủ RFC 1738 thông qua quy tắc RFC 2396 và RFC 3986 được làm rõ đến quy tắc phân lớp WHATWG URL Tiêu chuẩn. Mỗi thế hệ đều phản ánh kinh nghiệm. Các nhà xây dựng hiện đại tuân theo RFC 3986 hoặc WHATWG theo ngữ cảnh. URL cũ và mới cùng tồn tại đòi hỏi phải có tư duy tương thích. Hiểu các danh mục sẽ ngăn ngừa lỗi mã hóa.
Xác minh URL mã hóa chính xác trước khi triển khai. Bộ mã hóa và giải mã URL thể hiện các quy tắc RFC 3986 từ đầu đến cuối. Xem các giá trị hex chính xác và hiểu ký tự nào mã hóa. Sử dụng công cụ này khi xây dựng URL bằng cách nối các phần. RFC 3986 bộ ký tự phân vùng danh mục dành riêng và không được đặt trước để phân tích cú pháp URI nhất quán.