Georg: Wie umgeht z.B. Adsense die CORS-Richtlinie?

Hallo,

ich habe das Problem das ich Drittinhalte aus einer externen Quelle darstellen möchte - besser gesagt wir sind der Drittanbieter; der Realisationsansatz ist hierbei den (dynamischen) Content via JS (AJAX) zu laden und mit DOM-Manipulationen in der jw. Site anzuzeigen - also das gleiche Funktionsbetrieb wie z.B. Adsense, Analytics, Maps und Co.

Diese grundsätzliche Einbindungsmethode (JS/DOM-Mani) ist leider auch derzeit aufgrund der Einsatz-Planung nicht änderbar.

Nun muss ich leider aufgrund meiner begrenzten Kenntnisse in JS vor den Google-Entwicklern meinen Hut ziehen, da diese es ja definitiv geschaft haben, die CORS-Richtlinien der Browser zu umgehen.

Technisch habe ich folgende Voraussetzungen:

  • Einbindung eines extern gelagerten JS-Datei
  • Diese soll a) Content via AJAX aus gleicher, externer (immer von dem Punkt der Einbidung/Darstellung aus gesehen) Quelle laden
  • Lokales DOM erweitern und extern geladenen Content entsprechend einspeisen

Mein Problem hier ist das mir die Sicherheitseinstellungen der Browser in die Quere kommen, d.h. ich bekomme den externen Content nicht geladen und kann mit dem extern geladenen Funktionen offensichtlich nicht wie angedacht das DOM modifizieren.

Da es ja aber möglich sein muss (sonst wären alle die oben aufgeführten Google-Services ja nicht funktional) bitte ich jetzt hier einmal um technische Hilfe.

Für konstruktive Antworten bedanke ich mich im Voraus.

VG
Georg

  1. Hallo Georg,

    Nun muss ich leider aufgrund meiner begrenzten Kenntnisse in JS vor den Google-Entwicklern meinen Hut ziehen, da diese es ja definitiv geschaft haben, die CORS-Richtlinien der Browser zu umgehen.

    Meines Wissens sind das alles Iframes.

    Bis demnächst
    Matthias

    --
    Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
  2. Lieber Georg,

    der von extern einzubindende Content muss mit passenden HTTP-Headern ausgeliefert werden. Für solche Fälle habe ich diesen PHP-Code:

    /**
     * function to send neccessary headers for cross-site AJAX calls
     */
    public  function allow_cross_origin_ajax () {
    	$t = $this;
    
    	$remove = array(
    		'X-Content-Type-Options',
    		'X-Frame-Options',
    		'X-XSS-Protection',
    		'Content-Security-Policy',
    		'X-Content-Security-Policy',
    		'X-WebKit-CSP'
    	);
    
    	$_headers = array();
    
    	foreach ($t->headers as $key => $value) {
    
    		if (!in_array($key, $remove)) {
    			$_headers[$key] = $value;
    		}
    	}
    
    	$t->headers = $_headers;
    
    	header('Access-Control-Allow-Headers: *');
    	header('Access-Control-Allow-Methods: GET');
    	header('Access-Control-Allow-Origin: *');
    	header('Access-Control-Allow-Credentials: true');
    }
    
    /**
     * function to send the response data to the browser
     *
     * This method also sends all header data stored in this class.
     */
    public  function send_data () {
    	$t = $this;
    
    	foreach ($t->headers as $key => $value) {
    		header("$key: $value");
    	}
    
    	echo $t->content;
    }
    

    Die Methoden meines CMS-Objekts verwalten die zu sendenden HTTP-Header, die bei der Auslieferung des tatsächlichen Contents vorher an den Browser geschickt werden. Da ich einige der von Mozillas Observatory empfohlenen Header einsetze, müssen die für solche Fälle wieder verhindert werden, daher die "Aufräumarbeit" in allow_cross_origin_ajax.

    Hoffentlich hilft Dir das schon weiter.

    Liebe Grüße,

    Felix Riesterer.

  3. Hallo,

    ich habe das Problem das ich Drittinhalte aus einer externen Quelle darstellen möchte - besser gesagt wir sind der Drittanbieter; der Realisationsansatz ist hierbei den (dynamischen) Content via JS (AJAX) zu laden und mit DOM-Manipulationen in der jw. Site anzuzeigen

    Ein Fall für CORS, ja. Hier ein paar Anmerkungen /pl

  4. Hallo!

    der Realisationsansatz ist hierbei den (dynamischen) Content via JS (AJAX) zu laden und mit DOM-Manipulationen in der jw. Site anzuzeigen - also das gleiche Funktionsbetrieb wie z.B. Adsense, Analytics, Maps und Co. ... Nun muss ich leider aufgrund meiner begrenzten Kenntnisse in JS vor den Google-Entwicklern meinen Hut ziehen, da diese es ja definitiv geschaft haben, die CORS-Richtlinien der Browser zu umgehen.

    CORS ist eine Technik um Cross Domain Ajax möglich zu machen. CORS lässt sich nicht "umgehen". CORS lässt sich aktivieren und nutzen. Was dabei kontrolliert "umgangen" wird ist die Same Origin Policy. Das meintest du wahrscheinlich.

    Auch Google "umgeht" CORS nicht. Wie schon angemekrt wurde nutzt AdSense einfach iframes. Das gilt auch für Maps. Analytics wiederrum nutzt das Laden von Bildern (new Image()).

    • Einbindung eines extern gelagerten JS-Datei
    • Diese soll a) Content via AJAX aus gleicher, externer (immer von dem Punkt der Einbidung/Darstellung aus gesehen) Quelle laden

    Wenn du Cross Domain Requests machen möchtest und auf die Response zugreifen willst, dann nutze CORS. Dazu setze die entsprechenden HTTP-Header bei allen Ressourcen die du mit JavaScript laden willst.

    Grüße Regina