Подтвердить что ты не робот

Какие символы должны быть экранированы в строке запроса HTTP?

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

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

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

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

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

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

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

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

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

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

Выводы

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

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

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

4b9b3361

Ответ 1

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

Компонент запроса указан первым вопросом   mark ( "?" ) и заканчивается символом числа ( "#" )   или к концу URI.

...

Символы слэш ( "/" ) и вопросительный знак ( "?" ) могут представлять данные   в компоненте запроса.

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

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

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

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

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

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

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