Символы, разрешенные в параметре GET
-
12-09-2019 - |
Вопрос
Какие символы разрешены в параметрах GET без их кодирования или экранирования?Я имею в виду что-то вроде этого:
http://www.example.org/page.php?name=XYZ
Что у вас может быть там вместо XYZ?Я думаю, что только следующие символы:
- a-z (A-Z)
- 0-9
- -
- _
Это полный список или допускаются дополнительные символы?
Я надеюсь, что вы сможете мне помочь.Заранее спасибо!
Решение
Есть зарезервированные символы, которые имеют зарезервированное значение, это разделители — :/?#[]@
— и субразделители — !$&'()*+,;=
Существует также набор символов под названием незарезервированные символы — буквенно-цифровые и -._~
— которые не подлежат кодированию.
Что означает, что все, что не принадлежит к набору незарезервированных символов, должно быть закодировано в %, если оно не имеет специального значения (например,когда он был принят как часть GET
параметр).
Смотрите также RFC3986:Единый идентификатор ресурса (URI):Общий синтаксис
Другие советы
Вопрос заключается в том, какие символы являются разрешено в параметрах GET без их кодирования или экранирования.
Согласно RFC3986 (общий синтаксис URL-адреса) и RFC7230, раздел 2.7.1 (Синтаксис URL HTTP / S) единственные символы, которые вам нужно кодировать в процентах, - это символы за пределами запрос установите, смотрите определение ниже.
Однако существуют дополнительные спецификации, такие как HTML5, Веб-формы и устаревший индексированный поиск, рекомендация W3C.Эти документы придают особое значение некоторым символам, в частности, таким символам, как = & + ;.
Другие ответы здесь предполагают, что большинство зарезервированных символов должны быть закодированы, включая "/" "?".Это неверно.На самом деле, RFC3986, раздел 3.4 не рекомендуется использовать процентную кодировку символов "/" "?".
иногда лучше для юзабилити, чтобы избежать процентов- кодирования этих символов.
RFC3986 определяет компонент запроса как:
query = *( pchar / "/" / "?" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
Механизм процентного кодирования используется для представления октета данных в компоненте, когда соответствующий символ этого октета находится за пределами разрешенного набора или используется в качестве разделителя компонента или внутри него.
Вывод заключается в том, что часть XYZ должна кодировать:
special: # % = & ;
Space
out of query set: [ ]
non ASCII encodable characters
Если только специальные символы = & ;являются ключ=значение сепараторы.
Кодирование других символов разрешено, но не обязательно.
От RFC 1738 о том, какие символы разрешены в URL-адресах:
В URL-адресе могут использоваться только буквенно-цифровые обозначения, специальные символы "$-_.+!*'(),", и зарезервированные символы, используемые для их зарезервированных целей в незашифрованном виде.
Зарезервированными символами являются ";", "/", "?", ":", "@", "=" и "&", что означает, что вам нужно будет закодировать их по URL, если вы хотите их использовать.
Буквенно-цифровые символы и все
~
-
_
.
!
*
'
(
)
,
действительны в пределах URL-адреса.
Все остальные символы должны быть закодированы.
Я провел тест, используя адресную строку Chrome и $QUERY_STRING
в bash и заметил следующее:
~!@$%^&*()-_=+[{]}\|;:',./?
и grave (backtick)
передаются как открытый текст.
,
"
, <
и >
конвертируются в %20
, %22
, %3C
и %3E
соответственно.
#
игнорируется, так как он используется старыми якорь.
Лично я бы посоветовал стиснуть зубы и кодировать с помощью base64 :)
Все правила, касающиеся кодирования URI (которые содержат URNS и URL-адреса), указаны в RFC1738 и RFC3986, вот TL; DR этих длинных и скучных документов:
Процентное кодирование, также известное как кодирование URL-адресов, представляет собой механизм кодирования информации в URI при определенных обстоятельствах.Символы, разрешенные в URI, либо зарезервированы, либо не защищены вовсе.Зарезервированные символы - это те символы, которые иногда имеют особое значение, но они не единственные символы, которые нуждаются в кодировании.
Существует 66 незарегистрированных символов, которые не нуждаются в какой-либо кодировке:abcdefghiklmopqrstuvwABCDEFGHIKLMOPQRSTUVWXYZ0123456789-_.~
Есть 18 зарезервированных символов, которые необходимо закодировать: !*'();:@&=+$,/?#[]
, а все остальные символы должны быть закодированы.
Чтобы закодировать символ в процентах, просто объедините "%" и его значение ASCII в шестнадцатеричном формате.php-функции "urlencode" и "rawurlencode" выполняют эту работу за вас.
"." | "!" | "~" | "*" | "'" | "(" | ")"
также приемлемы [RFC2396].На самом деле, в параметре GET может быть что угодно, если оно правильно закодировано.