Bannerzwang
Geschrieben von: Christoph Wille Viele User die im Netz surfen verwenden sogenannte Banner-Blocker, mit denen Werbebanner abgeblockt werden - ein bekanntes Tool aus dieser Kategorie wäre der WebWasher. Allerdings gibt es am Internet viele Websites, die ihre Inhalte zu einem guten Teil über Bannerwerbung auf ihren Seiten finanzieren. Für diese Websites sind Tools wie der WebWasher wahrlich eine "Killerapplikation", da diese die Einnahmequelle effektiv herausfiltern. Da ein Kollege von mir den WebWasher einsetzt, habe ich mich einmal eingehender mit ihm über die technischen Möglichkeiten unterhalten, die man als Websitebetreiber hätte, den WebWasher auszutricksen:
Der letzte Punkt klingt geradezu blauäugig, aber nach längerer Überlegung hat uns die Variante eigentlich am besten gefallen. Die GrundideeDie Idee dahinter ist bestechend einfach: jeder moderne Browser unterstützt CSS und DIV Tags. Mittels CSS kann man DIV Tags unsichtbar machen - es ist also naheliegend, den Inhalt der Seite solange in einem unsichtbaren DIV Tag zu verstecken, bis die Banner geladen sind. Kommt kein Banner, wird das DIV Tag nicht auf sichtbar gesetzt - Pech für den Werbeverweigerer. Das Umschalten von unsichtbar auf sichtbar passiert mittels eines Events auf dem Werbebanner-Image Tag. Das bedeutet, JavaScript muß enabled sein - und man hat somit gleich den automatischen Browsertest mit dabei. In der Datei bannerpage.htm habe ich eine einfache Seite mit dieser Idee implementiert: <html> <head> <title>Bannerpage</title> </head> <body> <div id="pleaseWait"> Bitte warten Sie, während die Seite geladen wird. Sollten Sie Probleme haben, <a href="">klicken Sie bitte hier</a>. </div> <div id="mainDiv" STYLE="display:None;"> <p>Dieser Content wird erst nach dem Banner sichtbar - inklusive dem Banner.</p> <img src="http://ads.softartisans.com/servead.asp?s=11&b=1" onload="yesImage()"> </div> <SCRIPT LANGUAGE=JavaScript> <!-- function yesImage() { document.all.pleaseWait.style.display = "none"; document.all.mainDiv.style.display = ""; } //--> </SCRIPT> </body> </html> Es gibt zwei DIV Tags - pleaseWait mit der Meldung daß die Seite geladen wird, und mainDiv, das versteckt ist, und den zu schützenden Inhalt der Seite umschließt. Am Image Tag ist das onload Ereignis mit der Funktion yesImage gehooked - wird das Event ausgelöst, ist die Grafik fertig geladen, und die Sichtbarkeit der beiden DIV Tags wird vertauscht. Damit hat man den Inhalt effektiv geschützt - killt der Banner-Blocker das Bild, wird das Event nie ausgelöst. Dadurch, daß CSS automatisch ausgeführt wird, hat der User auch keine Chance, den Inhalt sichtbar zu machen (außer er speichert die Seite auf die Festplatte und modifiziert das HTML). Der Sinn der "Bitte warten" Nachricht mit Link ist der, daß Kunden die die Seite wegen Blocking nicht zu Gesicht bekommen, auf eine Seite gehen können, wo Ihnen höflich erklärt wird, warum sie nichts zu sehen bekommen haben. Bei Sites mit sparsamer Bannerwerbung (wie AspHeute) werden wahrscheinlich auch nicht allzu viele Besucher Einwand erheben. Implementierung mit ASPDie vorgestelle HTML Seite hat ihre gewissen Nachteile - die DIV Tags haben fest vorgegebene Namen, und wären somit relativ leicht automatisiert herauslöschbar. Daher werden wir bei der Implementierung in ASP etwas "Rücksicht" auf solche Probleme nehmen - und diesen Schutz neben DIV Tags auch auf die Variablen und Funktionsnamen in JavaScript ausdehnen. Die gewünschte Funktionalität habe ich in bannerfunctions.asp implementiert, die in jede beliebige zu schützende Datei eingebaut werden kann. Das IncludeEine wichtige Vorgabe für uns ist, daß die Namen der DIV Tags nicht fest vorgegeben sein dürfen. Daher bietet sich an, die Funktionen zur Generierung eines sicheren Passworts etwas anzupassen: <script language="vbscript" runat="server"> Function GenerateRandom(ByVal Laenge) Dim intI, strRandom strRandom = "" For intI = 1 to Laenge strRandom = strRandom & GenerateCharacter() Next GenerateRandom = strRandom End Function Function GenerateCharacter() Dim intRnd, strRnd Randomize Do intRnd = Int(Rnd * 60) If intRnd >=52 Then strRnd = CStr(intRnd - 51) ElseIf intRnd >= 26 Then strRnd = Chr(Asc("A") + intRnd - 26) Else strRnd = Chr(Asc("a") + intRnd) End If Loop Until (strRnd <> "0" And strRnd <> "l" _ And strRnd <> "I") GenerateCharacter = strRnd End Function </script> Durch den Aufruf der Funktion GenerateRandom erhalten wir eine zufällige Zeichenfolge, die wir als Namen für DIV Tags, Variablen und auch Funktionen verwenden können. Den ersten Auftritt hat GenerateRandom in den Funktionen ShowWaitMessage und PreCreateSections. <% Dim m_nSections, m_arrSections(), m_strFunctionName, m_nNumberOfImages Dim m_strWaitSection m_nSections = -1 m_nNumberOfImages = 0 Function ShowWaitMessage() Dim strMessage m_strWaitSection = "div" & GenerateRandom(12) strMessage = "<div id=""" & m_strWaitSection & """>" & vbCrlf strMessage = strMessage & "Bitte warten Sie, während die Seite geladen wird. " strMessage = strMessage & "Sollten Sie Probleme haben, " & _ "<a href=""xplain.htm"">klicken Sie bitte hier</a>." strMessage = strMessage & vbCrlf & "</div>" & vbCrlf ShowWaitMessage = strMessage End Function Sub PreCreateSections(ByVal nSections) Dim i m_nSections = nSections ReDim m_arrSections(nSections) For i = 0 To (nSections-1) m_arrSections(i) = "div" & GenerateRandom(10) Next m_strFunctionName = "set" & GenerateRandom(15) End Sub In ShowWaitMessage wird GenerateRandom verwendet um den Namen des DIV Tags zu generieren, das die "Bitte warten" Mitteilung umschließt. Die Funktion PreCreateSections erfüllt einen sehr speziellen Zweck - nach deren Aufruf sind alle zu versteckenden DIV Tag Sektionen namentlich bekannt, und man kann an beliebiger Stelle mittels GetDisplayFunction das JavaScript rendern lassen (dazu müßte allerdings GetImageFunction angepasst werden). Function BeginSection(ByVal nSection) If (nSection < 0 Or nSection > m_nSections) Then Response.Write "ERROR: BeginSection - section requested does not exist: " & nSection Response.End End If BeginSection = vbCrlf & "<div id=""" & m_arrSections(nSection-1) & _ """ STYLE=""display:None;"">" & vbCrlf End Function Function EndSection() EndSection = vbCrlf & "</div>" & vbCrlf End Function Function GetImageFunction() GetImageFunction = " onload=""" & m_strFunctionName & "()"" " m_nNumberOfImages = m_nNumberOfImages + 1 End Function Function GetDisplayFunction() Dim strScript, strVariable, i strVariable = "var" & GenerateRandom(10) strScript = "<SCRIP" & "T LANGUAGE=JavaScript>" & vbCrlf strScript = strScript & "<!--" & vbCrlf strScript = strScript & "var " & strVariable & "=" & m_nNumberOfImages & ";" & vbCrlf strScript = strScript & "function " & m_strFunctionName & "() {" & vbCrlf strScript = strScript & strVariable & "--;" & vbCrlf strScript = strScript & "if (0 == " & strVariable & ") {" & vbCrlf strScript = strScript & "document.all." & m_strWaitSection & _ ".style.display = ""none"";" & vbCrlf For i = 0 To (m_nSections-1) strScript = strScript & "document.all." & m_arrSections(i) & _ ".style.display = """";" & vbCrlf Next strScript = strScript & "}" & vbCrlf & "}" & vbCrlf & "//-->" & vbCrlf & _ "</SCR" & "IPT>" & vbCrlf GetDisplayFunction = strScript End Function %> Mit der Funktion BeginSection wird der Anfang einer Content-Sektion markiert, mit EndSection abgeschlossen. Warum überhaupt mehrere Content-Sektionen verstecken? Nun, wir wollen es den Blockern nicht unbedingt erleichtern, unseren Code herauszunehmen, oder? Wichtig ist GetImageFunction, die in jedem zu schützenden Image Tag aufgerufen werden muß (Beispiel folgt sofort). Damit weiß das Script, wie die JavaScript Funktion in GetDisplayFunction angepasst werden muß. Ein ZwangsbannerseiteGenug der Vorabeiten - wie sieht nun der Code aus, den man in eine zu schützende Seite einbauen muß? Ein Beispiel wäre die Datei bannerpage.asp: <% Option Explicit %> <html> <head> <title>Bannerpage</title> </head> <body> <!--#include file="bannerfunctions.asp"--> <%=ShowWaitMessage()%> <%PreCreateSections(2)%> <%=BeginSection(1)%> <p>Dieser Content wird erst nach dem Banner sichtbar - inklusive dem Banner.</p> <img src="http://ads.softartisans.com/servead.asp?s=11&b=1" <%=GetImageFunction()%>> <%=EndSection()%> <%=BeginSection(2)%> <p>Weiterer Text, nur als Demo gedacht.</p> <%=EndSection()%> <%=GetDisplayFunction%> </body> </html> Zuerst wird ShowWaitMessage aufgerufen, danach mit PreCreateSections die Sektionen (zwei an der Zahl hier) erzeugt. Und nun kann man mit BeginSection und EndSection den Content schützen. In jedem Bannerimage wird GetImageFunction aufgerufen, und mittels GetDisplayFunction wird das JavaScript dann am Ende generiert. Das HTML sieht dann so aus: <html> <head> <title>Bannerpage</title> </head> <body> <div id="divQLyVKAQ3JtdV"> Bitte warten Sie, während die Seite geladen wird. ... </div> <div id="divoFkEnsWByT" STYLE="display:None;"> <p>Dieser Content wird erst nach dem Banner sichtbar - inklusive dem Banner.</p> <img src="url removed" alt="" onload="setqBv4nJ7uobMWXV2()" > </div> <div id="divQi3jesvMdf" STYLE="display:None;"> <p>Weiterer Text, nur als Demo gedacht.</p> </div> <SCRIPT LANGUAGE=JavaScript> <!-- var varKBKozSWZPk=1; function setqBv4nJ7uobMWXV2() { varKBKozSWZPk--; if (0 == varKBKozSWZPk) { document.all.divQLyVKAQ3JtdV.style.display = "none"; document.all.divoFkEnsWByT.style.display = ""; document.all.divQi3jesvMdf.style.display = ""; } } //--> </SCRIPT> </body> </html> Mit jedem Aufruf der Seite ändern sich die ID's der DIV Tags, der Name der Funktion und die Variable, die die Anzahl der Bilder speichert. Gemischt mit mehreren Content-Sektionen, eine äußerst schwer zu knackende Nuß für Banner-Blocker. SchlußbemerkungPerfekt ist das vorgestellte Skript natürlich nicht - die Längen der Namen von DIV Tags, Variablen und Funktion sollten sich auch zufällig ändern. Ein Problem kann dieses Script auch in bester Abwandlung nicht verhindern: wenn der Banner-Blocker ein Platzhalterbild statt dem originalen Werbebanner schickt. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Generieren eines sicheren Paßwortes Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |