2009-04-18 41 views
17

我很困惑,在这样的短语中的术语 “逃逸” 和 “编码” 之间的区别:XML转义/编码术语

XML编码

XML转义

编码的HTML

转义网址

...

灿有人向我解释吗?

回答

24

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

Escaping指替换特殊字符(如<>)的过程中与它们XML entity当量(如&lt;&gt;)。对于URL,转义是指用%(如%20)开头的字符替换单个空白字符。

按语言不同逃逸,但编码通常是广泛接受的标准。有时这些术语被模棱两可地使用(特别是在用于表示转义的编码方面),但它们被很好地定义和区分。

+3

迂腐的澄清:“unicode”不是一种编码,而是一种字符集(UTF-8,ISO8859-1,CP850是编码的例子)。可悲的是,Unicode和UTF-8经常被用作同义词,而不是。 – tokland 2010-06-05 21:39:30

+0

同意“编码”是w/r/t“字符编码”的正确术语,但在涉及到替换字符以避免特殊解释的过程中,这些术语不是“明确定义和明确的”。看到我的答案。 – 2013-04-20 21:08:04

6

在每一个Web应用程序,数据由像视图层,模型层,数据库层,等各层“应该”被独立地开发,以满足各种扩展性和维护要求的各种层。

现在,基本上,每一层都需要“对话”隔日,他们有在通过它可以谈的语言来决定。 这被称为编码。各类编码时存在类似ASCII,UTF-8,UTF-16等 现在,如果用户是中国人还是日本人,例如,然后他ASCII是行不通的,因此,他将与UTF-16或继续任何其他的编码技术都可以保证中文沟通。所以从网页层面来说,汉字将通过业务层,然后到达数据层,并且在任何地方都会使用相同的“编码”方案。

为什么?

现在假设,你的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。

0

TL; DR 这两个术语是可互换的(如果你的意思是转换某些字符,所以他们将被解释为普通的字符串数据)。这场辩论很古老。来自CWE-116: Improper Encoding or Escaping of Output

“编码”和“转义”术语的用法差别很大。例如,在某些编程语言中,术语互换使用 ,而其他语言提供的API使用 条款来执行不同的任务。这种重叠的用法扩展到Web, ,如“escape”JavaScript函数,其目的是声明为 编码。当然,编码和转义的概念在几十年前就已经在网络上出现了。考虑到这样的背景,CWE很难采用一致的词汇,不会被某些 选区误解。

搞笑的足够的JavaScript还具有encodeURIComponent(),其specification避免完全的讨论:

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

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