我为什么要使用urlencode?

时间:2011-01-12 10:55:38

标签: urlencode

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

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

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

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

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

如何使用urlencode失败被利用

使用未编码的网址会出现什么样的错误或失败?

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

为什么我应该使用urlencode吗?

或另外一种说法:

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

7 个答案:

答案 0 :(得分:12)

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

  

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

  

对于包含非ASCII字符的原始字符序列,      然而,情况更加困难。互联网协议      传输用于表示字符序列的八位字节序列      如果,期望提供一些识别所用字符集的方法      可能有多个[RFC2277]。但是,目前有      通用URI语法中没有任何条款可以实现此目的      鉴定。单个URI方案可能需要单个URI方案      charset,定义默认字符集,或提供指示方式      charset使用。


因为它在RFC中声明:

  

2.4。转义序列

     

如果数据没有使用的表示,则必须对其进行转义      毫无保留的性格;这包括与之不对应的数据      US-ASCII编码字符集的可打印字符,或者      对应于任何不允许的US-ASCII字符,如      解释如下。

  

2.4.2。什么时候逃脱和Unescape

     

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

     

在某些情况下,可以由未预留的数据表示的数据      角色可能会出现逃脱;例如,一些未保留的      “mark”字符会被某些系统自动转义。如果      给定的URI方案定义了规范化算法      根据该算法可以未转义未保留的字符。      例如,有时在http URL中使用“%7e”而不是“〜”      路径,但两者相当于http网址。

     

因为百分比“%”字符始终具有保留的目的      作为逃生指标,它必须作为“%25”进行转义才能获得      用作URI中的数据。实施者应该小心不要      因为不经意,所以不止一次地逃避或取消相同的字符串      已经未转义的字符串可能会导致误解百分比      数据字符作为另一个转义字符,反之亦然      转义已转义的字符串的情况。

答案 1 :(得分:4)

有RFC(http://www.faqs.org/rfcs/rfc1738.html等)定义了URL的格式,浏览器/ Web服务器开发人员将此作为解释数据的标准。如果您不遵守,结果可能无法预测。

HTTP URL有其规范,并指出几乎所有非拉丁字符都需要编码。

答案 2 :(得分:4)

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

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

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

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

localhost/index.php?name=&joe

并且&符号会导致各种不可预测性

答案 3 :(得分:3)

我能想到的两个原因:

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

答案 4 :(得分:2)

如果您的两条路径是这样的

,您将如何区分?
http://myapp/my%20test/

http://myapp/my test/

注意空间& %20是网址的一部分。

答案 5 :(得分:2)

使用URL编码有两个原因:

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

答案 6 :(得分:-1)

它在网络标准 RFC 1738 中指定。

<块引用>

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