下面是我的用例场景。1.收集用户输入。(输入必须是HTML字符串元素)1.用某种样式形成HTML元素。1.创建HTML元素之后,需要清理它并将其附加到目标DOM元素中。
<img src="http://url.to.file.which/not.exist" onerror="alert(document.cookie);">
这将始终显示警报。有人能帮我解决这个问题吗?x一个一个一个一个x一个一个二个x
li9yvcax1#
脚本内容在此语句上执行wrapElement.innerHTML = document.getElementById("html-input").value;所以这里是如何修复它
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;
k3fezbri2#
以下是事件的顺序:1.读取原始用户输入1.将原始用户输入注入DOM(wrapElement.innerHTML =)1.从DOM读取规范化的用户输入1.通过DOMPurify.sanitize传递规范化的用户输入1.将净化后的用户输入注入DOM由于步骤2而触发警报。
wrapElement.innerHTML =
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 ); }
3条答案
按热度按时间li9yvcax1#
脚本内容在此语句上执行
wrapElement.innerHTML = document.getElementById("html-input").value;
所以这里是如何修复它
或者更短,假设您想继续使用 Package 器:
k3fezbri2#
以下是事件的顺序:
1.读取原始用户输入
1.将原始用户输入注入DOM(
wrapElement.innerHTML =
)1.从DOM读取规范化的用户输入
1.通过DOMPurify.sanitize传递规范化的用户输入
1.将净化后的用户输入注入DOM
由于步骤2而触发警报。
zu0ti5jz3#
因为您在这里使用的是未净化的HTML:
不要跳过这些步骤,只需将文本直接传递给DOMPurify:
x一个一个一个一个x一个一个二个x
或者更简单地说:
一个三个三个一个
或者更简单地说: