javascript - 允许用户向您的站点添加自己的 JavaScript 的安全问题?

标签 javascript security

我计划创建一个开源教育网络应用程序,人们可以在其中添加和编辑内容(有点像维基百科)。

但是我希望添加另一个功能,允许用户使用 JavaScript 添加他们自己的交互式内容。 (类似于 JSFiddle 的做法)

这样做的安全问题是什么? 可选问题:如何克服这些问题?

最佳答案

是的,你可以使用 HTML5 Sandbox仅在 IFrame 中加载用户脚本。

您应该只托管来自与您的主站点不同的域的用户内容。这将防止任何 XSS如果攻击者说服用户直接访问该页面(在沙箱之外),则进行攻击。例如如果您的网站是 www.example.com您可以使用以下代码来显示沙盒 IFrame(注意 .org 而不是 .com,这是一个完全不同的域):

<iframe src="https://www.example.org/show_user_script.aspx?id=123" sandbox="allow-scripts"></iframe>

这将允许脚本,但将阻止 IFrame 之外的表单和导航。请注意,这种方法仍然可能会给用户带来风险 hosting a phishing form to capture credentials .您应该确保您的网站和用户内容之间的界限在用户界面中是清晰的。即使我们没有指定 allow-forms , 这只会阻止直接提交表单,不会阻止表单元素和 JavaScript 事件处理程序将任何数据发送到外部域。

HTML5 Security Cheat Sheet guidance on OWASP声明这是沙箱的目的:

Use the sandbox attribute of an iframe for untrusted content

在渲染 IFrame 之前,您应该先测试是否支持沙箱:

<iframe src="/blank.htm" sandbox="allow-scripts" id="foo"></iframe>
var sandboxSupported = "sandbox" in document.createElement("iframe");

if (sandboxSupported) {
    document.getElementById('foo').setAttribute('src', 'https://www.example.org/show_user_script.aspx?id=123');
}
else
{
    // Not safe to display IFrame
}

通过动态更改 src 这样做更安全如果 sandboxSupported 而不是重定向是false因为如果重定向没有及时发生,iframe 就不会意外呈现。

作为一种更简单的替代方法,无需检查是否支持沙箱,您可以使用 srcdoc用于生成沙盒内容的 IFrame 属性,确保所有内容都是 HTML 编码的:

例如 <html><head></head><body>This could be unsafe</body></html>

将呈现为

<iframe srcdoc="&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;This could be unsafe&lt;/body&gt;&lt;/html&gt;" sandbox="allow-scripts"></iframe>

或者您可以构造一个数据 blob 对象,注意再次进行 HTML 编码:

<body data-userdoc="&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;This could be unsafe&lt;/body&gt;&lt;/html&gt;">

<script>
var unsafeDoc = new Blob([document.body.dataset.userdoc], {type: 'text/html'});

var iframe = document.createElement('iframe');
iframe.src = window.URL.createObjectURL(unsafeDoc);
iframe.sandbox = 'allow-scripts';
</script>

当然你也可以设置unsafeDoc来自 JSON 数据源的变量。不建议加载 HTML 文件,因为它具有必须来自外部域的相同问题,因为攻击者可以诱使用户直接加载该文件。

此外,请不要试图将用户内容直接写入脚本 block 。如上图,data attributes这是执行此操作的安全方法,只要在输出服务器端时对用户数据执行正确的 HTML 编码即可。

在这些情况下,您可以离开 src作为blank.html作为不支持 srcdoc 的旧浏览器将简单地加载该 URL。

作为@Snowburnt触及,没有什么可以阻止用户脚本将用户重定向到一个站点,其中有 drive-by download发生,但这种方法,假设用户是最新的补丁,并且没有 zero day漏洞,这是一种安全的方法,因为它通过 same origin policy 保护其最终用户及其在您网站上的数据.

关于javascript - 允许用户向您的站点添加自己的 JavaScript 的安全问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21218857/

相关文章:

javascript - 图像在窗口调整大小时调整大小

javascript - 谷歌图表在多个时不起作用

javascript - Chrome 扩展程序 - 当 background.js 不是事件选项卡时,它可以访问本地 html 页面吗?

security - 删除 nginx 反向代理中的特定 cookie

javascript - CSS 非典型清除 float 错误

javascript - 如何使用 Jquery AJAX 提交多个表单

security - 设计审查 - 基于角色的访问系统的性能和可扩展性问题

java.security 与 javax.security

java - Algid 解析错误,不是序列

security - 检查 TLS 实现中的错误