20

我对以下短语中的“转义”和“编码”这两个术语之间的区别感到困惑:

XML 编码

Xml 转义

编码的 HTML

转义网址

...

谁能给我解释一下?

4

3 回答 3

28

编码描述了文件的字符如何物理地以二进制形式写入(如 Unicode 或 ANSI)。

转义是指将特殊字符(例如<and >)替换为其XML 实体等效项(例如&lt;and &gt;)的过程。对于 URL,转义是指将字符替换为以 开头的字符串%,例如%20单个空格。

转义因语言而异,但编码通常是被广泛接受的标准。有时这些术语的使用含糊不清(特别是用于表示转义的编码),但它们定义明确且不同。

于 2009-04-18T12:04:21.943 回答
6

在每个 Web 应用程序中,数据由不同的层组成,如视图层、模型层、数据库层等。每一层都“应该”独立开发,以满足各种可伸缩性和可维护性要求。

现在,基本上,每一层都需要相互“交谈”,并且他们必须决定他们可以交谈的语言。这称为编码。存在各种类型的编码,如 ASCII、UTF-8、UTF-16 等。现在,如果用户是中国人或日本人,那么对他来说 ASCII 不起作用,因此他会继续使用 UTF-16 或任何其他能保证中文交流的编码技术。所以从web层开始,汉字要经过业务层,再到数据层,到处都是一样的“编码”方案。

为什么 ?

现在假设,您的 Web 层以 UTF-16 格式发送数据,支持中文,但数据库层只接受 ASCII,那么数据库层会混淆您在说什么!它只理解英文字符,它不会理解其余的。这是关于编码的。

转义:

有一组数据称为“元数据”,从浏览器的角度来看,它们具有特殊的含义。例如,<>从浏览器的角度来看是元数据。浏览器解析器知道其中包含的所有数据<>都将被解释。现在攻击者使用这种技术来迷惑浏览器。例如 :

<input type="text" value="${name} />

如果我用

name="/><script>alert(document.cookie)</script>

然后浏览器看到的结果代码将是

<input type="text" value=""/><script>alert(document.cookie)</script> />

意思是,现在您需要指示浏览器我放入的任何内容都name=""应该被“转义”,或者应该只被视为数据。所以有各种函数可以编码/转义<>为它们的 html 等价物%3C%3E,所以现在浏览器知道这需要区别对待。基本上逃避意味着逃避他们的实际意义(粗略地说)。

 <input type="text" value="${fn:escapeXML(name)} />

使用 JSTL。

于 2012-10-14T14:51:22.580 回答
0

TL;DR这两个术语是可以互换的(如果您的意思是转换某些字符,以便将它们解释为纯字符串数据)。这场辩论是老生常谈了。来自CWE-116:不正确的编码或输出转义

“编码”和“转义”术语的用法差异很大。例如,在某些编程语言中,术语可以互换使用,而其他语言提供的 API 将这两个术语用于不同的任务。这种重叠的用法延伸到了 Web,例如“转义”JavaScript 函数,其目的是为了编码。当然,编码和转义的概念比 Web 早了几十年。在这样的背景下,CWE 很难采用不会被某些选区误解的一致词汇。

有趣的是,JavaScript 也有encodeURIComponent(),它的规范完全避免了争论:

encodeURIComponent 函数计算一个新版本的 URI,其中某些字符的每个实例都被一个、两个、三个或四个表示字符的 UTF-8 编码的转义序列替换。

我个人认为将一般过程称为“编码”更合适,因为您正在创建要通过通信通道(一段标记/编程代码)传输并由接收器(解析器)解释的代码我认为<用完全不同的东西代替&#60;并称之为“逃避”是愚蠢的。

于 2013-04-20T21:02:11.357 回答