Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我为什么要使用urlencode?_Urlencode - Fatal编程技术网

我为什么要使用urlencode?

我为什么要使用urlencode?,urlencode,Urlencode,我正在编写一个web应用程序,并学习如何对html链接进行URL编码 这里所有的urlencode问题(见下面的标签)都是“如何…?”问题 我的问题不是“如何”,而是“为什么?” 即使是维基百科的文章也只讨论了它的机制: 但不是为什么我应该在我的应用程序中使用urlencode 使用(或不使用)urlencode的安全性含义是什么 如何利用未使用urlencode的漏洞 未编码的URL会出现什么样的错误或失败 我这样问是因为即使没有urlencode,指向我的应用程序开发网站的链接(如以下所示)

我正在编写一个web应用程序,并学习如何对html链接进行URL编码

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

我的问题不是“如何”,而是“为什么?”

即使是维基百科的文章也只讨论了它的机制:
但不是为什么我应该在我的应用程序中使用urlencode

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

如何利用未使用urlencode的漏洞

未编码的URL会出现什么样的错误或失败

我这样问是因为即使没有urlencode,指向我的应用程序开发网站的链接(如以下所示)也能正常工作:
http://myapp/my%20test/ée/ré

为什么要使用urlencode

或者换一种说法:

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

有RFC(以及类似的)定义URL的格式,浏览器/web服务器开发人员将此作为解释数据的标准。如果你不遵守,结果可能是不可预测的


HTTP URL有它的规范,它声明几乎所有非拉丁字符都需要编码

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

http://myapp/my%20test/


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

我可以想到两个原因:

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

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

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

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


因为它是在:

2.4。逃逸序列

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

2.4.2。什么时候逃走

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

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

因为百分比“%”字符始终具有以下保留用途: 作为转义指示符,必须将其转义为“%25”,以便 可以用作URI中的数据。实施者应该注意不要 多次转义或取消转义同一字符串,因为取消转义 已经未替换的字符串可能会导致错误解释百分比 数据字符作为另一个转义字符,或在 转义已转义字符串的情况


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

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

localhost/index.php?name=%26joe //note how the ampersand is escaped
如果不使用urlencoding,您将得到:

localhost/index.php?name=&joe

而且,符号会导致各种各样的不可预测性

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

  • 当您需要传递对URL无效的字符时,例如
    «<>\\\\\\\^[]`空格
    。例如,空格不是有效的URL字符,因为如果文本中包含空格,则在文本中发现完整的URL是不明确的
  • 当您需要传递为URL保留的字符时,例如
    !#$%&'( ) * + , / : ; = ? @ []
    。例如,
    保留用于标记查询参数的开始,如果我们不在路径或查询参数内部编码
    ,则可能会中断syn
    localhost/index.php?name=&joe