GET 参数中允许的字符
Posted
技术标签:
【中文标题】GET 参数中允许的字符【英文标题】:Characters allowed in GET parameter 【发布时间】:2010-11-30 03:30:56 【问题描述】:GET 参数中允许哪些字符无需编码或转义?我的意思是这样的:
http://www.example.org/page.php?name=XYZ
除了 XYZ,你还能有什么?我认为只有以下几个字符:
a-z (A-Z) 0-9 - _这是完整列表还是允许使用其他字符?
我希望你能帮助我。提前致谢!
【问题讨论】:
HTTP URL - allowed characters in parameter names的可能重复 @j0k:没有真正的欺骗,因为在其他问题中需要转义,而不是在这里,希望避免的地方。 【参考方案1】:"." | "!" | "~" | "*" | "'" | "(" | ")"
也可以接受[RFC2396]。确实,如果编码正确,任何东西都可以包含在 GET 参数中。
【讨论】:
但它们有特殊含义,所以如果你想发送 % 或 + 你必须对它们进行编码。 是的,我不知道我为什么要写 % 谢谢!我只想知道哪些字符可以在不编码或转义的情况下使用。我应该更好地指出这一点。那么我真的可以使用 *!'()|不编码?【参考方案2】:字母数字字符和所有的
~
-
_
.
!
*
'
(
)
,
在 URL 中有效。
所有其他字符都必须编码。
【讨论】:
谢谢,您已经正确理解了一切。我想知道哪些字符可以在不编码的情况下使用。你确定!*'()是这样的字符吗? ctford 的回答参考了 RFC-1738,美元符号也是一个不需要编码的特殊字符。【参考方案3】:有保留字符,它们具有保留的含义,它们是分隔符 - :/?#[]@
- 和子分隔符 - !$&'()*+,;=
还有一组称为未保留字符的字符——字母数字和-._~
——不需要编码。
这意味着,任何不属于未保留字符集的东西都应该是 % 编码,当它们没有特殊含义时(例如,当作为 GET
参数的一部分传递时) em>。
另见RFC3986: Uniform Resource Identifier (URI): Generic Syntax
【讨论】:
非常感谢!所以我必须添加 .和〜我的名单?我可以写 index.php?page=start_en-new~。没有逃脱它? 说你不能,但你不应该这样说有点太大胆了。如果您要规范化 URI,您将 必须 转义未保留的字符(并且仅是未保留的),但它很可能实际上会工作未转义。 一般来说,你有转义函数,可以转义所有需要转义的东西。你通常使用这个函数来转义你传递的所有参数。 天啊,我没有仔细看你的例子。我认为那只是一堆通用的特殊字符;-) 不,当然,您不必逃避这些,因为它们是毫无保留的。很抱歉造成混乱。至于urlencode()
,我不知道它是否正常工作——PHP 函数并非总是如此——但如果是这样,你可以用它进行测试;-) 就像我说的那样——逃避一切,但没有保留。
RFC 说实际上允许不转义字符 /
和 ?
。我正在查找这个,因为 Swift 没有在他们的 stringByAddingPercentEncodingForURLQueryParameter
方法中逃避这些! (显然是正确的)【参考方案4】:
来自RFC 1738 允许在 URL 中使用哪些字符:
仅限字母数字、特殊字符“$-_.+!*'()”和 可以使用用于保留目的的保留字符 在 URL 中未编码。
保留字符是“;”、“/”、“?”、“:”、“@”、“=”和“&”,这意味着如果您想使用它们,您需要对它们进行 URL 编码.
【讨论】:
谢谢!你确定我可以使用 $+!'()" 而不转义它们吗? RFC 1738 已过时,请参阅 rfc-editor.org/info/rfc1738【参考方案5】:我在 bash 中使用 Chrome 地址栏和 $QUERY_STRING
进行了测试,并观察到以下情况:
~!@$%^&*()-_=+[]\|;:',./?
和 grave (backtick)
以明文形式传递。
、
"
、<
和>
分别转换为%20
、%22
、%3C
和%3E
。
#
被忽略,因为它被你的老anchor 使用。
就个人而言,我会说咬紧牙关并使用 base64 进行编码:)
【讨论】:
您提到的这些字符可能是在 html 中转义的字符,而不是查询字符串。我不相信=,?和 & 可以纯文本传递。 感谢您的努力,但这对我们来说真的没有多大意义,因为保留字符今天可以被 Chrome 接受,但明天不能,或者其他客户可能会拒绝它们 - 使用官方定义更安全是:ALPHA / DIGIT / “-” / “.” / “_” / “~”
【参考方案6】:
所有关于 URI 编码的规则(包含 URN 和 URL)都在 RFC1738 和 RFC3986 中指定,这里有一个 TL;这些冗长乏味的文档的 DR:
百分比编码,也称为 URL 编码,是一种在特定情况下对 URI 中的信息进行编码的机制。 URI 中允许的字符要么是保留的,要么是非保留的。保留字符是那些有时具有特殊含义的字符,但它们并不是唯一需要编码的字符。
有 66 个非保留字符不需要任何编码:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~
有18个保留字符需要编码:!*'();:@&=+$,/?#[]
,其他字符都必须编码。
要对字符进行百分比编码,只需将 "%" 及其 ASCII 值连接到 十六进制。 php 函数“urlencode”和“rawurlencode”为您完成这项工作。
【讨论】:
【参考方案7】:问题询问在 GET 参数中允许哪些字符而不对其进行编码或转义。
根据RFC3986(通用 URL 语法)和RFC7230, section 2.7.1(HTTP/S URL 语法),您需要进行百分比编码的唯一字符是 query 集之外的字符,请参阅定义如下。
但是,还有其他规范,例如 HTML5、Web forms, and the obsolete Indexed search、W3C 推荐。这些文档为某些字符添加了特殊含义,尤其是像 = & + ; 这样的符号。
此处的其他答案表明应对大多数保留字符进行编码,包括“/”“?”。这是不正确的。事实上,RFC3986, section 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
除非特殊符号 = & ;是 key=value 分隔符。
允许对其他字符进行编码,但不是必需的。
【讨论】:
不存在于“子分隔符”集中意味着"!" / "$" / "&" ...
“被用作组件的分隔符或组件内”。因此应该进行百分比编码?
子分隔符不是查询中的分隔符,因此不应转义。以上是关于GET 参数中允许的字符的主要内容,如果未能解决你的问题,请参考以下文章