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.UrlPathEncode
和 Uri.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=""
中输入的任何内容都应该被“转义”,或者应该只被视为数据。所以有各种函数可以将<>
编码/转义为它们的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 以通过通信通道(一段标记/编程代码)传输并由接收器解释(解析器)。我认为将 <
替换为像 &#60;
这样完全不同的东西并称之为“转义”是很愚蠢的。
【讨论】:
例如,在 .NET 框架中,您有这两个方法,它们的作用几乎相同:HttpUtility.UrlPathEncode
和 Uri.EscapeUriString
。以上是关于Xml 转义/编码术语的主要内容,如果未能解决你的问题,请参考以下文章
JSON相关 JSON在线解析 JSON压缩转义工具 JSON着色工具 JSON 在线格式化工具 在线XML/JSON互相转换工具 XMLJSON在线转换