GET参数中允许的字符

时间:2009-09-21 16:59:08

标签: parameters get special-characters character

GET参数中允许哪些字符而不编码或转义它们?我的意思是这样的:

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

你能在那里找到什么而不是XYZ?我认为只有以下字符:

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

这是完整列表还是允许其他字符?

我希望你能帮助我。提前谢谢!

7 个答案:

答案 0 :(得分:79)

保留字符,具有保留含义,分隔符为 :/?#[]@ - 和subdelimiters - !$&'()*+,;= < /强>

还有一组名为无保留字符的字符 - 字母数字和 -._~ - 不需要编码。

这意味着,任何不属于非保留字符集的东西都应该是%编码的,当它们没有特殊含义时(例如当作为GET参数的一部分传递时)

另见RFC3986: Uniform Resource Identifier (URI): Generic Syntax

答案 1 :(得分:7)

问题是在没有编码或转义它们的情况下询问GET参数中哪些字符

根据RFC3986(一般网址语法)和RFC7230, section 2.7.1(HTTP / S网址语法),百分比编码所需的唯一字符是查询之外的字符>设置,请参阅下面的定义。

但是,还有其他规范,如HTML5,Web forms, and the obsolete Indexed search,W3C推荐。这些文档特别为某些字符添加了特殊含义,如 =&amp; amp; +;

这里的其他答案表明大多数保留字符应该被编码,包括“/”“?”。那不对。事实上,RFC3986, section 3.4建议不要使用百分比编码“/”“?”字符。

  

有时可以更好地避免百分比 -   编码那些字符。

RFC3986将查询组件定义为:

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

百分比编码机制用于表示a中的数据八位字节      当八位位组的相应字符在...之外时的组件      允许设置或被用作的分隔符或内部分隔符      成分

结论是XYZ部分应编码:

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

除非特殊符号 =&amp; ;是 key = value 分隔符。

允许编码其他字符,但不是必需的。

答案 2 :(得分:4)

字母数字字符和所有

~ - _ . ! * ' ( ) {{ 1}}

在网址中有效。

必须对所有其他字符进行编码。

答案 3 :(得分:4)

来自RFC 1738的网址中允许使用哪些字符:

  

只有字母数字,特殊字符“$ -_。+!*'(),”和      可以使用用于其保留目的的保留字符      在URL中未编码。

保留字符为“;”,“/”,“?”,“:”,“@”,“=”和“&amp;”,这意味着如果您希望使用,则需要对它们进行URL编码它们。

答案 4 :(得分:4)

我使用Chrome地址栏和bash中的$QUERY_STRING进行了测试,并观察了以下内容:

~!@$%^&*()-_=+[{]}\|;:',./?grave (backtick)以纯文本形式传递。

"<>转换为%20%22%3C和{{1}分别。

%3E会被忽略,因为它由anchor使用。

就个人而言,我会说咬一口并用base64编码:)

答案 5 :(得分:2)

所有关于URI编码的规则(包含URN和URL)都在RFC1738和RFC3986中指定,这里是TL;这些冗长乏味的文档的DR:

百分比编码(也称为URL编码)是一种在特定情况下对URI中的信息进行编码的机制。 URI中允许的字符是保留的或未保留的。保留字符是那些有时具有特殊含义的字符,但它们不是唯一需要编码的字符。

有66个无保留字符,不需要任何编码: abcdefghiklmopqrstuvwABCDEFGHIKLMOPQRSTUVWXYZ0123456789-_.~

有18个保留字符需要编码:!*'();:@&=+$,/?#[],所有其他字符必须编码。

对字符进行百分比编码,只需连接“%”及其ASCII值即可 十六进制。 php函数“urlencode”和“rawurlencode”为你完成这项工作。

答案 6 :(得分:0)

"." | "!" | "~" | "*" | "'" | "(" | ")"也可以接受[RFC2396]。实际上,如果编码正确,任何东西都可以在GET参数中。