Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
允许用户将自己的JavaScript添加到站点的安全问题?_Javascript_Security - Fatal编程技术网

允许用户将自己的JavaScript添加到站点的安全问题?

允许用户将自己的JavaScript添加到站点的安全问题?,javascript,security,Javascript,Security,我计划创建一个开源的教育网络应用程序,人们可以在其中添加和编辑内容(有点像维基百科) 但是,我希望添加另一个功能,允许用户使用JavaScript添加自己的交互内容。(类似于JSFIDLE的工作方式) 这样做的安全问题是什么? 可选问题:如何克服这些问题?一个大问题是跨站点脚本,用户在其中添加代码,告知浏览器打开并运行来自其他站点的代码。假设他们添加了创建指向站点的iFrame或隐藏iFrame的内容,并开始下载恶意代码 没有简单的方法(感谢评论中的Bergi)来确保没有创建元素,也没有进行aj

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

但是,我希望添加另一个功能,允许用户使用JavaScript添加自己的交互内容。(类似于JSFIDLE的工作方式)

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

一个大问题是跨站点脚本,用户在其中添加代码,告知浏览器打开并运行来自其他站点的代码。假设他们添加了创建指向站点的iFrame或隐藏iFrame的内容,并开始下载恶意代码

没有简单的方法(感谢评论中的Bergi)来确保没有创建元素,也没有进行ajax调用

我曾经是提供此功能的网站的成员,但对于那些我为自己的空间付费的网站,因此我添加的任何漏洞都会给我自己的客户带来不便,在这种情况下,顺其自然就好了,因为这不是每个人的安全漏洞

解决这个问题的一种方法是创建可自定义的控件,供用户用于添加交互性。优点是您可以控制添加的javascript,缺点是您的用户群必须请求并等待您创建它们。

是的,您可以使用它仅在IFrame中加载用户脚本

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


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

声明这是沙箱的目的:

对不受信任的内容使用iframe的沙盒属性

在呈现IFrame之前,应首先测试是否支持沙盒:

<iframe src="/blank.htm" sandbox="allow-scripts" id="foo"></iframe>
如果
sandboxSupported
false
,则通过动态更改
src
而不是重定向,这样做更安全,因为如果重定向没有及时发生,则不会意外渲染iframe

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

e、 g。
这可能不安全

将被视为

或者,您可以构造一个数据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>


var unsafeDoc=new Blob([document.body.dataset.userdoc],{type:'text/html'});
var iframe=document.createElement('iframe');
iframe.src=window.URL.createObjectURL(unsafeDoc);
iframe.sandbox='允许脚本';
当然,您也可以从JSON数据源设置
unsafeDoc
变量。不建议加载HTML文件,因为这与必须从外部域加载HTML文件的问题相同,因为攻击者可能会诱使用户直接加载该文件

另外,请不要试图将用户内容直接写入脚本块。如上所示,这是一种安全的方法,只要在服务器端输出用户数据时对其执行正确的HTML编码

在这些情况下,您可以将
src
保留为
blank.html
,因为不支持
srcdoc
的旧浏览器只需加载该URL即可


正如上面提到的,没有任何东西可以阻止用户脚本将用户重定向到发生错误的站点,但是这种方法,假设用户在补丁上是最新的,并且没有漏洞,这是一种安全的方法,因为它通过对javascript的密集解析来保护其最终用户及其站点上的数据。

?这很难奏效。你知道一个人可以编写每一个javascript吗?代码过滤器注定会失败。但在这种情况下,JS Fiddle如何处理这个问题,因为它允许人们提交JS。另外,iframe中的沙盒功能是否也适用于HTML5?@user3111466:jsfiddle允许脚本运行浩劫-您只是从未打开过恶意链接,是吗?顺便说一句,嵌入的结果来自子域,因此由于同源策略,脚本不能对登录用户进行恶意操作。@user3111466 jsfiddle是一个沙箱,它的用途通常是作为用户群之间事实上的信任。就我个人而言,我不会推出任何允许在用户群中免费使用javascript的生产系统,除非出现我所描述的情况,即某个特定用户对其名称空间负责,他们只会通过用恶意软件感染自己的网站来欺骗客户。你是说“自己的交互”吗-如果每个用户只执行自己安装的脚本或“交互式内容”,其中任何用户都可以上载将由他人执行的代码?如果用户可以上载将由他人执行的代码,则这是危险的。尽可能避免(例如,仅允许他们配置给定模块);如果你需要/想要它,你应该使用一些同行审查程序,以便拒绝恶意代码。同源策略不保护用户不受旁载下载的影响吗?@whereswalden:不,旁载下载实际上是一种浏览器攻击,而不是实际的d