为什么将base64内容加载到iframe src属性有时会失败

时间:2017-07-06 15:00:45

标签: javascript jquery html

为什么第二次尝试将脚本加载到空iframe失败?我理解第一个失败,因为我试图在页面加载后加载脚本,但我本来期望第二次和第三次尝试工作。我认为它可能是浏览器的安全限制,但通常你会在控制台中看到错误并用<script>alert(1);</script>替换脚本工作正常。

jsfiddle link

的HTML

<iframe id="blah1">
</iframe>

<iframe id="blah2">
</iframe>

<iframe id="blah2-2">
</iframe>

<iframe id="blah3">
</iframe>

的javascript

(function(){
  var content = '<html><head></head><body>' + '<' + 'scr' + 'ipt src="//content.jwplatform.com/players/81b03hN1-8gn7GBWz.js"><\/'+'scr' + 'ipt'+'>' + '</body></html>';

  //attempt 1
  var $body = $('body', $('#blah1').get(0).contentWindow.document);
  $body.html(content);

  //attempt 2
  $('#blah2').attr('src', "data:text/html;charset=utf-8," + escape(content));

  //simple alerts work
  $('#blah2-2').attr('src', "data:text/html;charset=utf-8," + escape('<sc' + 'ript>alert(1);</scr' + 'ipt>'));

  //attempt 3
  var doc = $('#blah3').get(0).contentWindow.document;
  doc.open();
  doc.write(content);
  doc.close();
})();

在firefox中运行后,我看到了一些与ssl相关的错误,所以它可能无法工作,因为base64 iframe被视为一个http窗口,尽管你在Chrome控制台中没有看到任何关于ssl错误的内容,所以它可能是无关的。 / p>

1 个答案:

答案 0 :(得分:0)

原来你没有看到chrome中的任何ssl错误,因为你在使用base64数据URI时无法使用协议相对脚本URL,奇怪的是如果我使用srcdoc来设置iframe内容(在示例中注释掉)协议相对脚本URL工作。一旦我解决了这个问题,看起来ssl错误会导致玩家无法加载足够的问题。

播放器脚本实际上处理HTTP和HTTPS之间的切换,但是当检查正在进行window.location.href.indexOf("https")时,它始终认为您在HTTP上并加载了错误的脚本

&#13;
&#13;
(function(){
  var content = '<html><head></head><body>' + 
  '<' + 'scr' + 'ipt>' + `
  	console.log(window.location.protocol, window.location.href, window.location.href.indexOf("https"));
  ` + '<\/'+'scr' + 'ipt'+'>' +
  '<' + 'scr' + 'ipt src="https://content.jwplatform.com/players/81b03hN1-8gn7GBWz.js"><\/'+'scr' + 'ipt'+'>' + '</body></html>';

  $('#blah1').attr('src', "data:text/html;charset=utf-8," + escape(content));
  //$('#blah1').attr('srcdoc', content);
})();
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<iframe id="blah1">
</iframe>
&#13;
&#13;
&#13;