Xml 转义/编码术语

Posted

技术标签:

【中文标题】Xml 转义/编码术语【英文标题】:Xml Escaping/Encoding terminology 【发布时间】:2010-10-20 06:46:47 【问题描述】:

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

Xml 编码

Xml 转义

编码的 html

转义网址

...

谁能给我解释一下?

【问题讨论】:

【参考方案1】:

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

Escaping 是指将特殊字符(例如<>)替换为其等效的XML entity(例如<>)的过程。对于 URL,转义是指将字符替换为以 % 开头的字符串,例如 %20 用于单个空格。

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

【讨论】:

一个迂腐的澄清:“unicode”不是一种编码,而是一个字符集(UTF-8、ISO8859-1、CP850 是编码的例子)。遗憾的是,Unicode 和 UTF-8 经常被用作同义词,而实际上并非如此。 同意 "encoding" 是 w/r/t "character encoding" 的正确术语,但是当涉及到替换字符以避免特殊解释。看我的回答。 关于 Yaron 的要求,请注意,在 .NET 框架中,您有这两种方法,它们的作用几乎相同:HttpUtility.UrlPathEncodeUri.EscapeUriString【参考方案2】:

在每个 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="" 中输入的任何内容都应该被“转义”,或者应该只被视为数据。所以有各种函数可以将&lt;&gt; 编码/转义为它们的html 等效%3C%3E,所以现在浏览器知道这需要区别对待。基本上逃避意味着逃避他们的实际意义(粗略地说)。

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

使用 JSTL。

【讨论】:

【参考方案3】:

TL;DR 这两个术语可以互换(如果您的意思是转换某些字符,以便将它们解释为纯字符串数据)。这场辩论是老生常谈了。来自CWE-116: Improper Encoding or Escaping of Output:

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

JavaScript 也有encodeURIComponent(),而且它的specification 完全避免了争论:

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

我个人认为将一般过程称为“编码”更合适,因为您正在创建一个 code 以通过通信通道(一段标记/编程代码)传输并由接收器解释(解析器)。我认为将 &lt; 替换为像 &amp;#60; 这样完全不同的东西并称之为“转义”是很愚蠢的。

【讨论】:

例如,在 .NET 框架中,您有这两个方法,它们的作用几乎相同:HttpUtility.UrlPathEncodeUri.EscapeUriString

以上是关于Xml 转义/编码术语的主要内容,如果未能解决你的问题,请参考以下文章

JSON相关 JSON在线解析 JSON压缩转义工具 JSON着色工具 JSON 在线格式化工具 在线XML/JSON互相转换工具 XMLJSON在线转换

XAML 字符转义

转义编码和加密

转义编码和加密

网址URL中特殊字符转义编码

求助,解释下Java中怎样把网址URL编码转义