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

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

那里除了 XYZ 之外还能有什么?我认为只有以下字符:

  • a-z (A-Z)
  • 0-9
  • -
  • _

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

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

有帮助吗?

解决方案

保留字符, ,具有保留含义,这些是分隔符 - :/?#[]@ — 和子分隔符 — !$&'()*+,;=

还有一组字符称为 非保留字符 — 字母数字和 -._~ — 不进行编码。

这意味着,那 任何不属于非保留字符集的东西都应该是%编码的,当它们没有特殊含义时(例如当作为一部分传递时 GET 范围).

也可以看看 RFC3986:统一资源标识符 (URI):通用语法

其他提示

问题问的是哪些字符 允许在 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 参数中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top