为什么在清理HTML元素时仍然显示错误警报?

xt0899hw  于 2023-02-10  发布在  其他
关注(0)|答案(3)|浏览(103)

下面是我的用例场景。
1.收集用户输入。(输入必须是HTML字符串元素)
1.用某种样式形成HTML元素。
1.创建HTML元素之后,需要清理它并将其附加到目标DOM元素中。

  1. DOM元素呈现已清理的元素,但仍显示错误警报。
    用户输入为
<img src="http://url.to.file.which/not.exist" onerror="alert(document.cookie);">

这将始终显示警报。
有人能帮我解决这个问题吗?
x一个一个一个一个x一个一个二个x

li9yvcax

li9yvcax1#

脚本内容在此语句上执行
wrapElement.innerHTML = document.getElementById("html-input").value;
所以这里是如何修复它

function createEle() {
  const wrapElement = document.createElement('div');
  wrapElement.innerHTML =  DOMPurify.sanitize(document.getElementById("html-input").value);
  console.log(wrapElement.outerHTML)
  document.getElementById("sanitized-html").innerHTML = wrapElement.innerHTML;
}
<script src="https://cdn.jsdelivr.net/npm/dompurify@2.0.16/dist/purify.min.js"></script>
<textarea id="html-input"></textarea>
<button onclick="createEle()">Show Sanitized HTML</button>
<div id="sanitized-html"></div>

或者更短,假设您想继续使用 Package 器:

document.getElementById("sanitized-html").innerHTML = wrapElement.innerHTML;
k3fezbri

k3fezbri2#

以下是事件的顺序:
1.读取原始用户输入
1.将原始用户输入注入DOM(wrapElement.innerHTML =
1.从DOM读取规范化的用户输入
1.通过DOMPurify.sanitize传递规范化的用户输入
1.将净化后的用户输入注入DOM
由于步骤2而触发警报。

zu0ti5jz

zu0ti5jz3#

因为您在这里使用的是未净化的HTML:

const wrapElement = document.createElement('div');
wrapElement.innerHTML = document.getElementById("html-input").value;

不要跳过这些步骤,只需将文本直接传递给DOMPurify:
x一个一个一个一个x一个一个二个x
或者更简单地说:
一个三个三个一个
或者更简单地说:

function createEle() {
    document.getElementById("sanitized-html").innerHTML = DOMPurify.sanitize(
        document.getElementById("html-input").value
    );
}
<script src="https://cdn.jsdelivr.net/npm/dompurify@2.0.16/dist/purify.min.js"></script>
<textarea id="html-input"></textarea>
<button onclick="createEle()">Show Sanitized HTML</button>
<div id="sanitized-html"></div>

相关问题