- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
更新:由于这个问题没有答案,所以我稍微改变了这个问题。下面链接的 Dean 博客上的帖子评论表明此技术在 Safari 中不起作用。
我现在的问题是:下面描述的技术在现代浏览器中是否有效*,特别是有人可以确认它是否在 Safari 中有效吗?
这是最近的 blog post .它在某一时刻说:
Sandboxed natives ... are supported in a variety of browsers, including ... Safari 2.0+
...但后来说 iframe 技术“被除 Safari 之外的所有主要浏览器支持”,他展示的回退涉及使用伪造的构造函数和 __proto__
做一些奇怪的事情,这似乎有点哈克。
我几乎很难相信两个不同的窗口实际上可以共享同一个窗口,比如 Object.prototype。跨域 iframe 会发生什么?如果我修改了一个框架中的原型(prototype),另一个框架中的原型(prototype)会被修改吗?这似乎是一个明显的安全问题。有人请阐明这种情况。
* 我所说的“工作”是指 My.Object != Object
,因此可以在一个窗口中修改原型(prototype)而不影响另一个窗口。
原帖
我知道之前有人问过这个问题,但我有一个具体的解决方案,我想知道之前是否讨论过这种类型的解决方案,以及我可以从哪里了解它的可靠性和接受程度。
问题是如何在 javascript 中扩展 native 类型而不真正弄乱类型本身,所以仅仅改变 Array.prototype 是不好的(也许其他代码正在使用 for..in 和数组)。创建一个返回带有一些函数的 native 数组的假构造函数似乎也不是一个好的解决方案,实际上扩展 native 对象似乎更好。但是您也不能使用 native 类型执行普通的 javascript 虚拟函数原型(prototype) switcharoo 样式扩展,因为当您尝试调用 native 函数时,您会遇到“push is not generic”之类的错误。
因此,我想到的解决方案是这样工作的:创建另一个窗口,向该窗口中的 native 构造函数的原型(prototype)添加功能,然后在您的程序中使用这些构造函数。
此示例将 Array
扩展为 My.Array
,并使用 each
函数将 String
扩展为 My .String
带有 alert
功能。
var My = (function(){
// create an iframe to get a separate global scope
var iframe = document.createElement('iframe');
iframe.style.height = '0px';
iframe.style.width = '0px';
iframe.style.border = 'none';
iframe.style.position = 'absolute';
iframe.style.left = '-99999px';
document.documentElement.appendChild(iframe);
var My = iframe.contentWindow;
My.String.prototype.alert = function(){
alert(this);
}
My.Array.prototype.each = function(callback){
for (var i=0, l=this.length; i<l; i++) {
callback(this[i], i);
}
}
return My;
}());
同样,我的问题是之前是否讨论过这种方法,它叫什么,我在哪里可以找到更多信息等。我想知道是否有更简洁的方法来获得另一个全局范围而不使用 iframe ,或者如果在某些 javascript 引擎中由于某种原因这可能会失败,或者如果有人认为这是一个特别糟糕的主意或其他什么。
更新:我猜人们称这种东西为 iframe 沙箱,不要与 HTML5 iframe 沙箱属性混淆。
相关:
http://dean.edwards.name/weblog/2006/11/hooray/
http://webreflection.blogspot.com/2008/03/javascript-arrayobject.html
最佳答案
我在各种浏览器(Safari、Opera、IE7-9、Chrome、Firefox)中运行了这个页面,并在除 Firefox 之外的所有浏览器中获得了一致的结果,在 Firefox 中,原型(prototype)被沙盒化了,所以这很好,但第二次测试由于某种原因失败了火狐。 iframe 原型(prototype)不会立即扩充。但是,如果您无意增加它,这并不重要。您可以尝试在更多浏览器中运行它进行测试。
请注意,这并没有真正测试任何怪癖,例如(My.Array().slice
将根据浏览器返回主要的 window
数组.. .) 并且可能还有更多。所以我会说这很不安全。
无论如何,这是一种矫枉过正的做法,似乎工作量太大而没有真正的收获。
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script type="text/javascript">
(function(){
var ifr = document.createElement("iframe"),
callbacks = [],
hasReadyState = "readyState" in ifr;
ifr.style.display = "none";
document.body.appendChild(ifr);
ifrDoc = ifr.contentWindow.document;
ifrDoc.open();
ifrDoc.write( "<!DOCTYPE html><html><head></head><body>"+"<"+"script"+">var w = this;"+"</"+"script"+">"+"</body></html>");
ifrDoc.close();
if( hasReadyState ) {
ifr.onreadystatechange = function(){
if( this.readyState === "complete" ) {
fireCallbacks();
}
};
}
function fireCallbacks(){
var i, l = callbacks.length;
window.My = ifr.contentWindow.w;
for( i = 0; i < l; ++i ) {
callbacks[i]();
}
callbacks.length = 0;
}
function checkReady(){
if( hasReadyState && ifr.readyState === "complete" ) {
fireCallbacks();
}
else if( !hasReadyState ) {
fireCallbacks();
}
}
window.MyReady = function(fn){
if( typeof fn == "function" ) {
callbacks.push( fn );
}
};
window.onload = checkReady; //Change this to DOMReady or whatever
})()
MyReady( function(){
My.Object.prototype.test = "hi";
var a = new My.Object(),
b = new Object();
console.log( Math.random(), My.Object !== Object && b.test !== "hi", a.test === "hi" );
});
</script>
</body>
</html>
关于javascript - "iframe sandbox"技术安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8425016/
原谅那个疯狂的标题... 我试图理解面向对象编程中继承与接口(interface)的概念。所以我试图将它与我已经知道的东西联系起来,这就是 CSS。 在 CSS 中,您可以选择在允许元素“继承”样式的
我有一个 C 函数,它返回一个表示二进制数据的 unsigned char*。我在文档中注意到 SWIG 有一个很好的类型映射来处理二进制数据作为 C 函数的输入,但是当 C 函数返回二进制数据及其无
过去遇到过几次类似的问题,想知道用什么语言(方法)来解决类似的问题(我是J2EE/java开发人员): 问题:在一组可能的单词中,根据给定的规则(假设单词可以是 A 和 X 的组合,并且始终以 X 开
这个问题不太可能帮助任何 future 的访客;它只与一个小地理区域、一个特定时刻或一个非常狭窄的情况相关,而这些情况通常不适用于互联网的全局受众。如需帮助使这个问题更广泛地适用,visit the
如果我们已经开发了自己的ORM框架并且该框架在过去的几年中运行良好,那么为什么我们要为即将到来的软件项目学习和使用全新的.net技术,例如LINQ或Entity Framework或NHibernat
即使听起来很奇怪,我相信每个人在处理具有大量自定义组件的大型应用程序时都遇到过此类问题。某个地方生成了 AV,但应用程序仍在继续执行,稍后会出现错误。我不是在谈论多线程应用程序。只是关于通用的单线程应
我正在设计一个新项目,我正在尝试找出将数据/事件从服务器应用程序推送到客户端应用程序(即 WPF 应用程序)的方法。 我知道的两个是: 发布/订阅(即 NServiceBus) Full Duplex
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 5年前关闭。 Improve thi
这个问题在这里已经有了答案: C# .NET: How to check if we're running on battery? (6 个答案) 关闭 9 年前。 我发现许多 API 可以帮助确定
没有 JQUERY!我有一个下拉列表,用户可以在其中选择日期、月份和年份。我创建以下代码并使用 setFullYear 将这些值传递到变量中。有时我还会向这个变量添加天数,这就是变量 ev_num 的
我有一个控件,我想在表单和打印时以不同的方式绘制它。这是我做的方式: private void printDocument1_PrintPage(object sender, System.Drawi
我正在尝试确定从扫描文档中提取手写数据的最佳方法。 手写数据位于特定的方框区域。我生成了文档的数字版本,因此我知道方框区域的坐标,并且如果需要还可以生成文档的其他变体(即被屏蔽以使字段更容易提取的版本
背景 对于基于音乐的问题,我深表歉意,但细节并没有那么重要。我正在按顺序浏览一个 midi 文件,我正在寻找一种有效的方法来查找数据中的模式以找到称为连音符的东西。见下图: 连音符上方有数字(3 或
经验丰富的 Java 新手,寻求您的智慧: 如果无法确保在对象超出范围时执行某些特定的 block 代码,那么还有哪些其他方法可以提供相同的功能?(看起来 finalize 显然不是那个意思) 一个典
我正在玩一个小的油漆应用程序。我想创建不同的画笔提示(不仅仅是简单的线条)。基本思想是沿着鼠标移动重复(冲压)画笔 Nib 。因为鼠标移动不会为鼠标移动的每个像素分派(dispatch)所需的事件。我
我正在制作时间表应用程序。重要的类是: Period id: int clazz: Clazz SubjectTeacher subject: String teac
关闭。这个问题需要更多 focused .它目前不接受答案。 想要改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this q
我有一个奇怪的任务要解决。我们有一个小型视频窗口(如 300x200 像素,256 色调色板)和 44kHz 2ch 声音在服务器上播放。我们需要将此流视频发送给一些客户端(1,2.. 最多 10 个
我很确定我在这里遗漏了一些东西,因为我对 Shapeless 还很陌生并且我正在学习,但是 Aux 技术实际上什么时候开始需要 ?我看到它是用来暴露一个 type通过将其提升为另一个“同伴”的签名来声
微软有什么理由仍然坚持使用 COM 技术(Office 组件仍然是 COM)……当所有用 COM 完成的事情都可以用 .Net 以更好、更有效的方式完成时 最佳答案 因为它需要一个 长完全重写Offi
我是一名优秀的程序员,十分优秀!