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

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

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

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

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

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

Это полный список или допустимы ли дополнительные символы?

Надеюсь, ты поможешь мне. Спасибо заранее!

4b9b3361

Ответ 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, если он правильно закодирован.