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