HTML 与 javascript 自解码机制

HTML 与 javascript 自解码机制_第1张图片

关于这个自解码机制,我们直接以一个例子(样例0)来进行说明:


我们假设document.write里的值是用户可控的输入,点击后,document.write出现一段 img HTMLonerror里的 JavaScript 会执行。此时陷阱来了,我们现在提供一段HtmlEncode函数如下(样例A):




我们知道HtmlEncode('')后的结果是:

这个样例 A 点击后会执行 alert(123) 吗?下面这个呢(样例 B)?


在样例 A 和样例 B 中,document.write 的值似乎是一样的?实际结果是样例 A 点击不会执行 alert(123),而是在页面上完整地输出,而样例 B 点击后会执行alert(123)

我们要告诉大家的是,点击样例B时,document.write的值实际上不再是:

而是:

我们可以这样论证:


看弹出的x值就知道了,如下图所示。

HTML 与 javascript 自解码机制_第2张图片
proof

出现这个结果的原因如下:

onclick里的这段 JavaScript 出现在 HTML 标签内,意味着这里的JavaScript 可以进行 HTML 形式的编码,这种编码有以下两种。

  1. 进制编码:&#xH;(十六进制格式)、&#D;(十进制格式),最后的分号(;)可以不要。
  2. HTML 实体编码:即上面的那个 HtmlEncode

在 JavaScript 执行之前,HTML 形式的编码会自动解码。所以样例 0 与样例 B 的意义是一样的,而样例 A 就不一样了。下面我们继续完善这些例子。

上面的用户输入是出现在 HTML 里的情况,如果用户输入出现在

这样是可以执行alert(123)的,如果用户输入的是下面的内容:

结果与样例 B 一样:这段 HTML 编码的内容在 JavaScript 执行之前自动解码吗?答案是不会,原因是用户输入的这段内容上下文环境是 JavaScript,不是HTML(可以认为

你可能感兴趣的:(HTML 与 javascript 自解码机制)