GET 参数中允许哪些字符无需编码或转义?我的意思是这样的:
http://www.example.org/page.php?name=XYZ
除了 XYZ 之外,你还能有什么?我认为只有以下字符:
a-z (A-Z)
0-9
-
_
这是完整列表还是还允许使用其他字符?
有 保留字符,它们具有保留的含义,它们是分隔符 —
:/?#[]@
— 和子分隔符 — !$&'()*+,;=
还有一组字符称为 非保留字符 — 字母数字和
-._~
— 不进行编码。
这意味着,任何不属于非保留字符集的内容都应该是%编码的,当它们没有特殊含义时(例如,当作为
GET
参数的一部分传递时)。
问题询问 GET 参数中允许使用哪些字符,而无需对其进行编码或转义。
根据 RFC3986(通用 URL 语法)和 RFC7230,第 2.7.1 节(HTTP/S URL 语法),您需要进行百分比编码的唯一字符是 query 集之外的字符,请参阅下面的定义.
但是,还有其他规范,例如 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
除非特殊符号 = & ;是 key=value 分隔符。
允许对其他字符进行编码,但不是必需的。
我使用 Chrome 地址栏和 bash 中的
$QUERY_STRING
进行了测试,并观察到以下内容:
~!@$%^&*()-_=+[{]}\|;:',./?
和 grave (backtick)
作为明文传递。
、"
、<
和>
分别转换为%20
、%22
、%3C
和%3E
。
#
被忽略,因为它被老的 anchor 使用。
就我个人而言,我会说硬着头皮用base64编码:)
所有有关 URI(包含 URN 和 URL)编码的规则都在 RFC1738 和 RFC3986 中指定,这里是这些冗长乏味文档的 TL;DR:
百分比编码,也称为 URL 编码,是在特定情况下对 URI 中的信息进行编码的机制。 URI 中允许的字符可以是保留的,也可以是非保留的。保留字符是那些有时具有特殊含义的字符,但它们不是唯一需要编码的字符。
有66个非保留字符不需要任何编码:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~
需要编码的保留字符有 18 个:
!*'();:@&=+$,/?#[]
,其他字符都必须编码。
要对字符进行百分比编码,只需将“%”与其十六进制的 ASCII 值连接起来即可。 php 函数
urlencode
和 rawurlencode
可以为您完成这项工作,还有 js 函数 encodeURIComponent
和 encodeURI
。
来自 RFC 1738,其中 URL 中允许使用字符:
仅限字母数字、特殊字符“$-_.+!*'(),”和 可以使用用于其保留目的的保留字符 URL 中未编码。
保留字符为“;”、“/”、“?”、“:”、“@”、“=”和“&”,这意味着如果您想使用它们,则需要对其进行 URL 编码。
字母数字字符和所有
~
-
_
.
!
*
'
(
)
,
在 URL 内有效。
所有其他字符都必须进行编码。
"." | "!" | "~" | "*" | "'" | "(" | ")"
也可以接受 [RFC2396]。实际上,如果编码正确,任何内容都可以包含在 GET 参数中。