Pergunta

Que caracteres são permitidos em parâmetros GET sem codificação ou fugir deles? Quero dizer algo como isto:

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

O que você pode ter lá em vez de XYZ? Eu acho que apenas os seguintes caracteres:

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

Não é a lista completa ou existem caracteres adicionais autorizados?

Eu espero que você possa me ajudar. Agradecemos antecipadamente!

Foi útil?

Solução

Existem caracteres reservados , que têm um significado reservadas, esses são delimitadores - :/?#[]@ - e subdelimiters - !$&'()*+,;=

Há também um conjunto de caracteres chamado Caracteres não-reservados - alfanuméricos e -._~ -. Que não estão a ser codificados

Isso significa, que qualquer coisa que não pertence a personagens francos conjunto é suposto ser codificado pelo%, quando eles não têm significado especial (por exemplo, quando passado como parte do parâmetro GET) .

Veja também RFC3986: Uniform Resource Identifier (URI): Generic Syntax

Outras dicas

A pergunta que personagens são permitido em parâmetros GET sem codificação ou escapar deles .

De acordo com a RFC3986 (sintaxe geral URL) e RFC7230, seção 2.7.1 (HTTP / S URL sintaxe) os únicos personagens que você precisa por cento-codificar são aqueles fora do query set, ver a definição abaixo.

No entanto, existem especificações adicionais, como HTML5, formulários da Web, eo obsoleto indexados procurar , recomendação W3C. Esses documentos adicionar um significado especial para alguns personagens nomeadamente, aos símbolos como = & +;.

Outras respostas aqui sugerem que a maioria dos caracteres reservados devem ser codificados, incluindo "/" "?". Isso não é correto. Na verdade, RFC3986, secção 3.4 desaconselha por cento de codificação "/" " ?" caracteres.

às vezes é melhor para a usabilidade para evitar per- codificar esses caracteres.

RFC3986 define consulta componente como:

query       = *( pchar / "/" / "?" )
pchar       = unreserved / pct-encoded / sub-delims / ":" / "@"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims  = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~" 

Um mecanismo que codifica por cento é utilizado para representar um octeto de dados numa componente quando o personagem correspondente que do octeto está fora do permitido definir ou está a ser usado como um delimitador de, ou no interior, o componente.

A conclusão é que parte XYZ deve codificar:

special: # % = & ;
Space
out of query set: [ ]
non ASCII encodable characters

A menos símbolos especiais = &; são key = value separadores.

A codificação de outros caracteres é permitido, mas não é necessário.

A partir RFC 1738 em que são permitidos caracteres em URLs:

Apenas caracteres alfanuméricos, os caracteres especiais "$ -_. +! *" ()", e podem ser usados ??caracteres reservados utilizados para os seus fins reservados unencoded dentro de uma URL.

Os caracteres reservados são ";", "/", ":", "@", "=" e "&", que significa que você precisaria URL codificá-los se você quiser usá-los "?" .

Os caracteres alfanuméricos e todos

~ - _ . ! * ' ( ) ,

são válidos dentro de uma URL.

Todos os outros caracteres deve ser codificado.

Eu fiz um teste usando a barra de endereços do Chrome e uma $QUERY_STRING em bash, e observado o seguinte:

~!@$%^&*()-_=+[{]}\|;:',./? e grave (backtick) são passados ??através de texto simples.

, ", < e > são convertidos para %20, %22, %3C e %3E respectivamente.

# é ignorado, pois ele é usado por Ye Olde âncora .

Pessoalmente, eu diria que morder a bala e codificação com base64:)

Todas as regras relativas à codificação de URIs (que contém URNs e URLs) são especificados no RFC1738 ea RFC3986, aqui está uma TL; DR destes documentos longo e chato:

por cento de codificação, também conhecida como a codificação de URL, é um mecanismo para a codificação de informação em um URI sob certas circunstâncias. Os caracteres permitidos em um URI ou são reservados ou sem reservas. caracteres reservados são aqueles personagens que às vezes têm um significado especial, mas eles não são os únicos personagens que as necessidades de codificação.

Existem 66 caracteres sem reservas que não precisam de qualquer codificação: abcdefghiklmopqrstuvwABCDEFGHIKLMOPQRSTUVWXYZ0123456789-_.~

Existem 18 caracteres reservados que precisa ser codificado: !*'();:@&=+$,/?#[], e todos os outros personagens deve ser codificado

.

Para cento-codificar um personagem, simplesmente concatenar "%" e seu valor ASCII em hexadecimal. As funções php "UrlEncode" e "rawurlencode" fazer este trabalho para você.

"." | "!" | "~" | "*" | "'" | "(" | ")" também são aceitáveis ?? [RFC2396] . Realmente, qualquer coisa pode ser um parâmetro GET se for devidamente codificado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top