Forbidden x-frame-options omzeilen

Door 14 januari 2013Tips & Trucs

Mocht je een pagina in een iframe laden en er komt niets tevoorschijn? Dan kan het zijn dat de volgende melding in de console staat:

Refused to display document because display forbidden by X-Frame-Options.

Maar wat kan je eraan doen? In het geval dat je Google Maps wilt “embedden” in je website ben je waarschijnlijk “&output=embed” vergeten in de url maar in alle andere gevallen wordt er veelal op het internet gezegd: pech, maar het kan niet. Om met een beter antwoord te komen, bij deze een “workaround”:

Laat ik het volgende bestand: iframe.php noemen:

<?php
if($_GET['url']) {
 	echo file_get_contents($_GET['url']);
}
?>

Vervolgens laden we de url voor het iframe via dit bestand:

<iframe src="iframe.php?url=http://website-welke-niet-wil-laden-in-een-iframe.nl/"></iframe>

En werken! Maar… zodra je op een link klikt kan het zijn dat het niet helemaal vlekkeloos gaat. Daar heb ik het volgende op bedacht:

<?php
/**
 * Huidge URL ophalen
 * @return string Volledige huidige url
 */
function curPageURL() {
	$pageURL = 'http';
	if ($_SERVER["HTTPS"] == "on"){
		$pageURL .= "s";
	}
	$pageURL .= "://";
	if ($_SERVER["SERVER_PORT"] != "80"){
		$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
	} else {
		$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
	}
	return $pageURL;
}

/**
 * Volledige url maken
 * @param  string $url  Huidige url
 * @param  array $host URL gegevens vanuit parse_url
 * @return string       Volledige url
 */
function nieuwe_url($url,$host)
{
	$scheme 	= $host['scheme']; //http of https
	$host 		= $scheme.'://'.$host['host'];

	if($url != '#' AND $url != '')
	{
		// Begint met "//" ?
		if(substr($url,0,2) == '//')
		{
			$url = $scheme.':'.$url;

		// Begint met "/" ?
		} elseif(substr($url,0,1) == '/')
		{
			$url = $host.$url;

		// Wat voor opties zijn er nog meer?
		} else {
			$url = $url;
		}

		$url = curPageURL().'?url='.$url;
	}
	return $url;
}

/**
 * En beginnen!
 */
if($_GET['url'])
{
	// Content ophalen
	$content 	= file_get_contents($_GET['url']);

	// Gegevens uit de url halen
	$url 		= parse_url($_GET['url']);

	// HTML in DOM laden
	$dom 		= new DOMDocument();
	@$dom->loadHTML($content);

	// Door alle "a" tags loopen
	foreach($dom->getElementsByTagName('a') as $linkjes)
	{
		// Href ophalen
		$href 	= $linkjes->getAttribute('href');
		// Nieuwe url ophalen uit functie
		$nieuw 	= nieuwe_url($href,$url);
		// Href verwijderen
		$linkjes->removeAttribute('href');
		// Nieuwe href toevoegen
		$linkjes->setAttribute('href', $nieuw);
	}

	// Het resultaat!
	echo @$dom->saveHTML();
}
?>

Ik heb dit niet getest met alle websites! Maar bij de meeste zou dit moeten werken. Daarnaast dit nog even: de x-frame-options zijn er niet voor niets, het gebruik van deze methode is dan ook op eigen risico natuurlijk.

Hirens Boot CD
Volgende bericht