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