Câu trả lời không đơn giản.
Phần sau được trích xuất từ phần 3.2.2 của RFC 3986:
Hàng loạt xác định bởi một địa chỉ đen Giao thức Internet phiên bản 6
[RFC3513] hay muộn, được phân biệt bởi kèm theo IP đen
trong dấu ngoặc vuông ("[" và "] "). Đây là nơi duy nhất cho phép các ký tự dấu ngoặc vuông được phép trong cú pháp URI trong các ký tự URI là
.
có vẻ như để trả lời câu hỏi bằng cách nói rõ rằng dấu ngoặc vuông không được phép ở bất kỳ nơi nào khác trong URI. Nhưng có sự khác biệt giữa ký tự ngoặc vuông và ký tự dấu ngoặc vuông được mã hóa phần trăm.
Sau đây là trích ra từ đầu phần 3 của RFC 3986:
Linh kiện Cú pháp
Cú pháp URI chung bao gồm một chuỗi thứ bậc của
thành phần được gọi là lược đồ, quyền hạn, đường dẫn, truy vấn và
đoạn.
URI = scheme ":" hier-part ["?" truy vấn] [ "#" fragment]
Vì vậy, các "truy vấn" là một thành phần của "URI".
Sau đây là trích ra từ phần 2.2 của RFC 3986:
2,2. Ký tự dành riêng
URI bao gồm các thành phần và thành phần phụ được phân cách bởi
ký tự trong bộ "đã đặt trước". Các ký tự này được gọi là
"được đặt trước" vì chúng có thể được xác định là dấu phân tách bằng
cú pháp chung, theo cú pháp của từng lược đồ cụ thể hoặc bằng cú pháp triển khai
cụ thể của thuật toán dereferencing của URI.
Nếu dữ liệu cho thành phần URI xung đột với mục đích của một ký tự được đặt trước, thì dữ liệu xung đột phải là
được mã hóa phần trăm trước khi URI được tạo.
reserved = gen-delims/sub-delims
gen-delims = ":"/"/"/"?"/"#"/"["/"]"/"@"
sub-delims = "!"/"$"/"&"/"'"/"("/")"
/"*"/"+"/","/";"/"="
dấu ngoặc vuông Vì vậy, có thể xuất hiện trong một chuỗi truy vấn, nhưng chỉ khi họ được trăm mã hóa. Trừ khi họ được không, để được giải thích thêm xuống trong phần 2.2:
URI ứng dụng sản xuất nên phần trăm mã hóa octet dữ liệu mà
tương ứng với ký tự trong tập reserved trừ khi những nhân vật
được phép đặc biệt bởi Lược đồ URI đại diện cho dữ liệu trong thành phần
này.Nếu một ký tự dành riêng được tìm thấy trong thành phần URI và
không có vai trò phân định nào được biết cho ký tự đó, thì phải là
được hiểu là biểu thị octet dữ liệu tương ứng với mã hóa
của ký tự này trong US-ASCII.
Vì vậy, vì dấu ngoặc vuông chỉ được phép trong phần tử "máy chủ", nên "được" mã hóa phần trăm trong các thành phần và thành phần phụ khác, và trong trường hợp này trong thành phần "truy vấn", trừ khi RFC 3986 cho phép không mã hóa rõ ràng dấu ngoặc vuông để đại diện cho dữ liệu trong thành phần truy vấn, mà không phải là. Tuy nhiên, nếu một "ứng dụng sản xuất URI" không thực hiện những gì nó "nên" làm, bằng cách để lại dấu ngoặc vuông không được mã hóa trong truy vấn, thì người đọc của URI không được từ chối URI ngay lập tức. Thay vào đó, các dấu ngoặc vuông sẽ được coi là thuộc về dữ liệu của thành phần truy vấn, vì chúng không được sử dụng như các dấu phân cách trong thành phần đó.
Đây là lý do tại sao, nó không vi phạm RFC 3986 khi PHP chấp nhận cả dấu ngoặc vuông không mã hóa và phần trăm dưới dạng ký tự hợp lệ trong chuỗi truy vấn và thậm chí gán cho chúng một mục đích đặc biệt. Tuy nhiên, có vẻ như các tác giả cố gắng tận dụng lỗ hổng này bằng cách không phần trăm mã hóa dấu ngoặc vuông vi phạm RFC 3986.
"Đa chiều" là gì? Hoặc bạn đang đề cập đến các vars nhận được đại diện như là một mảng trong một ngôn ngữ kịch bản phía máy chủ? – arkascha
@ yaascha yep, ý tôi là chuỗi truy vấn như thế này? A [b] [c] [d] [e] = f', kịch bản lệnh phía máy chủ sau đó xử lý nó như một mảng đa chiều –