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

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

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

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

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

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

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

【问题讨论】:

标签: parameters get special-characters character


【解决方案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 编码.

【讨论】:

【解决方案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 分隔符。

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

    【讨论】:

    • 不存在于“子分隔符”集中意味着"!" / "$" / "&" ...“被用作组件的分隔符或组件内”。因此应该进行百分比编码?
    • 子分隔符不是查询中的分隔符,因此不应转义。
    猜你喜欢
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多