- 浏览: 672563 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
zhouyicang:
为嘛人气不够,这么好的文章,我找了几十篇博客,才找到这篇解惑了 ...
HTML 块级元素/内联元素 -
young7:
不错,解惑了
HTML 块级元素/内联元素 -
lvjin948:
获取浏览器语言的完美方案。http://blog.csdn.n ...
JavaScript获取浏览器语言类型 -
tarena_hhh:
我用了css优化工具,发现他的顺序有很大不一样?????
CSS属性书写顺序及命名规则 -
deng131:
谢谢你的提醒,是有个地方写错了
javascript事件绑定addEventListener,attachEvent
转自:http://www.infoq.com/cn/articles/sandboxOnB
javascript中的沙箱并非传统意义上的沙箱,只是一种语法上的hack写法而已,javascript中处理模块依赖关系的闭包被称之为沙箱,和 ajax一样,这种sandbox coding风格是一种现象,而不是本质,本身并无对错之分,要看你怎么用,因此,理解并合理运用才是我们对“js沙箱”的一个正确的基本态度,“沙箱无用论”是很业余的观点。
——沙箱是一个工具。就和键盘和鼠标一样,我们需要他,但更要看我们怎么用他。
目前来看,js沙箱的优势在于代码的组织并向“应用”提供架构支持,js沙箱解决不了全局变量污染,多版本库的融合等基本问题,很多人对js沙箱抱有太高奢望,也是不对的。
—— 沙箱是一把利器。就像AK是巷战之王,可还是有人硬要拿它打飞机。
js沙箱已经开始影响B端开发,而且在前后端融合方面具有更多前瞻性的优势。
——沙箱是一把钥匙。ajax的流行改变了B端开发模式,我们有理由期待js沙箱在企业级开发中的表现。
当JavaScript第一次发布的时候,有一个可以理解的忧虑,那就是打开一个页面可能会直接在机器上执行一段代码。如果JavaScript中含有一些有害的代码,比如删除所有Word文档,或者更糟的是,向脚本的编写者复制这些Word文档,那该怎么办呢?
为了防止这种情况发生,同时也为了让浏览器的用户放心,JavaScript构建为只在沙箱中运行。沙箱是一个受保护的环境,在这个环境中,脚本不能访问浏览器所在的计算机资源。
另外,浏览器所实现的安全条件高出并超过了JavaScript语言所建立的最低条件。这些都定义在一个与浏览器相关的安全策略中,它决定了脚本能做什么不能做什么。例如,一个这样的安全策略规定脚本不能与脚本所来源的域以外的页面通信。大多数浏览器还提供了定制这一策略的方式,这可以使脚本所运行的环境限制变得更严或更松。
不幸的是,即便是有了JavaScript沙箱和浏览器安全策略,JavaScript还是经过了一段难熬的时光,黑客已经发现并充分利用了JavaScript的一些错误,有些错误与浏览器无关,有些错误与浏览器有关。较严重的一个是跨站脚本(cross-site scripting,XSS)。这实际上是一类安全破坏(其中一些通过JavaScript,另一些通过浏览器的漏洞,还有一些通过服务器),它能够导致 cookie dao qie、暴露客户端或网站的数据,或导致许多其他的严重问题。
从语言学的角度上来说,允许代码无节制地使用全局变量,是最错误的选择之一。而更可怕的,就是一个变量"可能"成为全局的(在未知的时间与地点)。但是这两项,却伴随JavaScript这门语言成功地走到了现在。
相关厂商内容
Flex 4 in Action书摘:格式化数据
开发人员访谈:David Lenaerts
使用 HTML5 Pack for Dreamweaver CS5
IBM 360°讲师团招募:每个爱技术乐分享的人都有机会
创建移动富互联网应用(RIA)的设计技巧
也许是限于浏览器应用的规模,所以这一切还迟迟没有酿成灾难。在此之前,出现了两种解决方案。一种是ECMA在新的规范(Edition 5)中对此做出了限制,其中最重要的一条便是eval()的使用变得不再随意和无度。而另一种方案,则是相对没有那么官僚与学术的,尽管也拥有一个同样学术的名字:沙箱。
沙箱(Sandbox)并不是一个新东西,即使对于JavaScript来说,也已经存在了相当长的时间。在SpiderMonkey JS的源代码中,就明确地将一个闭包描述为一个沙箱。这包含着许多潜在的信息:它有一个初始环境,可以被重置,可以被复制,以及最重要的,在它内部的所有操作,不会影响到外部
当然事实上远非如此。JavaScript里的闭包只是一个"貌似沙箱"的东西--仍然是出于JavaScript早期的语言规范的问题,闭包不得不允许那些"合法泄漏"给外部的东西。而对于这一切无法忍受的前端工程师们,开始寻求另外的解决之道,这其中相对较早的尝试,是基于IFRAME的实践。例如dean.edwards在2006年提出过的方案(注1):
a_frames.document.write(
"<script>"+
"var MSIE/*@cc_on =1@*/;"+ // sniff
"parent.sandbox=MSIE?this:{eval:function(s){return eval(s)}}"+
"<\/script>"
);
显然,由于在不同的IFRAME中运行着各自的JavaScript引擎实例,所以上述的方案也意味着沙箱是"引擎"这个级别的:在任何一个沙箱中的崩溃,将导致该引擎以及对应IFRAME崩溃。但--理论上说--不会影响整个浏览器。
问题是,这并不那么理想。往往的,引擎会导致整个浏览器锁在那里,例如用alert()弹出一个对话框而又因为某种意外失去了焦点。又或者单个的 IFRAME会导致全局的CPU被耗光,例如一个死循环。于是更加复杂的方案--在JavaScritp中包含一个完整的执行器--出现了。最有名的则是 Narrative JavaScript,它内建了一个执行器,用于逐行地解释执行JavaScript代码,这使得它可以控制所有的代码执行序列,或者随时重置整个执行引擎--如同一个沙箱所要做的那样。
这一切或者太过依赖于环境,又或者太过复杂,但都不乏追随者。例如jsFiddle这个项目(注2)在"嵌入或装载"这样的路子上就已经有了不俗的成绩。但是,YUI在新版本中却给出了它自己的选择:以更加明确的编程约定,来实现应用级别的沙箱。这包括一个非常简单的、新的YUI语法:
YUI().use('dom-base', function(Y) {
// Y是一个新的沙箱
});
在'dom-base'位置上,可以是1到N个字符串,表明一个需要在沙箱中装载的模块列表。这可以是沙箱的初始列表,或者后续的callback 函数(亦即是用户代码)所需依赖的模块列表。在这种实现方案中,YUI为每个沙箱维护各自的装载模块列表和上下文环境中的变量、成员。但是出于 JavaScript语言自己的局限,这个沙箱依然是相当脆弱的。例如下一示例中沙箱内的代码就会污染到全局:
YUI().use('', function(Y) {
abc = 1234; //<--这里可能导致一个全局变量'abc'被隐式地声明
});
同样,在上述的沙箱里也可以使用类似window、document等全局变量、修改它们的成员或无限制地调用方法(例如使用 setTimeout()来创建时钟)。所以YUI的沙箱事实上是靠"规约"来约束的,而不是真正意义上的沙箱。当然,这也意味着,如果用户能按照规约来处理沙箱内的代码,那么也就能自由地享用它带来的便利:安全、移植和有效的隔离副作用。
而我们再穷究其根底,YUI沙箱的实质不过是一行:
// code from yui.js
// - mod.fn(this, name)
mod.entryFunc(sandbox, modName);
其实际含义是:
* mod :沙箱当前装载的模块;
* entryFunc : 上述模块的入口函数;
* sandbox :当前的沙箱的实例,即YUI()返回值;
* modName:模块名
除了依赖关系(以及可能需要的异步加载)之外,YUI沙箱环境仅是用下面的代码来简单地调用callback函数:
callback(Y, response);
然而这些需求的实现并不那么复杂。首先,我们设定数据结构mod为一个对象:
{ name:modName, fn: entryFunc, req: [], use: [] }
则一个环境对象env,将包括多个mod(将它们处理成对象而非数组,主要是便于使用名字来索引模块)和以及对它们进行管理操作的方法:
{ mods:{}, used:{}, add:..., use:...}
最后,所谓一个沙箱sandbox,就是上述环境对象的一个实例,并在初始时sandbox.mods与sandbox.used为空。由此简单的实现为:
/**
* tiny sandbox framework
* mirror from YUI3 by aimingoo.
**/
function Sandbox() {
if (!(this instanceof arguments.callee)) return new arguments.callee();
this.mods = this.mods || {};
this.used = {};
}
Sandbox.prototype = {
add: function(modName, entryFunc, reqArr, useArr) {
this.mods[modName] = { fn: entryFunc, req: reqArr, use: useArr }
},
use: function() {
var mods = [].slice.call(arguments, 0); // 0..length-2 is modNames
var callback = mods.pop(); // length-1 is callback
var recursive_load = function(name, mod) {
if (!this.used[name] && (mod=this.mods[name])) {
mod.req.forEach(recursive_load, this);
mod.fn(this, name);
mod.use.forEach(recursive_load, this);
this.used[name] = true;
}
}
mods.forEach(recursive_load, this);
callback(this);
}
}
现在我们来尝试一个与YUI类似的语法风格:
Sandbox().use('', function(){
alert('user code.');
});
或者,先向整个Sandbox环境注册一些模块(在真实的框架实现中,这一步可能是通过框架的装载器来初始化):
// for test, entry of mods
f1 = function() { alert('f1') };
f2 = function() { alert('f2') };
f3 = function() { alert('f3') };
// mods for global/common env.
Sandbox.prototype.mods = {
'core': { fn: f1, req: [], use: [] },
'oo': { fn: f2, req: ['core'], use: ['xml'] },
'xml': { fn: f3, req: [], use: [] }
}
然后再尝试在一个沙箱实例中运行代码:
// f1 -> f2 -> f3 -> user code
Sandbox().use('oo', function(){
alert('user code.');
});
其实即便是上述代码中用于处理模块依赖的逻辑,也并不是什么"神奇的"代码或者技巧。除开这些,这样的沙箱隔离泄露的能力还抵不过一个嵌入式DSL 语言。而后者所应用的技巧很简单,看不出什么花招(注3):
with (YUI()) this.eval("... mod_context ... ");
这样一来,在mod_context里的代码就只会在YUI()的一个实例中造成污染了。当然,仍然是源于JavaScript的限制,我们还是无法避免一个变量泄露到全局--除非,我们回到js in js这个项目(注4),真的在环境中重新初始化一个js引擎。
从这一意义上来说,引擎级别的沙箱与操作系统的进程一样,带来的是终级的解决方案,所以Chrome、IE等等主流浏览器纷纷有了"独立进程"模式。而在这样的背景之下,试图用"框架内置沙箱"来改善ECMAScript ed3中一些设计疏失的种种努力,不过是一张张空头的支票罢了。甚至,用这本支票签完单也未必有人会收的。
这是一种较好的避免命名冲突的方法,它被应用在很多项目中,但这种方法有一些缺点。
1.需要给所有需要添加的函数、变量加上前缀。
2.因为只有一个全局对象,这意味着一部分代码可以肆意地修改全局对象而导致其余代码的被动更新。
javascript中的沙箱并非传统意义上的沙箱,只是一种语法上的hack写法而已,javascript中处理模块依赖关系的闭包被称之为沙箱,和 ajax一样,这种sandbox coding风格是一种现象,而不是本质,本身并无对错之分,要看你怎么用,因此,理解并合理运用才是我们对“js沙箱”的一个正确的基本态度,“沙箱无用论”是很业余的观点。
——沙箱是一个工具。就和键盘和鼠标一样,我们需要他,但更要看我们怎么用他。
目前来看,js沙箱的优势在于代码的组织并向“应用”提供架构支持,js沙箱解决不了全局变量污染,多版本库的融合等基本问题,很多人对js沙箱抱有太高奢望,也是不对的。
—— 沙箱是一把利器。就像AK是巷战之王,可还是有人硬要拿它打飞机。
js沙箱已经开始影响B端开发,而且在前后端融合方面具有更多前瞻性的优势。
——沙箱是一把钥匙。ajax的流行改变了B端开发模式,我们有理由期待js沙箱在企业级开发中的表现。
当JavaScript第一次发布的时候,有一个可以理解的忧虑,那就是打开一个页面可能会直接在机器上执行一段代码。如果JavaScript中含有一些有害的代码,比如删除所有Word文档,或者更糟的是,向脚本的编写者复制这些Word文档,那该怎么办呢?
为了防止这种情况发生,同时也为了让浏览器的用户放心,JavaScript构建为只在沙箱中运行。沙箱是一个受保护的环境,在这个环境中,脚本不能访问浏览器所在的计算机资源。
另外,浏览器所实现的安全条件高出并超过了JavaScript语言所建立的最低条件。这些都定义在一个与浏览器相关的安全策略中,它决定了脚本能做什么不能做什么。例如,一个这样的安全策略规定脚本不能与脚本所来源的域以外的页面通信。大多数浏览器还提供了定制这一策略的方式,这可以使脚本所运行的环境限制变得更严或更松。
不幸的是,即便是有了JavaScript沙箱和浏览器安全策略,JavaScript还是经过了一段难熬的时光,黑客已经发现并充分利用了JavaScript的一些错误,有些错误与浏览器无关,有些错误与浏览器有关。较严重的一个是跨站脚本(cross-site scripting,XSS)。这实际上是一类安全破坏(其中一些通过JavaScript,另一些通过浏览器的漏洞,还有一些通过服务器),它能够导致 cookie dao qie、暴露客户端或网站的数据,或导致许多其他的严重问题。
从语言学的角度上来说,允许代码无节制地使用全局变量,是最错误的选择之一。而更可怕的,就是一个变量"可能"成为全局的(在未知的时间与地点)。但是这两项,却伴随JavaScript这门语言成功地走到了现在。
相关厂商内容
Flex 4 in Action书摘:格式化数据
开发人员访谈:David Lenaerts
使用 HTML5 Pack for Dreamweaver CS5
IBM 360°讲师团招募:每个爱技术乐分享的人都有机会
创建移动富互联网应用(RIA)的设计技巧
也许是限于浏览器应用的规模,所以这一切还迟迟没有酿成灾难。在此之前,出现了两种解决方案。一种是ECMA在新的规范(Edition 5)中对此做出了限制,其中最重要的一条便是eval()的使用变得不再随意和无度。而另一种方案,则是相对没有那么官僚与学术的,尽管也拥有一个同样学术的名字:沙箱。
沙箱(Sandbox)并不是一个新东西,即使对于JavaScript来说,也已经存在了相当长的时间。在SpiderMonkey JS的源代码中,就明确地将一个闭包描述为一个沙箱。这包含着许多潜在的信息:它有一个初始环境,可以被重置,可以被复制,以及最重要的,在它内部的所有操作,不会影响到外部
当然事实上远非如此。JavaScript里的闭包只是一个"貌似沙箱"的东西--仍然是出于JavaScript早期的语言规范的问题,闭包不得不允许那些"合法泄漏"给外部的东西。而对于这一切无法忍受的前端工程师们,开始寻求另外的解决之道,这其中相对较早的尝试,是基于IFRAME的实践。例如dean.edwards在2006年提出过的方案(注1):
a_frames.document.write(
"<script>"+
"var MSIE/*@cc_on =1@*/;"+ // sniff
"parent.sandbox=MSIE?this:{eval:function(s){return eval(s)}}"+
"<\/script>"
);
显然,由于在不同的IFRAME中运行着各自的JavaScript引擎实例,所以上述的方案也意味着沙箱是"引擎"这个级别的:在任何一个沙箱中的崩溃,将导致该引擎以及对应IFRAME崩溃。但--理论上说--不会影响整个浏览器。
问题是,这并不那么理想。往往的,引擎会导致整个浏览器锁在那里,例如用alert()弹出一个对话框而又因为某种意外失去了焦点。又或者单个的 IFRAME会导致全局的CPU被耗光,例如一个死循环。于是更加复杂的方案--在JavaScritp中包含一个完整的执行器--出现了。最有名的则是 Narrative JavaScript,它内建了一个执行器,用于逐行地解释执行JavaScript代码,这使得它可以控制所有的代码执行序列,或者随时重置整个执行引擎--如同一个沙箱所要做的那样。
这一切或者太过依赖于环境,又或者太过复杂,但都不乏追随者。例如jsFiddle这个项目(注2)在"嵌入或装载"这样的路子上就已经有了不俗的成绩。但是,YUI在新版本中却给出了它自己的选择:以更加明确的编程约定,来实现应用级别的沙箱。这包括一个非常简单的、新的YUI语法:
YUI().use('dom-base', function(Y) {
// Y是一个新的沙箱
});
在'dom-base'位置上,可以是1到N个字符串,表明一个需要在沙箱中装载的模块列表。这可以是沙箱的初始列表,或者后续的callback 函数(亦即是用户代码)所需依赖的模块列表。在这种实现方案中,YUI为每个沙箱维护各自的装载模块列表和上下文环境中的变量、成员。但是出于 JavaScript语言自己的局限,这个沙箱依然是相当脆弱的。例如下一示例中沙箱内的代码就会污染到全局:
YUI().use('', function(Y) {
abc = 1234; //<--这里可能导致一个全局变量'abc'被隐式地声明
});
同样,在上述的沙箱里也可以使用类似window、document等全局变量、修改它们的成员或无限制地调用方法(例如使用 setTimeout()来创建时钟)。所以YUI的沙箱事实上是靠"规约"来约束的,而不是真正意义上的沙箱。当然,这也意味着,如果用户能按照规约来处理沙箱内的代码,那么也就能自由地享用它带来的便利:安全、移植和有效的隔离副作用。
而我们再穷究其根底,YUI沙箱的实质不过是一行:
// code from yui.js
// - mod.fn(this, name)
mod.entryFunc(sandbox, modName);
其实际含义是:
* mod :沙箱当前装载的模块;
* entryFunc : 上述模块的入口函数;
* sandbox :当前的沙箱的实例,即YUI()返回值;
* modName:模块名
除了依赖关系(以及可能需要的异步加载)之外,YUI沙箱环境仅是用下面的代码来简单地调用callback函数:
callback(Y, response);
然而这些需求的实现并不那么复杂。首先,我们设定数据结构mod为一个对象:
{ name:modName, fn: entryFunc, req: [], use: [] }
则一个环境对象env,将包括多个mod(将它们处理成对象而非数组,主要是便于使用名字来索引模块)和以及对它们进行管理操作的方法:
{ mods:{}, used:{}, add:..., use:...}
最后,所谓一个沙箱sandbox,就是上述环境对象的一个实例,并在初始时sandbox.mods与sandbox.used为空。由此简单的实现为:
/**
* tiny sandbox framework
* mirror from YUI3 by aimingoo.
**/
function Sandbox() {
if (!(this instanceof arguments.callee)) return new arguments.callee();
this.mods = this.mods || {};
this.used = {};
}
Sandbox.prototype = {
add: function(modName, entryFunc, reqArr, useArr) {
this.mods[modName] = { fn: entryFunc, req: reqArr, use: useArr }
},
use: function() {
var mods = [].slice.call(arguments, 0); // 0..length-2 is modNames
var callback = mods.pop(); // length-1 is callback
var recursive_load = function(name, mod) {
if (!this.used[name] && (mod=this.mods[name])) {
mod.req.forEach(recursive_load, this);
mod.fn(this, name);
mod.use.forEach(recursive_load, this);
this.used[name] = true;
}
}
mods.forEach(recursive_load, this);
callback(this);
}
}
现在我们来尝试一个与YUI类似的语法风格:
Sandbox().use('', function(){
alert('user code.');
});
或者,先向整个Sandbox环境注册一些模块(在真实的框架实现中,这一步可能是通过框架的装载器来初始化):
// for test, entry of mods
f1 = function() { alert('f1') };
f2 = function() { alert('f2') };
f3 = function() { alert('f3') };
// mods for global/common env.
Sandbox.prototype.mods = {
'core': { fn: f1, req: [], use: [] },
'oo': { fn: f2, req: ['core'], use: ['xml'] },
'xml': { fn: f3, req: [], use: [] }
}
然后再尝试在一个沙箱实例中运行代码:
// f1 -> f2 -> f3 -> user code
Sandbox().use('oo', function(){
alert('user code.');
});
其实即便是上述代码中用于处理模块依赖的逻辑,也并不是什么"神奇的"代码或者技巧。除开这些,这样的沙箱隔离泄露的能力还抵不过一个嵌入式DSL 语言。而后者所应用的技巧很简单,看不出什么花招(注3):
with (YUI()) this.eval("... mod_context ... ");
这样一来,在mod_context里的代码就只会在YUI()的一个实例中造成污染了。当然,仍然是源于JavaScript的限制,我们还是无法避免一个变量泄露到全局--除非,我们回到js in js这个项目(注4),真的在环境中重新初始化一个js引擎。
从这一意义上来说,引擎级别的沙箱与操作系统的进程一样,带来的是终级的解决方案,所以Chrome、IE等等主流浏览器纷纷有了"独立进程"模式。而在这样的背景之下,试图用"框架内置沙箱"来改善ECMAScript ed3中一些设计疏失的种种努力,不过是一张张空头的支票罢了。甚至,用这本支票签完单也未必有人会收的。
这是一种较好的避免命名冲突的方法,它被应用在很多项目中,但这种方法有一些缺点。
1.需要给所有需要添加的函数、变量加上前缀。
2.因为只有一个全局对象,这意味着一部分代码可以肆意地修改全局对象而导致其余代码的被动更新。
function Sandbox() { // turning arguments into an array var args = Array.prototype.slice.call(arguments), // the last argument is the callback callback = args.pop(), // modules can be passed as an array or as individual parameters modules = (args[0] && typeof args[0] === "string") ? args : args[0], i; // make sure the function is called // as a constructor if (!(this instanceof Sandbox)) { return new Sandbox(modules, callback); } // add properties to 'this' as needed: this.a = 1; this.b = 2; // now add modules to the core 'this' object // no modules or "*" both mean "use all modules" if (!modules || modules === '*') { modules = []; for (i in Sandbox.modules) { if (Sandbox.modules.hasOwnProperty(i)) { modules.push(i); } } } // init the required modules for (i = 0; i < modules.length; i++) { Sandbox.modules[modules[i]](this); } // call the callback callback(this); } // any prototype properties as needed Sandbox.prototype = { name: "My Application", version: "1.0", getName: function() { return this.name; } };
发表评论
-
IE浏览器stylesheets加载资源限制问题
2015-03-08 20:30 1067@import url()做一下总结: 1:@import ... -
理解Javascript原型及继承
2012-08-15 22:13 1345js初次使用起来觉得很简单但是在使用一段时间后很不深入的理解原 ... -
JS判断IE浏览器支持版本
2012-02-01 19:00 2964/* * @description 判断是否是IE,返回具体 ... -
jsonp动态创建script方式IE9问题
2012-02-01 16:28 2379在IE9浏览器创建一个script元素,然后指定其src属性u ... -
IE9下使用jsonp方式调用问题
2012-01-31 19:03 22891. 如果JSONP返回的Content-Type不符合规范, ... -
JavaScript获取浏览器语言类型
2011-12-31 18:24 7804获取浏览器语言: IE: navigator.browser ... -
IE Security Comprehensive Protection
2011-12-19 20:14 1762IE浏览器安全方面的处理,本人英文不好建议大家直接看英文: ... -
javaScript 中比较数字字符串问题
2011-10-10 21:49 4672在实现前端页面排序功能过程中遇到的问题,由于自己的粗心导致了生 ... -
javascript设置label标签 for属性
2011-09-11 10:36 3605js创建label标签的for属性用来增加操作响应区域。 v ... -
javascript事件绑定addEventListener,attachEvent
2011-07-31 18:55 3518为了考虑浏览器的兼容性问题,都需要对浏览器进行类型检测。 f ... -
readyState五种状态详解
2011-07-24 14:15 1608(0) UNINITIALIZED 未初始化 The obje ... -
getElementByTagName 与 querySelectorAll
2011-07-14 11:29 1478虽然网上有中文翻译但是还是直接看英文有感觉。getElemen ... -
拖放 Drag and drop 方法
2011-07-10 18:55 1524虽然网上又很多实现方法,但是还是需要理解拖放原理。通过绑定on ... -
闭包传入参数 window & undefined
2011-07-03 08:53 2301大家在前端开发中对闭包应该和熟悉了,也就是几种常见的闭包方式: ... -
textarea光标位置插入文字
2011-06-18 18:14 2126各浏览器TextArea获得焦点后的光标位置情况: text ... -
IE6上Array不支持indexOf方法
2011-06-06 10:17 2250在IE6不支持Array上indexOf方法,又是可恶的ie, ... -
处理不支持JavaScript脚本情况
2011-05-26 10:24 1337现在主流的浏览器都支持javascrip, 但还是有小部分不支 ... -
动态创建iframe设置属性name问题
2011-04-20 13:54 2727通常iframe的name可以是link或者form的targ ... -
WebSocket and Socket.IO
2011-04-06 15:39 3462WebSocket API是下一代客户端-服务器的异步通信方法 ... -
Preload CSS/JavaScript预加载
2011-04-06 10:20 1466希望达到效果是页面第一次载入以后,如果在次刷新页或者进入下一个 ...
相关推荐
在"bootup-sandbox-master"这个压缩包中,可能包含了创建和管理JavaScript沙箱环境的相关代码或者示例。这些代码可能涉及了上述的一些技术,如使用`iframe`、CSP配置、Web Worker或者自定义的安全执行环境等。通过...
Chrome和IE9浏览器都采用了沙箱技术来增强其安全性,尤其是对于网页浏览时的插件和JavaScript执行。这种技术的核心思想是将敏感操作限制在一个受控的环境中,即使发生恶意行为,也不会影响到操作系统或用户数据的...
在浏览器编译版本中,Vue3 的沙箱机制主要是通过 `with` 语句来实现的。`with` 语句可以扩展作用域链,使得在当前作用域找不到的变量能够在给定的对象(在这个例子中是 `_ctx`)中查找。`_ctx` 是一个特殊的上下文...
"用于单独开发和测试UI组件的沙箱_TypeScript_JavaScript_下载.zip" 提供的正是这样一个工具,它支持使用TypeScript和JavaScript两种语言,为React UI组件的开发提供了一个安全、独立的环境。 TypeScript是...
在本文中,我们将深入探讨如何使用NodeJS和Vue.js实现在沙箱环境中集成支付宝支付的完整流程。这个项目涉及的主要知识点包括NodeJS后端开发、Vue.js前端开发以及支付宝开放平台的API接口调用。 首先,我们需要理解...
虚拟机允许在沙箱环境中执行JavaScript,这对于安全性和隔离性有较高要求的应用场景非常有用,比如在Node.js中运行用户提供的代码。 JavaScript解释器还涉及到错误处理、类型转换、异步编程(如Promise和async/...
1.5JavaScript沙箱 1.6可访问性和JavaScript的最佳实践 第2章JavaScript数据类型与变量 2.1变量的标识 2.2作用域 2.3简单类型 2.4常量:有名称但不改变 2.5习题 第3章运算符和语句 3.1JavaScript语句的格式 3.2简单...
JavaScript沙箱是一个编程概念,主要用于在安全环境中执行JavaScript代码,防止其对主应用程序或宿主环境造成意外修改或潜在危害。在网页开发中,尤其是在处理用户输入或第三方脚本时,沙箱机制能够确保代码执行的...
7. **安全与隔离**:由于C++和JavaScript运行在不同的沙箱环境中,必须确保通信的安全性。通常,会使用特定的接口或协议来限制它们之间的交互,防止恶意代码的注入或敏感数据的泄露。 8. **性能优化**:虽然...
4. **JavaScript沙箱**:浏览器为JavaScript提供了一个安全环境,称为沙箱,限制了脚本的某些操作。了解这些限制有助于理解为什么有些加密无法在客户端完全解密,可能需要服务器端配合。 5. **安全与隐私**:在探索...
在浏览器中,JavaScript运行在沙箱模式下,受到严格的同源策略限制,不允许直接访问本地文件系统或执行本地程序。而在Node.js环境中,JavaScript可以突破这些限制,因为它设计用于服务器端编程,可以访问文件系统、...
在描述中提到的"JavaScript沙箱API",是指JANS创建了一个隔离的环境,就像一个沙箱,其中的代码运行不会影响到系统的其他部分。这种机制对于测试可能含有潜在风险的代码或库特别有用,因为即使这些代码有安全漏洞,...
安全是这里的关键,因为JavaScript在浏览器中运行,必须遵守同源策略和沙箱限制,不能随意执行可能危害用户系统的命令。 在设计用户界面时,开发人员通常会采用响应式布局,确保应用在不同设备和屏幕尺寸上都能良好...
在前端开发中,编写框架是一项复杂的工作,涉及到对JavaScript语言特性的深入理解和高效利用。本章节探讨的是在创建前端框架时如何实现代码运行的沙箱机制,以确保代码的安全执行和防止潜在的安全风险,比如代码注入...
"exercises-web:沙箱中的一些基本JavaScript编码挑战和面试问题"这个资源提供了一系列的编码练习,旨在帮助开发者提升JavaScript技能,并为可能遇到的面试问题做好准备。这个沙箱环境允许用户在安全的环境中实践和...
首先,理解“沙箱环境”是关键。沙箱环境是一种安全机制,用于限制脚本可能造成的潜在危害,防止它们对系统造成破坏。iMacros的沙箱模式确保了脚本只能在指定的边界内运行,避免对用户的计算机产生不良影响。然而,...
4. **示例**:可能包含了一些示例动作或场景,帮助用户理解如何在沙箱中创建和执行动作。 5. **配置文件**:用于设置沙箱的行为和环境参数。 6. **测试脚本**:用于验证代码功能的自动化测试脚本。 7. **许可证文件*...
JavaScript在浏览器环境中运行,有沙箱安全机制,防止代码对用户系统造成损害。同时,Node.js提供了服务器端JavaScript的运行环境,使得JavaScript可以用于构建全栈应用。 在压缩包文件中,"javascript.exe"可能是...