E-Mail-Links in HTML-Seiten verbergen

Schutz vor E-Mail-Spambots, zwei Methoden

… nicht nur akademisch  …

Kontakt:
(geändert: )

Die wichtigsten Ursachen für unerwünschte Reklame-E-Mails ‒ also „Spam“ ‒ hat die amerikanische Federal Trade Commission (FTC) schon 2002 experimentell untersucht. Dazu wurden 250 E-Mail-Adressen zum Test bei verschiedenen Internetdiensten bekannt gemacht, und nach sechs Wochen ergab sich folgendes Resultat (Kopie von hier); die Graphik gibt je nach Internetnutzung den Prozentsatz der mit Spam bedachten E-Mail-Adressen an, hier nochmals in tabellarischer Form:

Diese Tabelle ist zwar nicht mehr ganz aktuell, verdeutlicht aber, daß u. a. E-Mail-Adressen in Webseiten eine wesentliche Ursache für Spam sind.

Ende 2007 wird in dem Spam Summit Report 2007 der FTC (siehe Kapitel Ⅲ, Absatz A; Kopie von hier) die Ansicht vertreten, daß heutzutage der größte Teil des Spams (95%) über ferngesteuerte Schadprogramme, die unerkannt auf mit dem Internet verbundenen Rechnern laufen, verbreitet wird ‒ also von „Bots“ in einem „Botnet“. Wenn z. B. der Rechner eines E-Mail-Partners ein Bot in einem Botnet ist, kann das Schadprogramm auch das E-Mail-Adressbuch des Rechners lesen. Infolgedessen muß man dann mit Spam rechnen (der übrigens nicht notwendig vom Rechner des E-Mail-Partners ausgesandt wird)!

Ob diese Ansicht auch nur annähernd den Tatsachen entspricht, ist mir z. Z. nicht klar. Ich habe den Verdacht, daß diese Ansicht bisher nicht durch wirklich harte Fakten begründet wurde und es sich eher um Meinungen von Diskussionsteilnehmern handelt. Botnets sind dennoch ein ernstes Problem. Jeder PC-Besitzer kann nur durch kritische Haltung beim Manövrieren im Internet (nicht unbekannte Programme installieren, nicht unbekannte E-Mail-Anhänge anklicken bzw. öffnen, …) und durch den Einsatz eines Virenscanners die Gefahr, seinen Rechner zum Bot werden zu lassen, minimieren.

Die Ergebnisse eines weiteren Experiments wurden im März 2003 von dem amerikanischen Center for Democracy & Technology (CDT) durchgeführt und unter dem Titel Why Am I Getting All This Spam? veröffentlicht (Kopie von hier). Die wichtigsten sehr aufschlußreichen Ergebnisse sind:

Sogar nachträglich lohnt es sich offenbar, E-Mail-Adressen in HTML-Seiten vor Suchautomaten ‒ sog. „Spambots“ oder „harvester“ ‒ zu verbergen, egal, ob sie z. Z. Spam empfangen oder nicht!

Im Jahre 2004 stand meine E-Mail-Adresse irrtümlich einige Wochen auf einer Forum-Seite, was ich durch die plötzlich zunehmende Anzahl des täglichen Spams bemerkte. Nachdem ich den Forum-Betreiber auf dieses Problem hingewiesen und er alle E-Mail-Adressen unkenntlich gemacht hatte, hat sich langsam die Zahl der täglichen Spam-E-Mails auf z. Z. etwa eine verringert ‒ ohne Spamfilter! Ich habe mich seitdem bemüht, E-Mail-Links in Webseiten so einzubauen, daß dadurch möglichst wenig Spam verursacht wird.

☆   ☆   ☆

Nun soll beschrieben werden, wie man E-Mail-Adressen in Webseiten verlinkt (also anklickbar einbaut), aber dennoch das Erkennen bzw. Lesen durch Spambots möglichst verhindert. Zwei Aspekte sind zu beachten:

  1. Die allgemein als Klartext geschriebene E-Mail-Adresse. Das muß unbedingt vermeiden werden, denn es ist für Spambots sehr einfach, solche Adressen zu finden, genau dafür wurden sie programmiert! Als Voraussetzung zur Spam-Bekämpfung sind deshalb die folgenden Grundsätze zu beachten:

    1. Die E-Mail-Adresse darf sich nirgendwo im Internet als Klartext geschrieben befinden, weder in Dateien (*.htm, *.pdf, *.txt, *.js, *.css, …) noch in den vom Browser auf dem Bildschirm dargestellten Seiten!

    2. Fremde E-Mail-Adressen als Klartext in HTML-Seiten zu schreiben ist kein Kavaliersdelikt!
      („Was du nicht willst, daß man dir tu’, das füg’ auch keinem andern zu!“)

  2. Die speziell im E-Mail-Link geschriebene E-Mail-Adresse. Hier kommt es darauf an, einerseits die E-Mail-Adresse so einzubauen, daß der Link funktioniert, andererseits aber dafür zu sorgen, daß sie möglichst nicht vom Spambot gefunden wird. Dieser Punkt wird im folgenden ausführlicher behandelt, und zwei Methoden werden dazu beschrieben.

Zu Punkt 1.: Prüfen Sie, ob Ihre E-Mail-Adresse im Internet zu finden ist: geben Sie dazu Ihre vollständige E-Mail-Adresse als Suchstring in eine Suchmaschine ein (das können Sie ohne Bedenken tun, bekannte Suchmaschinen speichern Suchstrings jedenfalls nicht für Spambots). Solange ihre Adresse in Internetseiten im Klartext geschrieben steht, wird sich die Zahl der täglichen Spam-Mails nicht verringern. Deshalb müssen sie die Seitenbetreiber bitten, Ihre Adresse zu verbergen oder notfalls aus den Seiten zu entfernen. Gegebenenfalls empfehlen Sie eine der beiden unten beschriebenen Methoden. Als Notlösung kann (noch) die Primitivmethode zum Täuschen einfacher Spambots angewandt werden, nämlich das @-Zeichen in der E-Mail-Adresse z. B. durch den String "_at_" oder etwas Ähnlichem zu ersetzen ‒ dann ist allerdings die Adresse nicht mehr anklickbar.

Zu Punkt 2.: Zwei Methoden werden hierfür beschrieben. Die erste Methode verwendet eine JavaScript-Funktion, der man auch gleich einen Link-Text (der Text, auf den man klickt) mit übergeben kann, andernfalls schreibt die Funktion als Link-Text die E-Mail-Adresse ohne das @-Zeichen auf dem Bildschirm, da ja keine gültig E-Mail-Adresse auf der Seite stehen darf ‒ die Funktion ersetzt das @-Zeichen durch das ⓐ-Zeichen. Die zweite Methode funktioniert ohne JavaScript, bei ihr wird der String-Teil des Links in numerischer HTML-Notation geschrieben, aber auch für den Link-Text selbst wird (ebenfalls ohne @-Zeichen) die numerische HTML-Notation benutzt.

Mit diesen Methoden ist nicht mit absoluter Sicherheit ausgeschlossen, daß Spambots die in E-Mail-Links enthaltenen E-Mail-Adressen finden, aber der Aufwand ist doch recht groß. E-Mail-Spambots sind nämlich darauf angelegt, in möglichst kurzer Zeit viele E-Mail-Adressen in HTML-Seiten (oder anderen Dateien) zu finden, aufwendige Suchalgorithmen sind dann ungünstig. Wie in der Praxis bewiesen wurde, führten selbst die in numerischer HTML-Notation geschriebenen E-Mail-Links (zweite Methode) bisher nicht zu Spam.

Die erste Methode ‒ mit JavaScript ‒ ist die sicherere und bequem anzuwendende, auch wenn man von JavaScript keine Ahnung hat. Die zweite Methode sollte deshalb nur verwenden, wer vor JavaScript Angst hat.

Bezüglich der anderen E-Mail-kritischen Dienste, die in der Tabelle anfangs erwähnt werden, wie z. B. Newsgroups, kann ich nur empfehlen, dafür statt der dauerhaften Adresse eine „Wegwerfadresse“ zu verwenden, eine Adresse also, die nur für diesen Zweck eingerichtet und später ohne Nachteile gelöscht wird.


Methode 1: Verbergen mit JavaScript

In den folgenden drei Beispielen erzeugt die in JavaScript geschriebene Funktion obscure() den E-Mail-Link, der auf dem Bildschirn angezeigt wird, anschließend folgt jeweils der zugehörige JavaScript-Code, der (neben der Erklärung zur Script-Datei im Header der HTML-Seite) in die HTML-Datei eingefügt wurde:

1. Beispiel:

<script type="text/javascript">
  obscure("Nick.Knatterton","Privat.Detektei.de");
</script>
<noscript>[JavaScript nötig!]</noscript>

2. Beispiel:

<script type="text/javascript">
  obscure("Nick.Knatterton","Privat.Detektei.de","Post für den Tiger");
</script>
<noscript>[JavaScript nötig!]</noscript>

3. Beispiel:

<script type="text/javascript">
  obscure("Nick.Knatterton","Privat.Detektei.de","<img src=\"../Bilder/Envelope.gif\" title=\"\" alt=\"E-mail\" width=\"16\" height=\"11\" border=\"0\">");
</script>
<noscript>[JavaScript nötig!]</noscript>

Der eigentliche E-Mail-Adresse wird in Form von zwei Stringteilen ‒ aus denen ja jede E-Mail-Adresse besteht ‒ der Funktion obscure() übergeben, also der Name (vor dem @-Zeichen, String: "Nick.Knatterton") und die Domain (nach dem @-Zeichen, String: "Privat.Detektei.de"), der Aufruf der Funktion lautet also: obscure("Nick.Knatterton", "Privat.Detektei.de"). In dem 1. Beispiel erzeugt die Funktion obscure() nicht nur den HTML-Code für den E-Mail-Link, sondern schreibt automatisch als Text zum Anklicken auch die E-Mail-Adresse auf den Bildschirm, dabei wird allerdings das @-Zeichen durch das ⓐ-Zeichen ersetzt, um z. B. „Copy & Paste“-Methoden zu verhindern. Im 2. Beispiel ist zusätzlich zu den zwei ersten Strings als dritter String ein einfacher Text angegeben, der statt des sonst automatisch ausgegebenen Textes auf dem Bildschirm erscheint. Im 3. Beispiel besteht der dritte String aus einem Pfad zu einer Bild-Datei (ein Briefumschlag).

Übrigens wurde der für den E-Mail-Link wichtige String "mailto:" und das für die E-Mail-Adresse wichtige @-Zeichen in der Funktion obscure() jeweils in hexadezimaler JavaScript-Notation geschrieben, die Strings "mailto:" bzw. "@" würde man also vergeblich suchen. Man sieht dem Quellcode von obscure() nicht unmittelbar einen Zusammenhang mit E-Mail-Adressen an.

Zudem erzeugt die Funktion obscure() den String des E-Mail-Links aus einem stastistischen Gemisch dreier verschiedener HTML-Notationen für die Zeichendarstellung, nämlich aus direkter Notation, dezimaler Notation und hexadezimaler Notation. Ich überprüfe z. Z., ob dieser zusätzliche Aufwand wirklich sinnvoll ist.

Der String <noscript>[JavaScript nötig!]</noscript> ist nur für Browser mit ausgeschaltetem JavaScript wichtig, der Text [JavaScript nötig!] wird nämlich genau dann angezeigt. Wenn sie diesen String weglassen, dann erhält ein Seitenbesucher bei ausgeschaltetem JavaScript keinen Hinweis darauf.

Zur Benutzung: Die JavaScript-Funktion obscure() befindet sich für diese Seite in der JavaScript-Datei: RS1Lib.js (siehe dort unter "E-Mail-Functions"). Sie können entweder die Funktion obscure() per „Copy & Paste“ in Ihre eigene „JavaScriptDatei.js“ einfügen und dazu im Header-Teil Ihrer HTML-Seite die Erklärung zur Script-Datei (mit Pfadangabe) durch die Zeile:

<script src="[Pfad]JavaScriptDatei.js" type="text/javascript"></script>

definieren, oder Sie kopieren stattdessen (per „Copy & Paste“ vom Bildschirm) die ganze Funktion mit in den Header-Teil der HTML-Seite, das wären dann die foldenden Zeilen:

<script type="text/javascript">
function obscure( Name, Domain, Text)
//       #######
//
// The three parameters Name, Domain, and Text are of type string,
// the third parameter 'Text' is optional. Its content replaces
// the otherwise displayed e-mail-address. 
//
{ 
   function Rint(n)                   // Random integer r: 1 <= r <= n 
   { return Math.floor( n*Math.random() + 1 );  
   }      
   function s2h(str)                  // Replaces chars randomly by three 
   { var s = "", i, z1 = 0, z2, cod;  // different HTML character notations,
     for( i = 0; i < str.length; i++) // namely direct notation,    
     { cod = str.charCodeAt(i);       // decimal notation, and
       z2 = Rint(3);                  // hexadecimal notation.
       while( z2 == z1 ) { z2 = Rint(3); } // Avoids repetitions.
       z1 = z2;
       switch( z1 )
       { case 1: s += "&#"  + cod.toString(10) + ";"; break;
         case 2: s += "&#x" + cod.toString(16) + ";"; break;
         case 3: s += String.fromCharCode(cod); break;
       } 
     }
     return s;
   }
   Name = s2h(Name);
   Domain = s2h(Domain);
   if( arguments.length < 3 )
   { Text = Name + "&#x24D0;" + Domain;
   }
   document.write("<a href=\""
               + s2h(decodeURIComponent("%6D%61%69%6C%74%6F%3A"))
               + Name + decodeURIComponent("%40") + Domain + "\">"
               + Text + "</a>");
}
</script>

Vorteil: Einfaches Schreiben der E-Mail-Adresse. Weder in der HTML-Datei noch in der JavaScript-Datei ist die E-Mail-Adresse in einer für den HTML-Parser dekodierbaren Form vorhanden. Der Spambot müßte zusätzlich zum HTML-Parser auch noch eine „JavaScript engine“ enthalten, was relativ aufwendig wäre.

Nachteil: Funktioniert nur mit JavaScript.


Methode 2: Verbergen ohne JavaScript

Beispiel-E-Mail: Nick.KnattertonⓐPrivat.Detektei.de

Hier ist der E-Mail-Link als Zufallsmischung aus einfacher Zeichendarstellung sowie dezimaler und hexadezimaler HTML-Notation geschrieben. Wie zuvor wurde das @-Zeichen für die Bildschirmdarstellung durch das ⓐ-Zeichen ersetzt. Der HTML-Quellcode für dieses Beispiel ist:

<a href="&#x6D;&#97;i&#108;&#x74;o&#58;&#x4E;i&#x63;k&#46;&#75;&#x6E;a&#116;&#x74;e&#x72;&#116;o&#110;&#x40;P&#114;&#x69;v&#97;&#x74;.D&#101;te&#107;&#x74;e&#105;&#x2E;d&#101;">&#x4E;i&#x63;k&#46;&#75;&#x6E;a&#116;&#x74;e&#x72;&#116;o&#110;&#x24D0;P&#114;&#x69;v&#97;&#x74;.D&#101;te&#107;&#x74;e&#105;&#x2E;d&#101;</a>

Zur Benutzung: Sie können diesen E-mail-encoder benutzen, um Ihre E-Mail-Adresse in einfacher numerischer HTML-Notation zu kodieren (am besten gleich inklusive mailto:).

Vorteil: Funktioniert ohne JavaScript.

Nachteil: Umständliches Schreiben der E-Mail-Adresse (im Falle vieler E-Mail-Adressen eine Zumutung!). Ein HTML-Parser, wie er in jedem Browser vorhanden ist, könnte möglicherweise auch in einem aufwendiger programmierten Spambot enthalten sein und dann die Adresse entschlüsseln.