X-Frame-Options Header gegen ClickJacking
ClickJacking hatte ich in einem älteren Beitrag bereits erwähnt, und es gibt bereits seit langem Gegenmaßnahmen. Der IE8 hat damals ein neues Feature eingeführt, welches mittlerweile von den anderen Browsern auch umgesetzt wurde, und dieses Feature stelle ich hier vor.
Wir als Webseitenbetreiber können damit unterbinden, dass unsere Seite in einem Frame (IFrame eingeschlossen) dargestellt werden. Dazu überprüft der Browser, ob auf der eingebundenen Seite der HTTP-Header X-Frame-Options existiert. Für diesen Header gibt es zwei mögliche Werte:
DENY: Diese Seite darf in keinem Frame dargestellt werden.
SAMEORIGIN: Diese Seite darf nur in einem Frame dargestellt werden wenn die beiden Domains übereinstimmen.
Auf dieser Testseite kann man das ganze nochmal genauer betrachten und sehen ob der eigene Browser die Frames unterdrückt (2 der 3 IFrames sollten keinen Inhalt anzeigen).
Wie kann man nun diesen Header senden? Da gibt es mehrere Möglichkeiten:
- Im Apache eine Einstellung für den ganze Host (bzw. VHost):
Header always append X-Frame-Options DENY
- Im IIS: Internet Service Manager öffnen -> HTTP Headers Tab -> Custom Header hinzufügen:
Custom Header Name: X-Frame-Options Custom Header Value: DENY
- In PHP:
<?php header("X-Frame-Options: DENY"); ?>
- Im Zend Framework als Controller Plugin:
<?php class App_Controller_Plugins_XFrameOptionHeader extends Zend_Controller_Plugin_Abstract { public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) { $this->_response->setHeader('X-FRAME-OPTIONS', 'DENY'); } }
Sollte man einzelne Seiten doch in einem IFrame erlauben wollen muss man entsprechende Ausnahmen einbauen, damit der Header dann nicht gesetzt wird.
Cooler Artikel, seit wann unterstützen die verschiedenen Browser denn diese Kopfzeile?
Ansonsten: Wäre ich noch bei flattr würde ich diesen Artikel nochmal flattrn (blödes Wort, oder?).
Super Beitrag, wir werden das bestimmt mal brauchen können. Ist gebookmarked (auch kein besseres Wort, oder?).
Gruß, Sascha
Sascha Presnac
18 Jun 10 at 11:35
Im MSDN steht eine Liste:
http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspx
Interessant, dass es Firefox anscheinend noch nicht nativ kann, sondern nur mit NoScript (was ja eigentlich auch jeder installiert haben sollte).
Michael Kliewe
18 Jun 10 at 12:00
nette info! danke … kann ich gerade gebrauchen!
jd
18 Jun 10 at 16:58
unter debian muss noch ein „a2enmod headers“ gefolgt von nem apache reload gemacht werden wenn es nicht aktiviert ist .. nur als hinweis 😉
für menschen die nicht wissen wie sie dieses mod_headers aktivieren …
http://httpd.apache.org/docs/2.0/mod/mod_headers.html
jd
18 Jun 10 at 17:03
… vor 10 Jahren haben wir einfach Framebreaker in die Seiten gebaut, das waren zwei Zeilen Javascript.
Heute man dazu also http header manipulieren.
Soso.
Stephen
25 Jun 10 at 13:07
@Stephen: Es soll auch Leute geben die haben NoScript installiert und trauen fremden Seiten nicht ohne Vorbehalt. Javascript ist IMMER optional und du musst davon ausgehen dass es deaktiviert ist.
Michael Kliewe
25 Jun 10 at 13:38
@Stephen: Außerdem kannst du mit etwas krimineller Energie ganz schnell Codes finden, die Framebrecher so manipulieren, dass Sie nicht mehr funktionieren – oder zumindest so lange verzögert werden, dass man diesen Code umschreiben kann (jQuery’s Selecotor Tags können das).
Von daher gilt: Never trust the client!
Sascha Presnac
25 Jun 10 at 13:44
Hat jemand schon mal probiert ob das auch mit den HTML meta-tags (http-equiv) geht?
hakre
25 Jun 10 at 16:13
Warum probierst du es nicht aus?
Und ja, es klappt.
Sascha
3 Jul 10 at 14:22
[…] […]
Was tun Inhaltsklau? - XHTMLforum
8 Sep 10 at 14:21
Hallo, sehr guter Beitrag, bei mir trifft das auch zu die Option unterbindet das einbinden von Fotos mit iframe in einen Beitrag bei WordPress, in welche php Datei muss ich den Header Code einsetzen, weiss jemand mehr???
Gruss Jns
jens
13 Okt 10 at 14:32
Vielen Dank für diesen Beitrag. Es scheint ja als habe die Header Option nur Vorteile. Gibt es einen Trade-Off?
Ich muss sie ja auch nicht unbedingt im Bootstrap setzen, dort wo ich Frame-Darstellung meiner Seite erlauben möchte, kann ich den Header ja deaktivieren.
Jakob
4 Jun 13 at 10:24
Sehr gut, habe die php-Variante auf unserer Seite gleich mal umgesetzt. Danke.
Jan Hartmann
7 Dez 20 at 11:03