检测JavaScript是否在沙盒Iframe中执行?
我有一个用Flash播放视频的产品(如果有的话),如果Flash不可用,我会选择HTML5 我无法找到一种方法来确定JavaScript是否在具有“sandbox”属性的Iframe中执行,这对于我的解决方案是必要的,因为沙盒Iframe禁用了所有插件。沙盒iframe可以如此简单:检测JavaScript是否在沙盒Iframe中执行?,javascript,html,iframe,Javascript,Html,Iframe,我有一个用Flash播放视频的产品(如果有的话),如果Flash不可用,我会选择HTML5 我无法找到一种方法来确定JavaScript是否在具有“sandbox”属性的Iframe中执行,这对于我的解决方案是必要的,因为沙盒Iframe禁用了所有插件。沙盒iframe可以如此简单: <iframe src="http://www.cross-domain.com/" sandbox="allow-scripts"> 为了确定Flash是否被启用,我使用了swfobject检查
<iframe src="http://www.cross-domain.com/" sandbox="allow-scripts">
为了确定Flash是否被启用,我使用了swfobject检查navigator.plugins[“Shockwave Flash”].description的方法,即使在沙盒iframe中也会设置它。我可以加载swf对象,但它不能播放
要重现此问题,请访问,打开您的chrome inspector并单击“运行”。跨域站点上的脚本将在沙盒iframe的上下文中暂停
根据W3规范at,在JavaScript可以访问的文档上应该有一个“活动沙箱标志集”(至少我是这样阅读规范的)。iframe的文档上似乎没有设置任何标志
是否有任何想法/解决方案来检测JavaScript是否在沙箱中执行?< /P> < P>我将考虑不同类型的IFRAMS(选择第一种情况):
- i使用 也就是说,iFrame的属性不包含关键字 这面旗。特别是,不能使用脚本检查iframe是否已沙盒化
- 相同来源的iFrame不带
也就是说,没有属性的同源iframe,或者包含和关键字的属性的同源iframe
在这种情况下,您可以使用全局属性来访问frame元素(如果未在iframe中使用,则返回
) 一旦有了对iframe的引用,就可以使用或检查其属性。还有一个属性,它应该返回null
(旧浏览器可能会根据旧规范返回字符串)DOMSettableTokenList
- 不带
也就是说,没有属性的跨源iFrame,或者具有包含和关键字的属性的跨源iFrame
在这种情况下,将阻止使用:
- ,它应该抛出一个异常。这是由Chrome实现的
- ,它应该返回
。这是由Firefox实现的null
- i使用
也就是说,iFrame的属性不包含关键字,但包含关键字
与前一种情况一样,将阻止使用
但是,您可以检测到这种情况,因为
将是空字符串document.domain
frameElement
不起作用,document.domain
是空字符串,不管iframe是否是沙盒。您可以检查location.protocol
是否为'data:'
字符串以检测数据URI
一般来说,您可以尝试以下方法
function isSandboxedIframe() {
if (window.parent === window) return 'no-iframe';
try { var f = window.frameElement; } catch(err) { f = null; }
if(f === null) {
if(document.domain !== '') return 'unkown'; // Probably 'non-sandboxed'
if(location.protocol !== 'data:') return 'sandboxed';
return 'unkown'; // Can be 'sandboxed' on Firefox
}
return f.hasAttribute('sandbox') ? 'sandboxed' : 'non-sandboxed';
}
项目可以帮助您检测是否正在运行沙盒
沙盒首先检查自身是否被框定,然后扫描框架元素的属性以检测关于自身的多个信息。这些包括框装
,交叉原点
,沙盒
,沙盒
,不可沙盒
,可重新沙盒
,沙盒
在我们的例子中,为了检测自身是否是沙盒,它会检查frame元素是否具有属性sandbox
// On below `frameEl` is the detected frame element
try {
result.sandboxed = frameEl.hasAttribute("sandbox");
}
catch (sandboxErr) {
result.sandboxed = null;
if (typeof errback === "function") {
errback(sandboxErr);
}
}
我试图复制您的问题并测试此解决方案是否有效,由于安全问题,我不得不将脚本粘贴到窗口本身
<html>
<head>
</head>
<body>
<script>
//Paste the contents of the script(https://raw.githubusercontent.com/JamesMGreene/sandblaster/master/dist/sandblaster.js) here
var result = sandblaster.detect();
if(result.sandboxed === true) {
//sandboxed
}
debugger;
</script>
</body>
</html>
//粘贴脚本的内容(https://raw.githubusercontent.com/JamesMGreene/sandblaster/master/dist/sandblaster.js)这里
var result=sandblaster.detect();
if(result.sandboxed==true){
//沙箱
}
调试器;
这是一个演示:它显示了这一点。但这肯定是HTML5回退的重点吗?@theonlygusti如果你继续阅读,问题是我不知道什么时候需要回退到HTML5。从浏览器中获得的所有信息都告诉我Flash已启用,因此我加载Flash。如果我需要加载我的HTML5解决方案,我需要知道JavaScript中是否禁用了Flash。如果你告诉我如何判断Flash是否被禁用,它将解决我的问题。document.plugins呢?这可能会告诉你一些不同于navigator.plugins的东西。后者是已安装的插件,前者(据推测)是文档中的插件,可能由于沙盒而有所不同。但我还没有检查。在沙盒iframe中和iframe之外,document.plugins在Chrome和Firefox中都返回一个空数组。好主意!重复(虽然两个答案都没有投票结果)。如果项目在将来消失,你有没有机会补充一下sandblaster是如何做的。我添加了一些我认为是相关的。这对我来说非常有用,甚至是跨领域的。该键位于_getEffectiveScriptOrigin()函数中。基本上,如果您在沙盒iframe中,document.domain将是空字符串。否则它将被设置为某个值。下面是一个示例,在检测沙盒iframe的行中有一个调试器语句:@Omninternet,很好。这对我在Firefox上很有用,