我为什么要使用urlencode?

aug*_*tin 53 urlencode

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

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

我的问题不是"如何?" 但为什么?".

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

什么是安全使用(或者更确切地说,不使用)进行urlencode的含义是什么?

如何使用进行urlencode失败被利用

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

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

我为什么要使用urlencode?

或另一种说法:

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

Fel*_*ing 12

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

URI表示为字符序列,而不是八位字节序列.这是因为URI可以通过不通过计算机网络的方式"运输",例如,打印在纸上,通过无线电读取等.

但是,对于包含非ASCII字符的原始字符序列,情况更加困难.如果可能存在多个[RFC2277],那么传输用于表示字符序列的八位字节序列的因特网协议有望提供一些识别所用字符集的方法.但是,通用URI语法中目前没有提供完成此标识的规定.单个URI方案可能需要单个字符集,定义默认字符集,或提供指示所使用的字符集的方法.


因为它在RFC中声明:

2.4.转义序列

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

2.4.2.什么时候逃脱和Unescape

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

在某些情况下,可以由未保留字符表示的数据可能会出现转义; 例如,一些未保留的"标记"字符会被某些系统自动转义.如果给定的URI方案定义了规范化算法,则可以根据该算法去保留未保留的字符.例如,有时在http URL路径中使用"%7e"而不是"〜",但这两者对于http URL是等效的.

由于百分比"%"字符始终具有作为转义指示符的保留目的,因此必须将其转义为"%25"才能用作URI中的数据.实施者应该小心不要多次逃避或取消相同的字符串,因为取消已经未转义的字符串可能会导致将百分比数据字符误解为另一个转义字符,反之亦然,如果转义已转义的字符串.


D C*_*use 8

使用 URL 编码有两个原因:

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


Dea*_*n P 6

主要原因是它实际上转义了要包含在网页URL中的字符。

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

localhost/index.php?name=%26joe //note how the ampersand is escaped
Run Code Online (Sandbox Code Playgroud)

如果您不使用urlencoding,最终将得到:

localhost/index.php?name=&joe
Run Code Online (Sandbox Code Playgroud)

而“&”号将导致各种不可预测性


Den*_*sky 5

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

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


Mar*_*rio 5

我能想到的两个原因:

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