Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/89.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是否在沙盒Iframe中执行?_Javascript_Html_Iframe - Fatal编程技术网

检测JavaScript是否在沙盒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检查

我有一个用Flash播放视频的产品(如果有的话),如果Flash不可用,我会选择HTML5

我无法找到一种方法来确定JavaScript是否在具有“sandbox”属性的Iframe中执行,这对于我的解决方案是必要的,因为沙盒Iframe禁用了所有插件。沙盒iframe可以如此简单:

<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中使用,则返回
    null

    一旦有了对iframe的引用,就可以使用或检查其属性。还有一个属性,它应该返回
    DOMSettableTokenList
    (旧浏览器可能会根据旧规范返回字符串)

  • 不带

    也就是说,没有属性的跨源iFrame,或者具有包含和关键字的属性的跨源iFrame

    在这种情况下,将阻止使用:

    • ,它应该抛出一个异常。这是由Chrome实现的
    • ,它应该返回
      null
      。这是由Firefox实现的

    那么,在这种情况下,我认为您无法区分iframe是否是沙盒。但是,由于使用<代码>允许同一原点在一个交叉原点中,IFRAME没有多大用处,请考虑IFRAME不是沙箱。

  • i使用

    也就是说,iFrame的属性不包含关键字,但包含关键字

    与前一种情况一样,将阻止使用

    但是,您可以检测到这种情况,因为
    document.domain
    将是空字符串

注意:Firefox将数据URI视为同一来源,因此没有问题。然而,Chrome将其视为交叉来源。然后,
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上很有用,