GET参数中允许的字符


72

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

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

除了XYZ之外,您还有什么?我认为只有以下几个字符:

  • AZ(AZ)
  • 0-9
  • --
  • _

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

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



2
@ j0k:不需要真正的欺骗,就像在另一个问题中一样,需要转义,而不是在此处避免在哪里避免。
马塞尔(Marcel)

Answers:


102

保留的字符,它们具有保留的含义,它们是定界符— :/?#[]@—和子定界符—!$&'()*+,;=

还有一组称为非保留字符的字符-字母数字和-._~-不会被编码。

这意味着,不属于未保留字符集的任何内容在没有特殊含义时(例如,作为GET参数的一部分传递时)都应进行%编码

另请参阅RFC3986:统一资源标识符(URI):通用语法


2
非常感谢你!所以我必须补充。和〜到我的清单?我可以写index.php?page = start_en-new〜。没有逃脱吗?
caw

3
声明您不能,但您不应该这样,这有点太大胆了。如果要规范化URI,必须转义未保留的字符(并且仅转储未保留的字符),但是很有可能实际上可以不转义地工作
Michael Krelin-黑客

通常,您具有转义功能,可以转义所有需要转义的内容。通常,您可以使用此函数对所有传递的参数进行转义。
Michael Krelin-黑客

2
天哪,我没有仔细研究您的例子。我以为那只是一堆特殊字符;-)不,您当然不必逃避那些,因为它们是未保留的。抱歉造成混乱。至于urlencode()我不知道它是否可以正常工作-PHP函数并不总是这样-但如果可以,则可以使用它进行测试;-)就像我说的那样-保留所有内容,但保留所有内容。
Michael Krelin-黑客

1
RFC表示实际上允许不转义字符/?。我一直在寻找它,因为Swift不会在他们的stringByAddingPercentEncodingForURLQueryParameter方法中逃脱这些!(正确地,显然)
StijnSpijker '16

15

该问题询问GET参数允许哪些字符,而不对它们进行编码或转义

根据RFC3986(通用URL语法)和RFC7230,第2.7.1节(HTTP / S URL语法),唯一需要百分比编码的字符是查询集之外的字符,请参见下面的定义。

但是,还有其他规范,例如HTML5,Web表单和过时的索引搜索(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
sub-delims
out of query set: [ ]
non ASCII encodable characters

除非特殊符号=&; 是 键=值分隔符。

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


在“ sub-delims”集中不存在是指"!" / "$" / "&" ...“被用作组件的定界符或内部组件”。因此应该进行百分比编码?
lmsurprenant

7

我使用Chrome地址栏和一个$QUERY_STRINGbash进行了测试,并观察到以下内容:

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

"<>转换为%20%22%3C%3E分别。

#被忽略,因为它由ye olde anchor使用

就个人而言,我想说一下,并使用base64进行编码:)


您提到的这些字符可能是将在HTML中转义的字符,而不是查询字符串。我不相信= ,?和&可以以纯文本形式传递。
卢克·布鲁姆

感谢您的努力,但实际上对我们而言并不意味着什么,因为保留字符可以在今天(而不是明天)被Chrome接受,否则其他客户可以拒绝它们-更为正式的定义是:ALPHA / DIGIT / “-” / “.” / “_” / “~”
Muleskinner,

5

RFC 1738开始,URL中允许使用字符:

URL中只能使用字母数字,特殊字符“ $ -_。+!*'()”和用于保留目的的保留字符。

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


谢谢!您确定我可以使用$ +!'()“而不逃脱它们吗?
caw

RFC 1738已经过时了,看到rfc-editor.org/info/rfc1738
大卫Balažic

4

字母数字字符和所有

~ - _ . ! * ' ( ) ,

在URL中有效。

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


谢谢,您已正确理解所有内容。我想知道不用编码就可以使用哪些字符。您确定!*'()是这样的字符吗?
caw

根据ctford的回答(参考RFC-1738),美元符号也是不需要编码的特殊字符。
рüффп

3

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

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

有66个不需要任何编码的未保留字符: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~

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

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


0

"." | "!" | "~" | "*" | "'" | "(" | ")"也可以接受[RFC2396]。确实,只要编码正确,任何内容都可以包含在GET参数中。


但是它们具有特殊含义,因此,如果您想发送%或+,则必须对其进行编码。
EstebanKüber09年

是的,我不知道我为什么写%
geowa4

谢谢!我只想知道可以使用哪些字符而不进行编码或转义。我应该更好地指出这一点。我真的可以使用*!'()| 没有编码?
caw
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.