GET参数中允许的字符

caw*_*caw 57 parameters get character special-characters

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

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

你有什么可以而不是XYZ?我认为只有以下字符:

  • az(AZ)
  • 0-9
  • -
  • _

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

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

Mic*_*ker 84

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

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

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

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

  • 如果说你做不到,那么声明有点过于大胆,但你不应该.如果你要对URI进行规范化,你必须*来转义未保留的字符(并且只保留未预留的字符),但很可能它实际上*工作*未转义. (3认同)
  • 非常感谢!所以我必须添加 . 和〜到我的名单?我可以写index.php吗?page=start_en-new~。不逃避吗? (2认同)
  • 天哪,我没有仔细看过你的例子.我认为这只是一群特殊的特殊字符;-)不,你不必逃避那些,当然,因为它们是毫无保留的.抱歉混淆.至于`urlencode()`我不知道它是否正常工作 - 它并不总是PHP函数的情况 - 但如果确实如此,你可以测试它;-)就像我说的那样 - 逃避一切但是没有保留. (2认同)

dmi*_*tri 13

该问题询问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 / "-" / "." / "_" / "~" 
Run Code Online (Sandbox Code Playgroud)

百分比编码机制用于表示当该八位位组的相应字符在允许的集合之外或者被用作该组件的分隔符或在该组件内时的组件中的数据八位字节.

结论是XYZ部分应编码:

special: # % = & ;
Space
sub-delims
out of query set: [ ]
non ASCII encodable characters
Run Code Online (Sandbox Code Playgroud)

除非特殊符号 =&; 是 key =值分隔符.

允许编码其他字符但不是必需的.


Nin*_*liu 6

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

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

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

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

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


ctf*_*ord 5

RFC 1738开始,URL 中允许使用字符:

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

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


jim*_*try 5

我使用Chrome地址栏和$QUERY_STRINGbash中的a 进行了测试,并观察到以下内容:

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

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

#被忽略,因为它由ye olde anchor使用

就个人而言,我想说一下,并使用base64进行编码:)