Soru İframe çapraz etki olup olmadığını algılamak için kusursuz bir yol


Herhangi bir iframe etki alanı olup olmadığını belirlemeye çalışıyorum. Bu sorudaki kabul edilen cevaba göre: İframe'in etki alanları arasında olduğunu algıla, sonra bunun dışına çık kod girmeye contentDocument iframe bir try / catch blok. Bunu Chrome’daki alanlar arası iframe için denedim:

try { 
  document.getElementsByTagName('iframe')[0].contentDocument;
} catch(err){
  console.log("called");
}

ve yine de etki alanları arası hatayı atar ve hatayı yakalamaz.

Ayrıca, ana sayfanın URL'sinin + ana makine + bağlantı noktasının da olup olmadığını kontrol etmeye çalıştım. src iframe'nin

function thirdPartyIframe(iframe){
  var url = document.location.protocol + "//" + document.location.hostname + (document.location.port === "" ? "" : ":" + document.location.port);
  var regexp = new RegExp(url.replace(/\//g, "\\/").replace(/\./g, "\\."));
  if (iframe.src === '' || regexp.test(iframe.src)){
    return false;
  } else {
    return true;
  }
}

ama bu Facebook'un ana sayfasında ilk iframe için çalışmıyor gibi görünüyor src eşittir (uzun):

"http://www.facebook.com/ai.php?aed=AQLlH2cfdnsnLrDUVyqrQPlWpayw9N09Z_iNuhulevbeEfVa4mcVRcT8cjAZOjQb8y1QXab5Ae3aSEJx49U_Qv35rtSp1VC9cY0_CrpOjMDk40hS_Xm57A996YtRVCcWSuRZ_jZERQ_iA_E4621NAbKHT9dsB7uElkRtTvl5K-zPI0jeH-BEnlZIOXbeEdbRC6qCwoToaltolpe-Ot2KWgkfb_vBZYpzUc3jQoEHzLG6tauO9l_hkXpYpHxnt-KYFKIFZ1PgmrHgb0UcGjeKHl7yBR1AbW2n5XgdgaAhFvBjs5GZlKy566nvl8eLRA60orwkwtWYeN8-gKoAmOLm7-6minsWn8lk1h2Qn3p07HCTSnYHfv1aJ6mF5jmuzP0YYe7Ym9ZbmK-tvax4uPAQJ2OdULilKbEh8M-2V9pVY3AC228OPlrRullZuuOg8DI2A8WeMF-fbbOdOFFVCe5Gj1CaZu3LYXiqdG7mUgY6AEpk9ZzGT4fC2K8DInQo1AypCvzG64C_bEWfODeXe0aGbkWwsUUmO7E5HFg0tvZkK5IAR_xxxQ2rlf5jbcEDo_2gdIDdHe1HT75-SJLUsSA0M8EU01oNNPuWwEC2BW6inepc9QPuqeg42tcEbKLU-rIUnXDBLvgutft8azWPPQ6_LafGjCAmC9uTalagoWLLDMpQOThvPg7YeVd7qg_c9Mzn2GAfuswcxDSxyRIZo9MaOhA6mhfXeE1tmjyBBsMxnx08tO21Jsfgch59fmMxpeJzdsNMPK3FAojfglvCQ2Zrt_6ataexUB4xlM7_PhKrfBPtxb5fe2TE9-nlWruNEpoCrzI05yv4Go3CYEWHob06K_9iICfNVTFkSYGTiJnMXCy_fdgfyzUIn5QJIPRo4-Wnyg444zKAO_nyFW59LqbIanHVfFY6ybiA6KeC3meREWzTPSsrU5d_NbYHlJWb8uPNDR04jaH5e2qiYj3Y8qgLQA5m"

İşlevim onu ​​üçüncü taraf iframe olarak sınıflandırmaz, ancak Chrome'a ​​eriştiğimde alan adı hatayı hala atar contentDocument.

Bunu yapmak için kusursuz, çapraz tarayıcı bir yol arıyorum.


17
2017-09-12 04:42


Menşei




Cevaplar:


Farklı tarayıcıları işlemek ve tarayıcıların web alanları arası erişim ile uğraşmanın farklı yollarını ele almanız için deneyin / yakalamanızdakilerden biraz daha fazlasını yapmanız gerekir:

function canAccessIFrame(iframe) {
    var html = null;
    try { 
      // deal with older browsers
      var doc = iframe.contentDocument || iframe.contentWindow.document;
      html = doc.body.innerHTML;
    } catch(err){
      // do nothing
    }

    return(html !== null);
}

Örneğinizde bu şöyle olurdu:

var accessAllowed = canAccessIFrame(document.getElementsByTagName('iframe')[0]);

Çalışma demo: http://jsfiddle.net/jfriend00/XsPL6/

Chrome 21, Safari 5.1, Firefox 14, IE7, IE8, IE9'da test edildi.


15
2017-09-12 05:03



Tamam bu işe yarıyor gibi görünüyor ama hala kromda konsolda bir hata atar, sanırım bunun bir önemi yok - user730569
Evet, hatayı atar, ancak hata kodunuz tarafından yakalanır, böylece önemli değildir. Ona erişip erişemeyeceğinizi anlayabilirsiniz. - jfriend00
Chrome, bu snippet'in try..catch tarafından görünmeyecek şekilde görünen kendi hatasını atar ve kaydeder. Önemli olduğunu söyleyebilirim. Iframe erişimini ve geçici çözümü güvenli bir şekilde test ettiğimde, konsolun hatalarla birlikte spam olmasını istemiyorum. - Bluu
Ebeveyn etki alanı veya aynı etki alanı ise katıştırılmış içerik sınamasından, bunun diğer yönüne giden güvenli bir eşdeğeri ne olurdu? Birinin ilgilenmesi durumunda bunu ayrı bir soru olarak sordum: Bu sayfa INSIDE çapraz etki alanı iframe olup olmadığını tespit etmek için kusursuz bir yol - user568458