如何停止任何下一个 JavaScript 事件以避免 XSS

How to stop any next JavaScript events to avoid XSS

我想在浏览器中显示带有 HTML 执行(格式化)的文本,以便在没有任何 JavaScript 执行的情况下轻松阅读。这是一个大文本,很难在 HTML 标签之间阅读。因此,执行 HTML 但不执行 JavaScript.

我做了什么: 我在 <iframe> 中加载了这段文字,这样我就可以完全控制,我试着像这样显示文字:

<script>
throw new Error('This is just to abort javascript');
</script>
<?php echo $text ?>
<script>
throw new Error('This is just to abort javascript');
</script>

控制台确实显示错误,但即便如此,如果我有 $text = '<script>alert(1)</script>'; 这个脚本无论如何都会被执行。

我想避免的另一个 XSS 示例。 $text = '<a href="#" onmouseover="alert(1)">this is a fake url</a>';

基本上,从页面中止任何 JavaScript 执行。

提前致谢!

不幸的是,这实际上是不可能的。这不起作用的原因是错误停止 该脚本 的执行,但不会停止页面上所有脚本的执行。

如果您信任来自用户的 HTML 输入,您只会遇到 XSS 漏洞,除非您尝试解析他们的输入并删除任何可能导致 javascript 事件的内容开火。不要尝试这个,如果你这样做,你会很心痛。

最终,这就是 MarkDown and Textile 之类的东西存在的原因。

我想 "what you should do" 的答案取决于您期望用户实际发送给您的内容,但最终您应该 运行 通过 htmlentities and/or strip_tags[= 的任何用户输入12=]

您可以指定 Content Security Policy 以防止任何内联 JavaScript 执行。

See here 浏览器兼容性。

还建议 运行 任何用户输入也通过 HTML 清理器,因为这将有助于保护不支持 CSP 的浏览器。还建议使用 BBcode 或类似 MarkDown 的东西,而不是让用户输入原始 HTML,因为这要简单得多(复杂性是安全的敌人)。