GET 参数中允许的字符
-
12-09-2019 - |
题
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 语法)您需要进行百分比编码的唯一字符是那些在 询问 设置,参见下面的定义。
但是,还有其他规范,例如 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
out of query set: [ ]
non ASCII encodable characters
除非特殊符号 = & ;是 键=值 分隔符。
允许对其他字符进行编码,但不是必需的。
从 RFC 1738 URL 中允许使用哪些字符:
只有字母数字、特殊字符“$-_.+!*'(),”和 可以使用用于其保留目的的保留字符 在 URL 中未编码。
保留字符为“;”、“/”、“?”、“:”、“@”、“=”和“&”,这意味着如果您想使用它们,则需要对它们进行 URL 编码。
字母数字字符和所有
~
-
_
.
!
*
'
(
)
,
在 URL 内有效。
所有其他字符都必须进行编码。
我使用 Chrome 地址栏和 $QUERY_STRING
在 bash 中,观察到以下内容:
~!@$%^&*()-_=+[{]}\|;:',./?
和 grave (backtick)
作为明文传递。
,
"
, <
和 >
被转换为 %20
, %22
, %3C
和 %3E
分别。
#
被忽略,因为它被 ye olde 使用 锚.
就我个人而言,我会说硬着头皮使用 base64 进行编码:)
所有有关 URI(包含 URN 和 URL)编码的规则都在 RFC1738 和 RFC3986 中指定,以下是这些冗长乏味文档的 TL;DR:
百分比编码,也称为 URL 编码,是在特定情况下对 URI 中的信息进行编码的机制。URI 中允许的字符可以是保留的,也可以是非保留的。保留字符是那些有时具有特殊含义的字符,但它们不是唯一需要编码的字符。
有 66 个非保留字符不需要任何编码:abcdefghiklmopqrstuvwABCDEFGHIKLMOPQRSTUVWXYZ0123456789-_.~
有18个保留字符需要编码: !*'();:@&=+$,/?#[]
, ,并且所有其他字符都必须进行编码。
要对字符进行百分比编码,只需将“%”及其 ASCII 值连接起来 十六进制。php 函数“urlencode”和“rawurlencode”可以为您完成这项工作。
"." | "!" | "~" | "*" | "'" | "(" | ")"
也可以接受 [RFC2396]. 。实际上,如果编码正确,任何内容都可以包含在 GET 参数中。