So lassen sich lästige Werbebanner ausschalten
In letzter Zeit erhalte ich immer öfter Suchanfragen gegen meinen Blog gerichtet, in denen Menschen eine Möglichkeit suchen Werbebanner auszufiltern. Es gibt zwar eine ganze Reihe von freien und kommerziellen Adblockern, aber relativ zuverlässiges Blocken von Werbeeinblendungen, geht auch anders.
Es gibt eine Vielzahl unterschiedlicher Anbieter für Werbung im Internet. Eine Form Werbung zu betreiben, ist die Schaltung von so genannten Ads (Advertises). Zur Einblendung dieser Ads betreiben die heutzutage relevanten Anbieter spezielle Server. Wer sich ein bisschen über die beiden Internetstandards IP und DNS informiert, sowie den Quelltext einer werbebehafteten Website analysiert, wird schnell verstehen, wie man mit ein wenig technischer Rafinesse Werbeeinblendungen umgehen kann.
Hier der Trick: In Windows XP und Windows Vista (ich glaube auch schon in Windows 2000) gibt es eine Datei, in der man zu einem Hostnamen (also beispielsweise www.google.de (Man beachte, dass das “www” den Hostnamen angibt – “google.de” ist die Domäne) eine feste IP-Adresse vergeben kann. Unabhängig davon, welche IP-Adresse der DNS-Server Deines Computers zurückgibt, wenn nach www.google.de gesucht wird, wird immer dieser Wert verwendet, der in dieser Datei hinterlegt ist.
Die Datei befindet sich unter C:\Windows\System32\drivers\etc\. Es handelt sich um die Datei “hosts”. (Diese Datei hat keine Dateiendung). Innerhalb dieser Datei kann man nun eine IP-Adresse zu einem Hostnamen verlinken. Aber wie schaltet man nun Werbung ab?
Nehmen wir an, wir wissen, dass der Server ads.irgendwas.de ein Werbeserver ist, der unsere Lieblingsseiten immerzu mit Werbung bestückt. Um die jeden Traffic von und zu diesem Server zu unterbinden (also auch Werbeeinblendungen), verlinken wir den hostnamen ads.irgendwas.de mit der IP-Adresse “127.0.0.1″. Diese IP-Adresse ist auf jedem System nämlich die eigene Netzwerkkarte. Wenn wir diesen Eintrag also hinzugefügt haben und die betreffende Seite besuchen, wird folgerichtig keine Werbung mehr angezeigt.
Bei Studivz/meinVZ zum Beispiel sieht das Ergebnis wie folgt aus.
StudiVZ mit Werbung

StudiVZ ohne Werbung

Nettes Ergebnis, oder? :-)
Im Grunde genommen ist es also ganz einfach, aber es gibt nicht nur einen sondern hunderte Ad-Server. Hierfür habe ich eine Lösung bereits vorbereitet. Downloaded euch diese vorbereitete Hosts-Datei und entpackt sie in das oben angegebene Verzeichnis eurer Windows-Installation. Nach einem Neustart eures Browsers greift die Änderung.
vmk schreibt:
Die hosts-Datei stammt aus einer Zeit, als es noch keine Nameserver gab, die einen Hostnamen in eine IP-Adresse übersetzen konnten. Daher kommt die Datei ursprünglich von Unix-Basierten Betriebssystemen. Bei Windows existiert die Datei in der gesamten Win9x sowie WinNT-Linie.
Mit der von dir beschriebenen Methode kannst du nur teilweise Werbung blockieren. Es wird damit auf Seite sample.inv keine Werbung geblockt, die per sample.inv/ads/xyz eingebunden wird. Um diese zu Blocken, müßtest du wieder einen Werbeblocker installieren. Ab diesem Zeitpunkt musst du dann aber schon 2 Stellen pflegen.
Ausserdem können Werbeblocker ihre Filterlisten automatisch aktualisieren. Das funktioniert bei der von dir beschriebenen Methode auch nicht.
Bevor es Werbeblocker gab, war deine Methode eine der wenigen Möglichkeiten Werbung zu filtern. Seit einigen Jahren kann sollte man doch lieber auf eine Browsererweiterung setzen.
Gruß vmk
14.6.2008 um 15:14
Peter Piksa schreibt:
Hallo vmk,
Du schreibst dass Werbeeinblendungen, die von einem Unterverzeichnis aufgerufen werden, deren Server innerhalb der Hosts-Datei geblockt ist, trotzdem angezeigt werden. Das stimmt nicht. Wenn ein Computer einen Hostnamen auf die 127.0.0.1 bindet, lässt sich persé keine Verbindung zu diesem Host aufbauen, somit werden auch Unterverzeichnisse nicht gefunden.
Aus einer Anfrage irgendwas.de/dir1/dir2/bild.jpg interpretiert der Computer mit dem Host-Eintrag 127.0.0.1/dir1/dir2/bild.jpg und stellt somit keine Verbindung her. Adblocking ist auch in diesem Fall erfolgreich. Viele Grüsse Peter
14.6.2008 um 15:30
vitajixo schreibt:
Das Problem sind Domains, die einen eigenen DNS Eintrag haben. Z.B. ad.d.de != d.de. Dann bringt der d.de Eintrag auch nix ;)
Und daher ist die Methode auch nicht empfehlenswert. Zentrales URL-filtern ist da wohl am besten über squid und redirectors wie asqredir zu realisieren.
23.6.2008 um 8:57
Peter Piksa schreibt:
@ vitajixo:
Dann nimm doch einfach deinen Host ad.d.de ebenfalls mit 127.0.0.1 in die Datei auf. Was du beschreibst, ist ja kein Ausnahmefall, sondern nichts anderes, als was ursprünglich hier beschrieben ist (definierten Hostnamen mit Localhost binden). PS: Danke für den Hinweis @ Squid.
23.6.2008 um 17:00
vitajixo schreibt:
Das macht es nicht zu einer besseren Methode, es ist hier mehr als anzuraten nicht den hostnamen direkt abzugleichen, sondern die HTTP Requests die z.B. der Browser schickt gegen eine Liste zu matchen (z.B. wie gesagt asqredir), und den gematchten dann 1Byte zurückschicken oder ähnliches.
Abgesehen davon öffnet deine Methode eine Tür auf den localhost (und zwar der übelsten Sorte). Normalerweise ist ad.d.de halt nicht 127.0.0.1 ;) Mit ad.d.de:137 biste dann schonma auf den smb shares von win32 (die ports weiß ich nicht mehr sicher…), da kann dann u.A. der Javascriptinterpreter in deinem Browser direkt mit localhost kommunizieren.
25.6.2008 um 18:42
Peter Piksa schreibt:
Moin Vitajixo! Ich sehe aktuell noch nicht die daraus resultierende Gefahr. Würde man ein Javascript verwenden wollen, welches etwas schadhaftes ausführt, müsste man es doch erst vom Server auf den Client bringen und da dies nicht funktioniert (mit dem Server kann ja aufgrund des Bindings zu localhost nicht mehr kommuniziert werden), besteht keine Gefahr weil der Client kein JavaScript übermittelt bekommt. Oder habe ich etwas übersehen? o.O
25.6.2008 um 19:13
vitajixo schreibt:
Das Script (wir müssen uns hier nicht auf Javascript und Browser festlegen, nach deiner Methode wär der DNS rewrite sogar systemweit …) kann auf jedem Server liegen, lediglich kommunizieren kann es mit dem “Fake” Server, der hier ein rewrite bekommt.
Ob das script da auf l.k.de liegt oder auf d.o.nu ist dabei völlig egal, es kann aber mit ad.d.de (127.0.0.1) kommunizieren, dazu muss es nicht selbst auf ad.d.de liegen. Das lässt sich dann auf sämtliche Anwendungen im Userspace übertragen … Dass das geht, ist klar. (Auch, wenn bng102.x.us in den meißten fällen nicht bng103.x.us mit einschließen würde, da kann man natürlich alle “sinnvollen” möglichkeiten in die hosts schreiben, das ist aber ne ziehmlich löchrige methode, weil wirklich der rewrite auf EINE domain, und nicht die Domain als parsebarer String, gematcht wird.)
25.6.2008 um 19:21
Peter Piksa schreibt:
Ich glaube du hast meine Frage nicht ganz verstanden. Wir sprechen ja von einem Script. Woher kommt dieses Script denn? Wenn es nicht von meinem Rechner kommt, muss es ja von dem Server a.bc.de kommen. Wenn ich diesen jedoch mit localhost binde, wird das Script folgerichtig nicht laden und somit nicht ausführen.
25.6.2008 um 19:35
vitajixo schreibt:
Woher weißt du denn auf welchem Server das liegen wird? Dazu brauchst du hellseherische Fähigkeiten … es geht hier nicht um einen Werbebanner dessen serverhost du in der hosts erfassen willst, der bekannt ist, sondern ein Script das sonstwo liegen und auf jeder x-beliebigen Seite inkludiert werden kann. Und es geht immernoch nicht nur um Javascript sondern um ein _riesiges_ Sicherheitsleck, weil ein ganzer, oder hier sogar mehrere DNS einträge einfach überschrieben werden, wenn eine Anwendung zb gethostbyname() drauf ansetzt. Ich ging jetzt davon aus, dass du als Technologieberater in dem Bereich Wert auf saubere Beseitigung von Störfaktoren wie Werbung legst. Sauberer als mit Plugins direkt am Client wirds nicht gehen, weil da der Browser schon gar keinen HTTP Verkehr mehr für die Werbedaten auf die Reise schicken muss, die modifiziert werden müssten. (Siehe Adblock Plus).
25.6.2008 um 19:46
Peter Piksa schreibt:
Nur um zu klären, ob ich Dich richtig verstehe, folgendes Szenario. 1. Server: ads.trade.com / 2. Server x.hacker.com / Maschine mit einem Hosteintrag “127.0.0.1 ads.trade.com. Jetzt wird die Maschine mit dem Hosteintrag auf x.hacker.com geleitet und führt dort ein Script aus welches lautet ads.trade.com:EinPort ? Wozu soll das führen, ausser dass der Client das als 127.0.0.1:einPort oder sonstwas interpretiert? Kannst du mal ein konkretes rekonstruierbares Beispiel posten mit dem man etwas “potenziel unerwünschtes” erzeugen kann?
25.6.2008 um 20:44
vitajixo schreibt:
Um mal dein Beispiel zu recyclen: Du hast ein rewrite von
ad.d.de -> 127.0.0.1
Jetzt hast du ein Javascript auf x.rs3128312.russischerserver.ru
Ab hier bekommt das Script von x.rs3128312.russischerserver.ru direkten Zugriff (vermenschlicht: “gib mir ad.d.de” -> der Browser schickt ans OS ein “lös mal ad.d.de auf” und bekommt “127.0.0.1″ zurück (wegen dem rewrite). Der Browser nimmt den Wert (127.0.0.1) und öffnet einen Socket, darüber findet die HTTP/Whatever Kommunikation statt(geht auch schlecht anders) Aber wer weiß in dem Fall, dass das kein externer Server ist? Hoffentlich nicht das Script… . Das gleiche gilt für Java Applets, Flash Embeds, und für die von dir erneut unterschlagenen _Anwendungen die einfach normal im Userspace laufen_.Die Dimension dieser Sicherheitslücke ist zu groß um sie in Worte zu fassen, außer vielleicht mit “höher geht’s kaum noch”. Das ist eins der konkreten Beispiele für Gefährdungen, die Unternehmen interessieren sollten (kenne ich mich nicht mit aus, du schon…). Wenn einer von dieser simplen Fehlkonfiguration weiß, kann er von außen Firewalls und Barikaden überwinden bis sich die Balken biegen. Und richtig schön selektiv, weils über das ungeschützte Loopbackdevice geht.
25.6.2008 um 21:35
Peter Piksa schreibt:
Was da beschrieben ist finde ich schon ein fragwürdig. Zum einen ist mir (bislang) noch völlig unklar wie da irgendwas geöffnet werden soll (Ein Beispiel, PHP-Code zum Bleistift oder Ähnliches wäre zur Veranschaulichung wirklich sehr interessant) zum anderen kann doch ohnehin jeder Betreiber eines “russenservers” ;) in seinen Code einfach die Adresse 127.0.0.1 aufnehmen. Alternativ kann man doch auch via Script den Hostnamen der externen IP-Adresse auslesen und wiederum in einem böswilligem Script verwenden. Mir ist daher unklar, wie Du von AdServerblocking auf Sicherheitslücke kommst und viel schlimmer noch die oben beschriebene Methode zum Blocken von Adservern gleichstellst mit dem Öffnen einer Sicherheitslücke?!
25.6.2008 um 22:22
vitajixo schreibt:
Bastel dir ein phpscript dass auf $irgendwas connecten soll, wo im negativ falle $irgendwas der localhost wäre, im Normalfall aber ein externer Server … Ich werd hier jetzt sicherlich kein script für die Seite hier zusammenschreiben. Ich weiß auch nicht was es da noch großartig zu erklären gibt. Man ändert einen DNS Eintrag, und leitet damit das Ziel des connects auf eine IP um, die nicht dem Ziel ursprünglich entspricht, und dann auch noch gleich auf den localhost. Aber da sind wir wieder bei normalen Programmen die du bis jetzt konsequent zu ignorieren scheinst. Der Grundgedanke ist der, dass ein Programm “nur” einen externen Host aufrufen muss, um in das Loopbackdevice zu gelangen, obowhl es da ganz und gar nicht reingehört. Das hat Konsequenzen ohne Ende. Viele Beschränkungen basieren auf IP/host black/whitelists. Sowohl innerhalb der Userspaceprogramme, als auch in Programmen, die sich in das socketinterface einkrallen, wie iptables … Wenn dann vermeindlich auf ad.d.de zugreift, tut es das nicht, sondern auf 127.0.0.1 -> verschleierung, und keiner merkts, nur im günstigsten Fall, wenns zu spät ist, oder jemand gezielt danach sucht. Kurz gesagt “der Mensch erwartet etwas anderes, als das Programm tut.” Ich komme auch nicht von “adservblocking auf eine sicherheitslücke”, klingt zwar schön legitimisierend, ist es aber nicht. Es ist die Tatsache, dass ein “Erwartung vs. Wirklichkeit” unnötig gestört wird, und das ist vor Allem für große Systeme nicht vertretbar und absolut vermeidbar. Schonmal was mit den UPNP Angriffen gehört, die nichts anderes machen, als das, was du da freiwillig machen willst? (DNS Überschreibungen)
-!- Du hast ein Problem mit den < und > Zeichen ;)
25.6.2008 um 22:59
Peter Piksa schreibt:
Hammer, hab ich einen Spass mit Dir :D Wenn Du so ein Problem mit dem Loopbackdevice hast, dann nimm doch in der Hostsfile meinetwegen anstelle der 127.0.0.1 einfach 0.0.0.0 und gut ist. Aber wie sich verhindern lässt, dass jemand in einem böswilligen Websitescript etwas auf die 127.0.0.1 loslässt, ist mir immernoch schleierhaft – bzw. hat es eigentlich überhaupt nichts mit meinem Ursprünglichem Beitrag zu tun. :D
26.6.2008 um 19:09