【发布时间】:2010-10-20 06:46:47
【问题描述】:
我对以下短语中“转义”和“编码”之间的区别感到困惑:
Xml 编码
Xml 转义
编码的 Html
转义网址
...
谁能给我解释一下?
【问题讨论】:
标签: xml encoding escaping html-encode xml-encoding
我对以下短语中“转义”和“编码”之间的区别感到困惑:
Xml 编码
Xml 转义
编码的 Html
转义网址
...
谁能给我解释一下?
【问题讨论】:
标签: xml encoding escaping html-encode xml-encoding
Encoding 描述了文件的字符是如何以二进制形式物理写入的(如 Unicode 或 ANSI)。
Escaping 是指将特殊字符(例如< 和>)替换为其等效的XML entity(例如< 和>)的过程。对于 URL,转义是指将字符替换为以 % 开头的字符串,例如 %20 用于单个空格。
转义因语言而异,但编码通常是被广泛接受的标准。有时这些术语的使用含糊不清(尤其是用于表示转义的编码),但它们定义明确且不同。
【讨论】:
HttpUtility.UrlPathEncode 和 Uri.EscapeUriString。
在每个 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。
【讨论】:
TL;DR 这两个术语可以互换(如果您的意思是转换某些字符,以便将它们解释为纯字符串数据)。这场辩论是老生常谈了。来自CWE-116: Improper Encoding or Escaping of Output:
“编码”和“转义”术语的用法差异很大。为了 例如,在某些编程语言中,使用了这些术语 可互换,而其他语言提供同时使用这两种语言的 API 不同任务的术语。这种重叠的用法延伸到网络, 例如“转义”JavaScript 函数,其目的被声明为 编码。当然,编码和转义的概念早于 几十年的网络。在这样的背景下,CWE 很难采用 一致的词汇,不会被某些人误解 选区。
JavaScript 也有encodeURIComponent(),而且它的specification 完全避免了争论:
encodeURIComponent 函数计算 URI 的新版本 某些字符的每个实例都被替换为一个,两个, 三个或四个转义序列,代表 UTF-8 编码 字符。
我个人认为将一般过程称为“编码”更合适,因为您正在创建一个 code 以通过通信通道(一段标记/编程代码)传输并由接收器解释(解析器)。我认为将 < 替换为像 &#60; 这样完全不同的东西并称之为“转义”是很愚蠢的。
【讨论】:
HttpUtility.UrlPathEncode 和 Uri.EscapeUriString。