GET 参数中允许的字符

Posted

技术标签:

【中文标题】GET 参数中允许的字符【英文标题】:Characters allowed in GET parameter 【发布时间】:2010-11-30 03:30:56 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

HTTP URL - allowed characters in parameter names的可能重复 @j0k:没有真正的欺骗,因为在其他问题中需要转义,而不是在这里,希望避免的地方。 【参考方案1】:

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

【讨论】:

但它们有特殊含义,所以如果你想发送 % 或 + 你必须对它们进行编码。 是的,我不知道我为什么要写 % 谢谢!我只想知道哪些字符可以在不编码或转义的情况下使用。我应该更好地指出这一点。那么我真的可以使用 *!'()|不编码?【参考方案2】:

字母数字字符和所有的

~-_.!*'(),

在 URL 中有效。

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

【讨论】:

谢谢,您已经正确理解了一切。我想知道哪些字符可以在不编码的情况下使用。你确定!*'()是这样的字符吗? ctford 的回答参考了 RFC-1738,美元符号也是一个不需要编码的特殊字符。【参考方案3】:

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

还有一组称为未保留字符的字符——字母数字和-._~——不需要编码。

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

另见RFC3986: Uniform Resource Identifier (URI): Generic Syntax

【讨论】:

非常感谢!所以我必须添加 .和〜我的名单?我可以写 index.php?page=start_en-new~。没有逃脱它? 说你不能,但你不应该这样说有点太大胆了。如果您要规范化 URI,您将 必须 转义未保留的字符(并且仅是未保留的),但它很可能实际上会工作未转义。 一般来说,你有转义函数,可以转义所有需要转义的东西。你通常使用这个函数来转义你传递的所有参数。 天啊,我没有仔细看你的例子。我认为那只是一堆通用的特殊字符;-) 不,当然,您不必逃避这些,因为它们是毫无保留的。很抱歉造成混乱。至于urlencode(),我不知道它是否正常工作——PHP 函数并非总是如此——但如果是这样,你可以用它进行测试;-) 就像我说的那样——逃避一切,但没有保留。 RFC 说实际上允许不转义字符 /?。我正在查找这个,因为 Swift 没有在他们的 stringByAddingPercentEncodingForURLQueryParameter 方法中逃避这些! (显然是正确的)【参考方案4】:

来自RFC 1738 允许在 URL 中使用哪些字符:

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

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

【讨论】:

谢谢!你确定我可以使用 $+!'()" 而不转义它们吗? RFC 1738 已过时,请参阅 rfc-editor.org/info/rfc1738【参考方案5】:

我在 bash 中使用 Chrome 地址栏和 $QUERY_STRING 进行了测试,并观察到以下情况:

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

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

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

就个人而言,我会说咬紧牙关并使用 base64 进行编码:)

【讨论】:

您提到的这些字符可能是在 html 中转义的字符,而不是查询字符串。我不相信=,?和 & 可以纯文本传递。 感谢您的努力,但这对我们来说真的没有多大意义,因为保留字符今天可以被 Chrome 接受,但明天不能,或者其他客户可能会拒绝它们 - 使用官方定义更安全是:ALPHA / DIGIT / “-” / “.” / “_” / “~”【参考方案6】:

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

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

有 66 个非保留字符不需要任何编码: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~

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

要对字符进行百分比编码,只需将 "%" 及其 ASCII 值连接到 十六进制。 php 函数“urlencode”和“rawurlencode”为您完成这项工作。

【讨论】:

【参考方案7】:

问题询问在 GET 参数中允许哪些字符而不对其进行编码或转义

根据RFC3986(通用 URL 语法)和RFC7230, section 2.7.1(HTTP/S URL 语法),您需要进行百分比编码的唯一字符是 query 集之外的字符,请参阅定义如下。

但是,还有其他规范,例如 HTML5、Web forms, and the obsolete Indexed search、W3C 推荐。这些文档为某些字符添加了特殊含义,尤其是像 = & + ; 这样的符号。

此处的其他答案表明应对大多数保留字符进行编码,包括“/”“?”。这是不正确的。事实上,RFC3986, section 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 分隔符。

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

【讨论】:

不存在于“子分隔符”集中意味着"!" / "$" / "&" ...“被用作组件的分隔符或组件内”。因此应该进行百分比编码? 子分隔符不是查询中的分隔符,因此不应转义。

以上是关于GET 参数中允许的字符的主要内容,如果未能解决你的问题,请参考以下文章

Python 函数名中允许的字符

如何限制文本框中允许的字符数?

php数组键中允许的字符?

限制表单输入文本字段中允许的字符数

node.js中允许的app对象声明方式

Google ID C2DM 中允许的字符