GET 参数中允许哪些字符而不编码或转义它们?我的意思是这样的:
http://www.example.org/page.php?name=XYZ
那里可以有什么来代替 XYZ?我认为只有以下字符:
- 阿兹 (AZ)
- 0-9
- -
- _
这是完整列表还是允许使用其他字符?
我希望你能帮助我。提前致谢!
GET 参数中允许哪些字符而不编码或转义它们?我的意思是这样的:
http://www.example.org/page.php?name=XYZ
那里可以有什么来代替 XYZ?我认为只有以下字符:
这是完整列表还是允许使用其他字符?
我希望你能帮助我。提前致谢!
有保留字符,具有保留含义,它们是定界符 — :/?#[]@
— 和子定界符 —!$&'()*+,;=
还有一组称为非保留字符的字符——字母数字和-._~
——不被编码。
这意味着,任何不属于未保留字符集的东西都应该是 % 编码的,当它们没有特殊含义时(例如,当作为GET
参数的一部分传递时)。
该问题询问在 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
除非特殊符号= & ; 是 键=值分隔符。
允许对其他字符进行编码,但不是必需的。
我使用 Chrome 地址栏和$QUERY_STRING
in bash 进行了测试,并观察到以下内容:
~!@$%^&*()-_=+[{]}\|;:',./?
并grave (backtick)
以明文形式传递。
,
"
,<
和>
分别转换为%20
, %22
,%3C
和%3E
。
#
被忽略,因为它被 ye olde anchor使用。
就个人而言,我会说咬紧牙关并使用base64进行编码:)
所有关于 URI 编码的规则(包含 URN 和 URL)都在 RFC1738 和 RFC3986 中指定,这里是这些冗长而无聊的文档的 TL;DR:
百分比编码,也称为 URL 编码,是一种在特定情况下对 URI 中的信息进行编码的机制。URI 中允许的字符要么是保留的,要么是非保留的。保留字符是那些有时具有特殊含义的字符,但它们并不是唯一需要编码的字符。
有 66 个未保留字符不需要任何编码:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~
有18个保留字符需要编码:!*'();:@&=+$,/?#[]
,其他所有字符都必须编码。
要对字符进行百分比编码,只需将“%”及其十六进制的 ASCII 值连接起来。php 函数“urlencode”和“rawurlencode”为您完成这项工作。
来自RFC 1738,其中允许在 URL 中使用字符:
只有字母数字、特殊字符“$-_.+!*'()”和用于其保留目的的保留字符可以在 URL 中未编码使用。
保留字符是“;”、“/”、“?”、“:”、“@”、“=”和“&”,这意味着如果你想使用它们,你需要对它们进行 URL 编码。
字母数字字符和所有
~
-
_
.
!
*
'
(
)
,
在 URL 中有效。
所有其他字符都必须进行编码。
"." | "!" | "~" | "*" | "'" | "(" | ")"
也可以接受[RFC2396]。实际上,如果正确编码,任何东西都可以在 GET 参数中。