GET 参数中允许使用的字符

问题描述 投票:0回答:7

GET 参数中允许哪些字符无需编码或转义?我的意思是这样的:

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

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

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

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

http parameters get character special-characters
7个回答
133
投票

保留字符,它们具有保留的含义,它们是分隔符 —

:/?#[]@
— 和子分隔符 —
!$&'()*+,;=

还有一组字符称为 非保留字符 — 字母数字和

-._~
— 不进行编码。

这意味着,任何不属于非保留字符集的内容都应该是%编码的,当它们没有特殊含义时(例如,当作为

GET
参数的一部分传递时)

另请参阅 RFC3986:统一资源标识符 (URI):通用语法


25
投票

问题询问 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 分隔符。

允许对其他字符进行编码,但不是必需的。


8
投票

我使用 Chrome 地址栏和 bash 中的

$QUERY_STRING
进行了测试,并观察到以下内容:

~!@$%^&*()-_=+[{]}\|;:',./?
grave (backtick)
作为明文传递。

"
<
>
分别转换为
%20
%22
%3C
%3E

#
被忽略,因为它被老的 anchor 使用。

就我个人而言,我会说硬着头皮用base64编码:)


8
投票

所有有关 URI(包含 URN 和 URL)编码的规则都在 RFC1738 和 RFC3986 中指定,这里是这些冗长乏味文档的 TL;DR:

百分比编码,也称为 URL 编码,是在特定情况下对 URI 中的信息进行编码的机制。 URI 中允许的字符可以是保留的,也可以是非保留的。保留字符是那些有时具有特殊含义的字符,但它们不是唯一需要编码的字符。

有66个非保留字符不需要任何编码:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~

需要编码的保留字符有 18 个:

!*'();:@&=+$,/?#[]
,其他字符都必须编码。

要对字符进行百分比编码,只需将“%”与其十六进制的 ASCII 值连接起来即可。 php 函数

urlencode
rawurlencode
可以为您完成这项工作,还有 js 函数
encodeURIComponent
encodeURI


5
投票

来自 RFC 1738,其中 URL 中允许使用字符:

仅限字母数字、特殊字符“$-_.+!*'(),”和 可以使用用于其保留目的的保留字符 URL 中未编码。

保留字符为“;”、“/”、“?”、“:”、“@”、“=”和“&”,这意味着如果您想使用它们,则需要对其进行 URL 编码。


4
投票

字母数字字符和所有

~
-
_
.
!
*
'
(
)
,

在 URL 内有效。

所有其他字符都必须进行编码。


0
投票

"." | "!" | "~" | "*" | "'" | "(" | ")"
也可以接受 [RFC2396]。实际上,如果编码正确,任何内容都可以包含在 GET 参数中。

© www.soinside.com 2019 - 2024. All rights reserved.