2013-08-12 2 views
2

Я пытаюсь выяснить способ междоменной безопасности с iframes и javascript.javascript - обход безопасности перекрестного домена iframe

У нас есть несколько сайтов издателей, в которых есть наш простой файл javascript (через Amazon CloudFront), который непосредственно встроен на их сайты. Скрипт делает несколько вещей на сайте издателей (модифицирует DOM), чтобы отображать статическое объявление, которое мы по-разному позиционируем для каждого сайта издателя.

Когда мы обслуживаем этот же скрипт через iframe (Google DFP), он явно не работает из-за безопасности междоменной безопасности, поскольку URL-адрес iframe и URL-адрес сайта издателя не имеют отношения к делу.

Теперь еще один сервер объявлений, который мы используем, чтобы обойти, что у них есть файл HTML для каждого издателя (таким образом, относительный путь для каждого паба будет чем-то вроде /iframe-buster.html), который содержит некоторый javascript, который позволяет рекламе расширяться за пределами iframe. Я точно не понимаю, что это не мои мысли являются:

  1. Ad показываемых через IFRAME создает subiframe с URL-путь к блокировщику
  2. Новый IFrame URL содержит переменную строки запроса (например, идентификатор объявления)
  3. Затем iframe JS может изменять документы DOM, вызывая parent.parent или top.?

Я понятия не имею, будет ли это работать, кто-нибудь знает или пытается что-то подобное раньше?

ответ

1

Сценарий, размещенный на сайте издателя, не должен (на самом деле не должен) разрушать iframe. Вместо этого целью этого сценария является установление канала связи между AD iframe (размещенным внутри DFP) и страницей издателя.

Уловка здесь - во время выполнения сценарий на странице паба знает, что такое домен DFP iframe url, но скрипт, обслуживаемый через облачный режим, не знает, что такое URL-адрес страницы издателя из-за ограничения доступа к перекрестному домену.

Таким образом, скрипт издателя может установить обработчик postMessage для приема сообщений из объявления Iframe. Это может сделать что-то подобное этому

 function registerPostMessageHandler() { 
      // Listen to message from child window 
      var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent"; 
      var eventer = window[eventMethod]; 
      var messageEvent = eventMethod == "attachEvent" ? "onmessage" : "message"; 

      eventer(messageEvent,function(e) { 
       var key = e.message ? "message" : "data"; 
       var data = e[key]; 
       console.log("Message obtained from origin " + e.origin + ' data: ' + data); 

       //Insert an AD slot based on the message 
      },false); 
     } 

и JS в AD IFRAME может сделать

parent.postMessage(/*where to create the AD slot*/); 

Примечание: «Ad показываемых через IFRAME создает subiframe с URL-путь к блокировщику» - невозможно, потому что iframe не знает домен издателя, и из-за ограничения безопасности он также не может понять.

Смежные вопросы