Допустимые символы в параметре GET - PullRequest
53 голосов
/ 21 сентября 2009

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

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

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

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

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

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

Ответы [ 7 ]

79 голосов
/ 21 сентября 2009

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

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

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

См. Также RFC3986: универсальный идентификатор ресурса (URI): общий синтаксис

8 голосов
/ 21 марта 2018

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

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

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

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

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

4 голосов
/ 18 декабря 2013

Я провел тест с использованием адресной строки Chrome и $QUERY_STRING в bash и заметил следующее:

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

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

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

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

4 голосов
/ 21 сентября 2009

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

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

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

4 голосов
/ 21 сентября 2009

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

~ - _ . ! * ' ( ) ,

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

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

2 голосов
/ 20 сентября 2017

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

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

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

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

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

0 голосов
/ 21 сентября 2009

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

...