我为什么要使用urlencode?
我正在编写一个web应用程序,并学习如何对html链接进行URL编码 这里所有的urlencode问题(见下面的标签)都是“如何…?”问题 我的问题不是“如何”,而是“为什么?” 即使是维基百科的文章也只讨论了它的机制:我为什么要使用urlencode?,urlencode,Urlencode,我正在编写一个web应用程序,并学习如何对html链接进行URL编码 这里所有的urlencode问题(见下面的标签)都是“如何…?”问题 我的问题不是“如何”,而是“为什么?” 即使是维基百科的文章也只讨论了它的机制: 但不是为什么我应该在我的应用程序中使用urlencode 使用(或不使用)urlencode的安全性含义是什么 如何利用未使用urlencode的漏洞 未编码的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字符(您指定编码)。否则,浏览器可能会以某种随机编码方式传递它们(不要认为这是任何标准中真正定义的;如果我错了,请纠正我)
因为它是在: 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