XSS - innerText 字符串可以是 HTML 元素是否危险:脚本、div 等?
XSS - is it dangerous that innerText string can be HTML elements: script, div etc?
我在评论网站的客户端工作。
用户可以在评论描述中插入任何文本,包括 html 元素文本(如:<script> console.log('hello') </script>
),并使用基本文本样式设置样式:斜体、粗体等...
我想测试跨站脚本。所以我玩了一下,当使用斜体时,元素被呈现为 html 元素的 innerText。
HTML 中的 innerText 如下所示:
不过我没有看到警报被执行。
用户可以编写在调用事件后变得有效的文本 HTML 吗?
如果可以,怎么做?
您在 elements/DOM 选项卡中看到的内容有点误导您。如果您通常使用 innerText
(or more appropriately textContent
来设置元素的文本,则它 中没有 标签。它有字符。从显示的角度来看,这些字符可以形成标签,但它们不是标签,浏览器不会那样对待它们。
查看此内容的一种方法是查看他们的 HTML:
const target = document.getElementById("target");
target.textContent =
`<script>alert("Hi!");<\/script>
<div onclick='alert("Ho!");'>click me</div>
<img onerror='alert("Hum!");' src=''>`;
console.log("textContent:", target.textContent);
console.log("innerHTML:", target.innerHTML);
<div id="target"></div>
请注意,该元素不包含 script
标记,它包含字符 <
、s
、c
、r
、i
、p
、t
等
相比之下,使用innerHTML
会让你对 XSS 攻击敞开大门:
const target = document.getElementById("target");
target.innerHTML =
`<script>alert("Hi!");<\/script>
<div onclick='alert("Ho!");'>click me</div>
<img onerror='alert("Hum!");' src=''>`;
console.log("textContent:", target.textContent);
console.log("innerHTML:", target.innerHTML);
<div id="target"></div>
script
以这种方式插入的标签不会得到 运行,但属性定义的事件处理程序会,例如 img
上的 error
事件具有没有 src
— that 运行s 的代码可以添加一个将被执行的 script
:
const target = document.getElementById("target");
target.innerHTML =
`<div onclick='alert("Ho!");'>click me</div>
<img onerror='(function() {
alert("Hi!");
var s = document.createElement("script");
s.textContent = 'alert("Hi from script");';
document.body.appendChild(s);
})()' src=''>`;
console.log("textContent:", target.textContent);
console.log("innerHTML:", target.innerHTML);
<div id="target"></div>
我在评论网站的客户端工作。
用户可以在评论描述中插入任何文本,包括 html 元素文本(如:<script> console.log('hello') </script>
),并使用基本文本样式设置样式:斜体、粗体等...
我想测试跨站脚本。所以我玩了一下,当使用斜体时,元素被呈现为 html 元素的 innerText。
HTML 中的 innerText 如下所示:
不过我没有看到警报被执行。
用户可以编写在调用事件后变得有效的文本 HTML 吗? 如果可以,怎么做?
您在 elements/DOM 选项卡中看到的内容有点误导您。如果您通常使用 innerText
(or more appropriately textContent
来设置元素的文本,则它 中没有 标签。它有字符。从显示的角度来看,这些字符可以形成标签,但它们不是标签,浏览器不会那样对待它们。
查看此内容的一种方法是查看他们的 HTML:
const target = document.getElementById("target");
target.textContent =
`<script>alert("Hi!");<\/script>
<div onclick='alert("Ho!");'>click me</div>
<img onerror='alert("Hum!");' src=''>`;
console.log("textContent:", target.textContent);
console.log("innerHTML:", target.innerHTML);
<div id="target"></div>
请注意,该元素不包含 script
标记,它包含字符 <
、s
、c
、r
、i
、p
、t
等
相比之下,使用innerHTML
会让你对 XSS 攻击敞开大门:
const target = document.getElementById("target");
target.innerHTML =
`<script>alert("Hi!");<\/script>
<div onclick='alert("Ho!");'>click me</div>
<img onerror='alert("Hum!");' src=''>`;
console.log("textContent:", target.textContent);
console.log("innerHTML:", target.innerHTML);
<div id="target"></div>
script
以这种方式插入的标签不会得到 运行,但属性定义的事件处理程序会,例如 img
上的 error
事件具有没有 src
— that 运行s 的代码可以添加一个将被执行的 script
:
const target = document.getElementById("target");
target.innerHTML =
`<div onclick='alert("Ho!");'>click me</div>
<img onerror='(function() {
alert("Hi!");
var s = document.createElement("script");
s.textContent = 'alert("Hi from script");';
document.body.appendChild(s);
})()' src=''>`;
console.log("textContent:", target.textContent);
console.log("innerHTML:", target.innerHTML);
<div id="target"></div>