XSS - 通过在 DOM 元素上设置 innerHTML 来加载外部 HTML 是否可以防止攻击?

发布于 2025-01-16 18:53:20 字数 550 浏览 1 评论 0 原文

如果我需要加载一些不受信任的外部 HTML 内容并将其呈现在 DOM 上,使用 innerHTML 属性是否足以防范恶意脚本?

通过我自己的测试和这个 article

对于附加措施,它还可以帮助查找所有

If I will need to load some untrusted external HTML content and render them on the DOM, will using the innerHTML property be adequate protection against malicious scripts?

Through my own testing and this article, <script> tags inside HTML that is set via innerHTML to an existing element in the DOM (main or shadow) is not executed. So even if the script is there, would not executing it prevent security risks?

For added measure, it can also help to find all <script> tags and remove them in the DOM. Is this even necessary?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

留一抹残留的笑 2025-01-23 18:53:20

不,这还不够好。内联处理程序仍然可以执行 - 最值得注意的是,那些将立即执行的处理程序。例如:

const untrustworthyContent = `
<div>
  <img src onerror="alert('evil');">
</div>
`;
document.querySelector('div').innerHTML = untrustworthyContent;
<div></div>

任何东西都可以放入这样的内联处理程序属性中,包括加载其他恶意脚本。

对于附加措施,它还可以帮助查找所有标签并在 DOM 中删除它们。这还有必要吗?

最好彻底地做。在考虑渲染之前删除所有

No, that's not good enough. Inline handlers can still execute - most notably, those that'll execute immediately. For example:

const untrustworthyContent = `
<div>
  <img src onerror="alert('evil');">
</div>
`;
document.querySelector('div').innerHTML = untrustworthyContent;
<div></div>

And anything can be put into such an inline handler attribute, including loading other malicious scripts.

For added measure, it can also help to find all tags and remove them in the DOM. Is this even necessary?

Best to do it thoroughly. Remove all <script> tags and inline handlers before even thinking about rendering.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文