Youtube 嵌入:不安全的 JavaScript 尝试访问框架

Posted

技术标签:

【中文标题】Youtube 嵌入:不安全的 JavaScript 尝试访问框架【英文标题】:Youtube embed: Unsafe JavaScript attempt to access frame 【发布时间】:2011-09-14 19:51:45 【问题描述】:

我们有一个 Wicket 应用,其页面包含嵌入的 Youtube 视频。视频嵌入并播放良好,但显然它会导致页面的其余部分无法呈现 - 似乎嵌入后 的 DOM 元素根本不会显示在页面上,尽管在标记。

查看 Chrome 中的错误控制台会发现:

不安全的 javascript 尝试访问 带有 URL 的框架 http://example.com/detail/COMMUNICATION/search/com-sonyericsson-hanashi 从带有 URL 的框架 http://www.youtube.com/embed/eJY7_De5opI?enablejsapi=1&autohide=1&showinfo=1。 域、协议和端口必须 匹配。

我已经用谷歌搜索了很多,人们似乎在说it's innocuous 并忽略它。这似乎是错误的,在我们的例子中它实际上破坏了页面。

如果我们更改我们的应用程序,以便通过 ajax 回调(用户单击 Wicket AjaxLink)动态嵌入视频,我们仍然会在控制台中收到错误,但至少页面可以完全呈现​​。不幸的是,这对我们不起作用,因为我们需要在用户第一次点击页面时默认加载视频。

编辑:我应该补充一点,虽然错误消息来自 Chrome 控制台,但该错误似乎影响了我尝试过的所有浏览器:Chrome、Safari 和 Firefox。

【问题讨论】:

我知道这是一个旧项目,但你检查过 Facebook 是如何做到的吗?他们不会每次都出错。他们使用旧的<embed> 标签,但他们在 facebook iFrame 中执行此操作(我相信我完全正确)。 对我来说似乎不是无害的。在我从 <iframe> 切换到 <embed> 代码之前,我的 JavaScript API 调用不起作用。 【参考方案1】:

对我来说,它通过使用这里的代码来工作: https://developers.google.com/youtube/iframe_api_reference#Loading_a_Video_Player

我修复的行用 2 asterix ** code

由此而来:

var tag = document.createElement('script');
          tag.src = "**http://www.youtube.com/player_api**";
          var firstScriptTag = document.getElementsByTagName('script')[0];
          firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
          var players = new Array();
          function **onYouTubePlayerAPIReady()** 

        var ids = $('div.video div');

        for(var i=0; i < ids.length; i++) 
            players.push(new YT.Player('**yt**'+i, 
                height: '400',
                width: '596',
                videoId: $(ids[i]).attr('rel'),
                events: 
                    'onReady': onPlayerReady,
                    'onStateChange': onPlayerStateChange
                
            ));
        

      

对此:

var tag = document.createElement('script');
  tag.src = "**https://www.youtube.com/iframe_api**";
  var firstScriptTag = document.getElementsByTagName('script')[0];
  firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
  var players = new Array();
  function **onYouTubeIframeAPIReady()** 

    var ids = $('div.video div');

    for(var i=0; i < ids.length; i++) 
        players.push(new YT.Player('**player**'+i, 
            height: '400',
            width: '596',
            videoId: $(ids[i]).attr('rel'),
            events: 
                'onReady': onPlayerReady,
                'onStateChange': onPlayerStateChange
            
        ));
    

  

【讨论】:

【参考方案2】:

如果您在解决该 JavaScript 错误时遇到问题,可以尝试使用 YouTube 的旧嵌入代码。单击嵌入后,它是每个 YouTube 视频的一个选项。您不会出现该错误,因为它不使用 iframe。代码看起来像这样:

<object  >
    <param name="movie" value="http://www.youtube.com/v/9DXL9vIUbWg?version=3&amp;hl=en_US&amp;rel=0"></param>
    <param name="allowFullScreen" value="true"></param>
    <param name="allowscriptaccess" value="always"></param>
    <embed src="http://www.youtube.com/v/9DXL9vIUbWg?version=3&amp;hl=en_US&amp;rel=0" type="application/x-shockwave-flash"   allowscriptaccess="always" allowfullscreen="true"></embed>
</object>

希望这会有所帮助。

【讨论】:

这并不总是与移动浏览器上的响应式设计配合得很好。 加上 方法,你会得到很多: .PPAPIContext: GL ERROR :GL_INVALID_VALUE : glTexSubImage2D: bad dimensions。错误【参考方案3】:

我投票支持 Jonathan Torres 的回答,因为他的代码停止了 Javascript 警告。然而,当我验证代码时,我发现了错误。

所以我的答案是这样的......

在使用 YouTube 的嵌入代码时勾选“使用旧嵌入代码”复选框,这样您就不会使用 iframe。

要使代码验证您需要添加....

type="movie"

data="http://SAME YOUTUBE URL USED IN THE FIRST PARAM ELEMENT/"

OBJECT 元素。然后使 PARAM 元素自动关闭(但不是 EMBED 元素)。

这应该使您的 YouTube 代码看起来像这样......

<object   type="movie" data="http://www.youtube.com/v/9DXL9vIUbWg?version=3&amp;hl=en_US&amp;rel=0">
<param name="movie" value="http://www.youtube.com/v/9DXL9vIUbWg?version=3&amp;hl=en_US&amp;rel=0"></param><param name="allowFullScreen" value="true" />
<param name="allowscriptaccess" value="always" />
<embed src="http://www.youtube.com/v/9DXL9vIUbWg?version=3&amp;hl=en_US&amp;rel=0" type="application/x-shockwave-flash"   allowscriptaccess="always" allowfullscreen="true"></embed>
</object>

然后您应该不会收到任何 Javascript 警告,并且您的代码应该会通过验证。

【讨论】:

感谢您花时间解决这个问题并发布!为我工作。【参考方案4】:

不安全的 JavaScript 尝试访问框架错误与您的页面未呈现无关。标记损坏(例如,缺少 &lt;/iframe&gt;)是最可能的原因。

至于不安全的 JavaScript 尝试访问框架错误,您有几个选择:

    最简单的解决方案是使用 IFrame Player API 而不是手动添加 iframe 标记。 API 是一段 JavaScript,为您生成 iframe 标记并添加将(或应该)消除帧访问错误的参数。以下是IFrame Player API to load a player的使用说明。

    手动解决方案是构建&lt;iframe&gt; 标记并将&amp;origin=http://example.com 参数附加到URL。引用:

作为一项额外的安全措施,您还应该包括来源 URL 的参数,指定 URL 方案(http:// 或 https://) 和您的主机页面的完整域作为参数值。而原产地 是可选的,包括它可以防止恶意第三方 JavaScript 被注入你的页面并劫持你的控制权 YouTube 播放器。

【讨论】:

尝试了第二种方法,但效果不佳。仍然收到控制台警告。谢谢。 不,这仍然会导致问题。s【参考方案5】:

安全错误不太可能破坏您的页面。看起来错误是在 YouTube 框架内发生的,这意味着在最坏的情况下,框架的内容会被弄乱。

来自外部页面的框架/iframe 在任何情况下都不会影响父文档的内容,除非它们来自相同的域和端口号。这是浏览器安全的硬性规则之一。

错误必须在您的标记中的其他位置。有机会看到一些示例标记吗?

[编辑]

错误也可能出现在嵌入代码标记中。或者,如果任何脚本标签直接包含在页面上(而不是 iframe 中),它可能就在那里。

通常当这样的问题发生时,是因为某个地方的标签未闭合,但也可能是 Javascript。

【讨论】:

这听起来很糟糕,因为它非常不直观。但是,iframe 不能内联关闭,并且仍然与大多数浏览器兼容。所以不要使用/&gt;,你需要使用&gt;&lt;/iframe&gt; 哇,我不敢相信就是这样。我应该更清楚:我几天前写了这篇文章,基本上是同一个问题:***.com/questions/6207309/…。非常感谢,安德鲁。 不客气。我从来不明白为什么&lt;iframe&gt; 不能内联关闭:) 这是我最讨厌的事情之一。 iframe 不会自动关闭,因为它们可以包含要为无法呈现 iframe 的浏览器显示的内容,相当于 noscript 标记。自闭合标签在 xhtml 中很突出,但需要注意的是 - xhtml 不依赖于文档类型,而是依赖于内容类型。如果您的标头设置为传递 text/html,浏览器会将其解释为 html,而不是 xhtml,并可能导致诸如此类的呈现错误。 另外,不要使用 Javascript(例如 $.html('

以上是关于Youtube 嵌入:不安全的 JavaScript 尝试访问框架的主要内容,如果未能解决你的问题,请参考以下文章

验证/允许 YouTube 嵌入代码

嵌入不带视频 ID 的 YouTube 频道的当前直播

HTML 中嵌入的 YouTube 视频在前端不可见

YouTube 嵌入在特定时间开始不起作用

嵌入的 YouTube 视频在 iframe HTML 中不可用

“全屏不可用”将YouTube视频作为iframe嵌入QWebEngineView中