我对以下短语中的“转义”和“编码”这两个术语之间的区别感到困惑:
XML 编码
Xml 转义
编码的 HTML
转义网址
...
谁能给我解释一下?
我对以下短语中的“转义”和“编码”这两个术语之间的区别感到困惑:
XML 编码
Xml 转义
编码的 HTML
转义网址
...
谁能给我解释一下?
在每个 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:不正确的编码或输出转义:
“编码”和“转义”术语的用法差异很大。例如,在某些编程语言中,术语可以互换使用,而其他语言提供的 API 将这两个术语用于不同的任务。这种重叠的用法延伸到了 Web,例如“转义”JavaScript 函数,其目的是为了编码。当然,编码和转义的概念比 Web 早了几十年。在这样的背景下,CWE 很难采用不会被某些选区误解的一致词汇。
有趣的是,JavaScript 也有encodeURIComponent()
,它的规范完全避免了争论:
encodeURIComponent 函数计算一个新版本的 URI,其中某些字符的每个实例都被一个、两个、三个或四个表示字符的 UTF-8 编码的转义序列替换。
我个人认为将一般过程称为“编码”更合适,因为您正在创建要通过通信通道(一段标记/编程代码)传输并由接收器(解析器)解释的代码。我认为<
用完全不同的东西代替<
并称之为“逃避”是愚蠢的。