是否可以"沙盒化"任意JavaScript只能在一个<div>而不是整个文档上运行?

Daw*_*wid 13 javascript security

我想要做的是强制一些任意的JavaScript代码在DOM元素"内部"执行,例如<div>.换句话说,是否有可能使一段代码"思考" <div>作为文档层次结构(或<body>文档)的根源?

真人生活的例子:

假设我们有一个允许执行JavaScript代码的页面:

<!DOCTYPE html>
<html>
<head>
  <title>Executor</title>
  <script type="text/javascript" src="jquery.js"></script>
</head>
<body>
  <div></div>
  <input/>
  <button onclick="$('div').html(eval($('input').val()))">
    Execute
  </button>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

代码可以访问整个文档并可以修改它,例如:

$("input").hide()
Run Code Online (Sandbox Code Playgroud)

会阻止我再编写任何愚蠢的代码;-)

是否可以限制某些JavaScript代码的效果区域?以及如果可能的话怎么做?

最好的祝福.

编辑:

我想要执行的代码可能就是一切.如果您的解决方案基于对给定代码的某种修改,请描述如何以正确的方式执行此操作.

EDIT2:

首先,我不知道为什么我会投票.

其次,我将执行的代码是别人的任意代码,而不是我的代码.

为了使一切清楚:

我真正想做的是以某种方式模拟浏览器.获取某些网页的内容,并插入我的网页.当我们决定关闭JavaScript并删除可能出现的所有地方时,这相对容易,但这是我不能做的事情.现在我想限制DOM修改(恶意代码).当我有一个基本想法时,我将在稍后处理重定向和cookie.

dth*_*rpe 16

实现完整隔离和封装大量代码的最佳方法是将其放入iframe,并将其放在站点的子域中,以便外部HTML页面的域名与内部HTML页面不同.在iframe中,JavaScript只会看到iframe URL的DOM,并且无法访问外部DOM.这种隔离由浏览器安全模型强制执行.

这种技术的优点是,您可以高度确信在iframe内运行的脚本不会泄漏并从外部页面窃取数据.这种隔离也是缺点 - 在外页和内页之间共享数据更加困难.要在iframe和外部页面之间提供受控访问或共享数据,您可以调查各种跨域数据共享技术.如果您只需要在iframe内部页面上"抛出"参数,则可以将URL上的数据作为查询参数传递.如果您需要双向数据交换,您可以使用域名降低技术简化域名,以便浏览器允许外页和内页之间的数据交换.

由于您提议在输入控件中输入eval()任意代码,因此您绝对应该保护主页逻辑免受潜在的hackery.使用iframe.

  • 如果我被禁止使用iframe来保护我的网站资产免受任意外部代码的侵害,我会通过邮件发送一封信.;>浏览器/ HTML/DOM确实提供了一种将不受信任的JavaScript代码与站点其他部分隔离的方法.它被称为iframe.除了编写自己的浏览器或本机可执行浏览器插件之外,我不知道实现此隔离的任何其他方法. (3认同)
  • 我要回答的唯一问题是,进行双向通信的最佳方式不是"域名降低技术",而是使用window.postMessage(). (3认同)
  • @hallvors是的,window.postMessage()是一个更好的跨领域技术.3年前写这个答案的时候,它在大多数浏览器中都没有. (3认同)

Kem*_*Dağ 5

一种方法可以使用匿名函数封装所有需要保护的代码,并使用类似对象传递所有环境参数,但修改为不允许全局DOM操作,最简单的示例

(function(document,JQuery,$,window){ //make sure all global access methods are here

//eval code here or just copy and paste

})(modifiedDocument,modifiedJQuery,modifiedJQuery,modifiedWindow);
Run Code Online (Sandbox Code Playgroud)

现在问题可能会出现在我们的脑海中,我们如何修改文档对象?也许是一种方法

var modifiedDocument = function(){

    this.getElementById = function(id){ //one of global accessing functions

         //check if given id is withing the restriction div
         return document.getElementById(id);

         //if found element is not withing restriction div just return null or what is default
         return null;
    }

}
Run Code Online (Sandbox Code Playgroud)

自调用匿名函数允许我们防止全局变量冲突,并且它被用在许多众所周知的库中,例如jQuery.

为了能够应用此方法,首先必须确定每种可能的方式,脚本如何尝试读取或写入全局DOM对象.我不能给你完整的解决方案,因为使用这种方法显然一个项目可能会消耗我整个星期,但这可能会照亮你的方式!