我正在编写一个Web应用程序并学习如何urlencode html链接......
这里的所有urlencode问题(见下面的标签)都是“如何...?”的问题。
我的问题不是“如何?”但“为什么?”。
甚至维基百科的文章也只涉及它的机制:
http://en.wikipedia.org/wiki/Urlencode
但不是为什么我应该在我的应用程序中使用urlencode。
使用(或者不使用)urlencode的安全性含义是什么?
如何使用urlencode失败被利用?
使用未编码的网址会出现什么样的错误或失败?
我问,因为即使没有urlencode,也可以链接到我的应用程序开发网站,如下所示:
http://myapp/my%20test/ée/ràé
为什么我应该使用urlencode吗?
或另外一种说法:
何时我应该使用urlencode吗?在什么样的情况下?
答案 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请求传递参数会有问题。答案 4 :(得分:2)
如果您的两条路径是这样的
,您将如何区分?http://myapp/my%20test/
和
http://myapp/my test/
注意空间& %20是网址的一部分。
答案 5 :(得分:2)
使用URL编码有两个原因:
„ < > # % \ | ^ [ ] ` spaces
。例如,空格不是有效的URL字符,因为如果文本中包含空格,则在文本中发现完整的URL会很含糊。! # $ % & ' ( ) * + , / : ; = ? @ [ ]
。例如,?
保留用于标记查询参数的开始,如果我们未在路径或内部查询参数中编码?
,则可能会破坏语法。答案 6 :(得分:-1)
它在网络标准 RFC 1738 中指定。
<块引用>仅限字母数字、特殊字符“$-_.+!*'(),”和 可以使用用于其保留目的的保留字符 在 URL 中未编码。