Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
ASP German Homepage Homepage
 

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Bannerzwang

Geschrieben von: Christoph Wille
Kategorie: ASP Tricks

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:

  • Nicht-Standardgrößen der Werbebanner. Das verbietet sich von selbst.
  • Da sowohl auf URL als auch Bildgröße gefiltert wird, alle Grafiken der Site nur in Werbebannergrößen erzeugen. Wenn der User dann die Banner blockieren will, erlebt er ein "weißes Wunder".
  • Die Werbebanner zerstückeln, und in Nicht-Standardgrößen verschicken. Solange man keine animierten Banner verwendet, würde das sogar funktionieren.
  • Die Seite nicht anzeigen, wenn die Banner nicht geladen werden.

Der letzte Punkt klingt geradezu blauäugig, aber nach längerer Überlegung hat uns die Variante eigentlich am besten gefallen.

Die Grundidee

Die 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 ASP

Die 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 Include

Eine 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&auml;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 Zwangsbannerseite

Genug 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&auml;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ßbemerkung

Perfekt 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 Codes

Klicken 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.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.