【问题标题】:Why should I use urlencode?为什么要使用 urlencode?
【发布时间】:2011-06-07 18:21:52
【问题描述】:

我正在编写一个 Web 应用程序并学习如何对 html 链接进行 urlencode...

这里的所有 urlencode 问题(见下面的标签)都是“如何...?”问题。

我的问题不是“如何?”但是“为什么?”。

即使是维基百科的文章也只讨论了它的机制:
http://en.wikipedia.org/wiki/Urlencode 但不是为什么我应该在我的应用程序中使用 urlencode。

使用(或不使用)urlencode 的安全 含义是什么?

如何利用 urlencode 失败

未编码的网址会出现什么样的错误或故障?

我之所以问,是因为即使没有 urlencode,指向我的应用程序开发网站的链接也可以按预期工作,如下所示: http://myapp/my%20test/ée/ràé

为什么我应该使用 urlencode?​​em>

或者换一种说法:

何时我应该使用 urlencode?在什么样的情况下?

【问题讨论】:

标签: urlencode


【解决方案1】:

RFCs 定义了 URL 的格式,浏览器/Web 服务器开发人员将其作为解释数据的标准。如果您不遵守,结果可能无法预测。

HTTP URL 有它的规范,它指出实际上所有非拉丁字符都需要编码。

【讨论】:

    【解决方案2】:

    如果你的两条路径是这样的,你将如何区分

    http://myapp/my%20test/
    

    http://myapp/my test/
    

    注意空格和 %20 是 URL 的一部分。

    【讨论】:

      【解决方案3】:

      我能想到的两个原因:

      • 这实际上取决于您如何解析查询服务器端。例如。如果某个参数中存在&等字符,使用HTTP的GET请求传递参数会出现问题。
      • 它允许您以您喜欢的方式处理非 ansi 字符(您指定编码)。否则浏览器可能会以某种随机编码传递它们(不要认为它真的在任何标准中定义;如果我错了,请纠正我)。

      【讨论】:

        【解决方案4】:

        更新:上面还有一个更好的解释(imo):

        URI 表示为字符序列,而不是序列 八位字节。这是因为 URI 可能通过以下方式“传输” 不通过计算机网络,例如,打印在纸上、阅读 收音机等

        对于包含非 ASCII 字符的原始字符序列, 然而,情况更加困难。互联网协议 传输用于表示字符序列的八位字节序列 预计将提供某种方式来识别所使用的字符集,如果 可能有不止一个 [RFC2277]。不过,目前有 通用 URI 语法中没有规定来实现这一点 鉴别。一个单独的 URI 方案可能需要一个 字符集,定义默认字符集,或提供一种方法来指示 使用的字符集。


        因为在RFC中说明了:

        2.4。转义序列

        如果数据没有使用 毫无保留的性格;这包括不对应的数据 US-ASCII 编码字符集的可打印字符,或 对应于任何不允许的 US-ASCII 字符,如 下面解释。

        2.4.2。什么时候逃跑和不逃跑

        URI 总是采用“转义”形式,因为转义或取消转义 完成的 URI 可能会改变其语义。通常,唯一的时间 在创建 URI 时可以安全地进行转义编码 从其组成部分;每个组件可能有自己的一组 保留的字符,因此只有负责的机制 生成或解释该组件可以确定转义字符是否会改变其语义。同样,一个 URI 必须在转义字符之前分成其组件 可以安全地解码这些组件。

        在某些情况下,可以用无保留表示的数据 字符可能会出现转义;例如,一些毫无保留的 某些系统会自动转义“标记”字符。如果 给定 URI 方案定义了一个规范化算法,然后 根据该算法,未保留的字符可能会被转义。 例如,有时在 http URL 中使用“%7e”代替“~” 路径,但两者对于 http URL 是等价的。

        因为百分号“%”字符总是有保留的目的 作为转义指示器,必须将其转义为“%25”才能 用作 URI 中的数据。实施者应注意不要 多次转义或取消转义同一字符串,因为取消转义 已经未转义的字符串可能会导致对百分比的误解 数据字符作为另一个转义字符,反之亦然 转义已经转义的字符串的情况。

        【讨论】:

        • 嗨,如果我们在向 Web 服务器发送内容之前忘记编码怎么办? Web 服务器会向我们的应用程序返回任何错误消息吗?如果收到无效字符,您知道网络服务器如何响应吗?
        【解决方案5】:

        主要原因是它本质上是转义字符以包含在您网页的 URL 中。

        假设用户输入一个用户表单字段为“&joe”,我们希望重定向到一个页面,该页面包含该名称作为 URL 的一部分,使用 URL 编码,那么它将是,例如:

        localhost/index.php?name=%26joe //note how the ampersand is escaped
        

        如果你不使用 urlencoding,你最终会得到:

        localhost/index.php?name=&joe
        

        而那个&符号会导致各种不可预测性

        【讨论】:

          【解决方案6】:

          您应该使用 URL 编码有两个原因:

          • 当您需要传递对 URL 无效的字符时,例如 „ < > # % \ | ^ [ ] ` spaces。例如,空格不是有效的 URL 字符,因为如果文本中包含空格,则无法识别出完整的 URL。
          • 当您需要传递为 URL 保留的字符时,例如 ! # $ % & ' ( ) * + , / : ; = ? @ [ ]。例如,? 保留用于标记查询参数的开始,如果我们不在路径或查询参数内部编码 ?,它可能会破坏语法。

          【讨论】:

            【解决方案7】:

            在网络标准RFC 1738中指定。

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

            【讨论】:

              【解决方案8】:

              URL 编码是将字符串转换为有效 URL 格式的过程。有效的 URL 格式意味着 URL 仅包含所谓的“alpha | digit | safe | extra | escape”字符。

              通常会执行 URL 编码来转换通过 html 表单传递的数据,因为此类数据可能包含特殊字符,例如“/”、“.”、“#”等,它们可能: a) 具有特殊字符意义;或 b) 不是 URL 的有效字符;或 c) 可以在传输过程中更改。例如,“#”字符需要编码,因为它具有 html 锚点的特殊含义。该字符还需要进行编码,因为在有效的 URL 格式中是不允许的。此外,某些字符(例如“~”)可能无法在 Internet 上正确传输。

              【讨论】:

              • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
              猜你喜欢
              • 2017-01-09
              • 2013-03-12
              • 1970-01-01
              • 2012-10-06
              • 2013-01-21
              • 2011-12-21
              • 1970-01-01
              • 2018-04-10
              • 1970-01-01
              相关资源
              最近更新 更多