Вопрос

Какие символы разрешены в параметрах 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 может быть что угодно, если оно правильно закодировано.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top