Символы, разрешенные в параметре GET

какие символы разрешены в параметрах GET без кодирования или экранирования их? Я имею в виду что-то вроде этого:

http://www.example.org/page.php?name=XYZ

Что вы можете иметь там вместо XYZ? Я думаю только следующие символы:

  • a-z (A-Z)
  • 0-9
  • -
  • _

Это полный список или разрешены дополнительные символы?

I надеюсь, вы сможете мне помочь. Заранее спасибо!

7 ответов


здесь зарезервированные символы, которые имеют зарезервированные значения, являются разделителями -:/?#[]@ - и subdelimiters - !$&'()*+,;=

существует также набор символов под названием незарезервированных символов - буквенно-цифровые и -._~ - которые не должны быть закодированы.

Это означает, что все, что не принадлежит к незащищенному набору символов, должно быть % - закодировано, когда они это делают не имеют специального значения (например, при передаче в составе


с RFC 1738 на которых символы разрешены в URL-адресах:

только буквенно-цифровые, специальные символы"$ -_.+!*'(),", и зарезервированные символы, используемые для зарезервированных целей unencoded внутри URL.

зарезервированные символы ";", "/", "?", ":", "@", "=" и"&", что означает, что вам нужно будет кодировать их URL, если вы хотите их использовать.


Я сделал тест, используя адресную строку chrome и $QUERY_STRING в Баш, и заметил следующее:

~!@$%^&*()-_=+[{]}\|;:',./? и grave (backtick) передаются как открытый текст.

, ", < и > превращается в %20, %22, %3C и %3E соответственно.

# игнорируется, так как он используется ye olde якорь.

лично я бы сказал, укусить пулю и кодировать с base64:)


буквенно-цифровые символы и все

~ - _ . ! * ' ( ) ,

действительны в пределах URL.

все остальные символы должны быть закодированы.


все правила, касающиеся кодирования URIs (который содержит урны и URL-адреса), указаны в RFC1738 и RFC3986, вот TL; DR этих длинных и скучных документов:

процентное кодирование, также известное как кодирование URL, является механизмом кодирования информации в URI при определенных обстоятельствах. Символы, разрешенные в URI, зарезервированы или не обслуживаются. Зарезервированные символы-это те символы, которые иногда имеют особое значение, но они не единственные символы, которые нуждаются в кодировке.

есть 66 неограниченных символов, которые не нуждаются в кодировке: abcdefghiklmopqrstuvwABCDEFGHIKLMOPQRSTUVWXYZ0123456789-_.~

есть 18 зарезервированных символов, которые должны быть закодированы:!*'();:@&=+$,/?#[], а все остальные символы должны быть закодированы.

для процентного кодирования символа просто объедините " % " и его значение ASCII в шестнадцатиричный. Функции php "urlencode" и "rawurlencode" выполняют эту работу за вас.


вопрос задает, какие символы разрешено получать параметры без кодирования или экранирования их.

по данным RFC3986 (общий синтаксис URL) и RFC7230, раздел 2.7.1 (синтаксис URL HTTP/S) единственными символами, которые вам нужно процентно кодировать, являются те, которые находятся за пределами запрос set, см. Определение ниже.

однако есть дополнительные спецификации, такие как 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

Если специальные символы = &; are ключ=значение сепараторы.

кодирование других символов разрешено, но не обязательно.


"." | "!" | "~" | "*" | "'" | "(" | ")" также являются приемлемыми [RFC2396]. Действительно, все может быть в параметре GET, если он правильно закодирован.