Вопрос по query-string, http, url, html – Какие символы должны быть экранированы в строке HTTP-запроса?

44

Этот вопрос касается символов в части строки запроса URL-адреса, которые появляются после? пометить персонажа.

вВикипедиянекоторые символы остаются как есть, а другие кодируются (обычно% escape escape)

Я пытался отследить это до фактических спецификаций, чтобы понять обоснование каждого пункта на этой странице Википедии.

Пример противоречия 1:

Спецификация HTML говорит кодировать пространство как+ и откладывает все остальноеRFC1738, Тем не менее, этот RFC говорит, что~ небезопасно и, кроме того, что «все небезопасные символы всегда должны быть закодированы в URL». Это, кажется, противоречит Википедии.

На практике IE8 кодирует~ в строках запроса это генерирует, в то время как FF3 оставляет это как есть.

Пример противоречия 2:

Википедия утверждает, что все символы, которые она не упоминает, должны быть закодированы.! не упоминается в Википедии. НоRFC1738 говорится, что! является «специальным» символом и «может использоваться без кодировки». Это, кажется, противоречит Википедии, которая говорит, что это должно быть закодировано.

На практике IE8 кодирует! в строках запроса это генерирует, в то время как FF3 оставляет это как есть.

Я понимаю, что мораль этого, вероятно, будет заключаться в кодировании тех символов, которые находятся под сомнением между Википедией и спецификациями. Возможно, даже заходит так далеко, что кодирует все, что не является [A-Za-z0-9]. Я просто хотел бы знать фактические стандарты по этому вопросу.

Выводы

Алгоритм, описанный в Википедии, кодирует именно те символы, которые не являютсяRFC3986 незарезервированные символы, То есть он кодирует все символы, кроме буквенно-цифровых символов и-._~, В особом случае пространство кодируется как+ вместо%20 согласно RFC3986.

Некоторые приложения используют более старый RFC. Для сравненияRFC2396 незарезервированные символы являются буквенно-цифровыми и!'()*-._~.

Для сравненияАлгоритм рабочего проекта HTML5 кодирует все символы, кроме буквенно-цифровых символов и*-._, Особый случай кодирования места остается+, Заметные различия в том, что* не кодируется и~ закодирован. (Технически, это обработка* совместим с RFC3986, хотя* вreserved потому что это вsub-delims которые разрешены вquery производство.)

@ Джон - хотя важно использоватьправильный стандарт. Что в данном случае составляет 3986, а не старшее 1738 года. Anon.
Википедия не является органом стандартизации. В случае сомнений используйте стандарт. John Saunders

Ваш Ответ

1   ответ
40

Ответ лежит в документе RFC 3986, в частностиРаздел 3.4.

Компонент запроса обозначается символом первого вопросительного знака («?») И оканчивается символом знака числа («#») или концом URI.

...

Косая черта ("/") и знак вопроса ("?") Могут представлять данные в компоненте запроса.

Технически RFC 3976-3.4 определяет компонент запроса как:

query       = *( pchar / "/" / "?" )

Этот синтаксис означает, что запрос может включать все символы изpchar так же как/ а также?. pchar относится к другой спецификации символов пути. Услужливо,Приложение в RFC 3986 перечислены соответствующие определения ABNF, в частности:

query         = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

Таким образом, в дополнение ко всембуквенно-цифровые символы и символы в процентахзапрос может по закону включать следующие незакодированные символы:

/ ? : @ - . _ ~ ! $ & ' ( ) * + , ; =

Конечно, вы можете иметь в виду, что '=' и '&' обычно имеют особое значение в запросе.

Примечание: помимо= а также&серверная часть может ограничивать другие юридически не кодированные символы строки запроса, такие как. (точка) в PHP, где он будет заменен на_ (подчеркивание) в$_GET а также$_POST, Увидеть:stackoverflow.com/questions/68651/... (также есть обходной путь). GitaarLAB

Похожие вопросы