【问题标题】:How to stop any next JavaScript events to avoid XSS如何停止任何下一个 JavaScript 事件以避免 XSS
【发布时间】:2023-12-10 13:45:01
【问题描述】:

我想在浏览器中显示一个带有 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 = '&lt;script&gt;alert(1)&lt;/script&gt;'; 这个脚本无论如何都会被执行。

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

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

提前致谢!

【问题讨论】:

  • 您想完全删除$text 中的任何JS 脚本,还是希望它们在iframe 中显示为文本而不执行?
  • 您不能仅针对代码的某个区域禁用 javascript 执行。仅适用于整个页面(也只能在浏览器设置中手动设置)。恐怕你不会绕过过滤脚本或逃避它。
  • 另一个需要注意的 xss 漏洞可能会破坏过滤掉任何不是“href”的计划...&lt;a href="javascript:alert(1);void(0);"&gt;I'm totally legit, click me.&lt;/a&gt;
  • @blcook223 - 这个想法是停止执行 any JavaScript 代码,而不仅仅是 &lt;script&gt; 标签。正如@samlev 所说,有href="javascript:,我们也可以举办活动(onmouse...onload 和许多其他人)。因此,“解析文本并删除脚本”不是解决方案。我需要强制浏览器中止/停止任何脚本。我得到了我的解决方案:无法完成 :) 谢谢大家!

标签: javascript php html security xss


【解决方案1】:

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

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

最终,这就是 MarkDownTextile 这样的东西存在的原因。

我猜“你应该做什么”的答案取决于你期望用户实际发送给你的内容,但最终你应该通过htmlentities 和/或strip_tags 运行任何用户输入

【讨论】:

  • 我发布了这个问题,希望有人知道一些魔法 :) 也感谢 MarkDown 和 Textile 链接。
【解决方案2】:

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

See here 用于浏览器兼容性。

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

【讨论】:

  • 很酷的东西!我不知道这个标题。 BBCode 不是一个选项。客户端必须能够将一些 HTML 复制粘贴到我们的平台中,并且我们必须阅读内容。 IE有解决方法吗? (天哪,我非常讨厌微软这个浏览器!)
  • 我相信提供的部分支持足以防止编写脚本。将其与已建立的 HTML 清理程序一起使用通常就足够了(请不要尝试自己编写,这很复杂!)。
  • IE 不知道此标头。我试过header("Content-Security-Policy: default-src 'none'");header("X-Content-Security-Policy: default-src 'none'");header("X-Webkit-CSP: default-src 'none'"); 在Firefox 上没问题,IE 没有任何反应。
  • It should do (IE 10 +)。
  • 我知道,caniuse.com 也说应该。也许我做错了什么。我在 Windows8.1 上有 IE11。我试过default-src 'none'default-src not.valid.website.here。同样的老故事:在 Firefox/Chhrome 上可以,在 IE 上不行。
最近更新 更多