Spammer sind heutzutage ein großes Problem. Wenn Sie Ihre Kontaktinformationen teilen möchten, ohne von Spam-E-Mails überflutet zu werden, benötigen Sie eine Lösung. Dieses Problem hatte ich vor ein paar Monaten. Während ich recherchierte, wie ich es lösen könnte, fand ich verschiedene interessante Lösungen. Nur eine davon war perfekt für meine Bedürfnisse.
In diesem Artikel zeige ich Ihnen, wie Sie Ihre E-Mail-Adresse mit verschiedenen Lösungen ganz einfach vor Spam-Bots schützen können. Es liegt an Ihnen zu entscheiden, welche Technik Ihren Bedürfnissen entspricht.
Inhaltsverzeichnis
Der traditionelle Fall
Nehmen wir an, Sie haben eine Website. Sie möchten Ihre Kontaktdaten teilen und nicht nur Ihre sozialen Links. Die E-Mail-Adresse muss dabei sein. Einfach, oder? Sie tippen so etwas wie das hier
<a href="mailto:[email protected]">Send me an Email</a>
Und dann gestalten Sie es nach Ihrem Geschmack.
Nun, auch wenn diese Lösung funktioniert, hat sie ein Problem. Sie macht Ihre E-Mail-Adresse für buchstäblich jeden zugänglich, einschließlich Website-Crawlern und allen Arten von Spam-Bots. Das bedeutet, dass Ihr Posteingang mit einer Menge unerwünschten Mülls wie Werbeangeboten oder sogar Phishing-Kampagnen überflutet werden kann.
Wir suchen nach einem Kompromiss. Wir möchten es Bots schwer machen, unsere E-Mail-Adressen zu erhalten, aber für normale Benutzer so einfach wie möglich.
Die Lösung ist Verschleierung (Obfuscation).
Verschleierung (Obfuscation) ist die Praxis, etwas schwer verständlich zu machen. Diese Strategie wird aus mehreren Gründen mit Quellcode verwendet. Einer davon ist, den Zweck des Quellcodes zu verbergen, um Manipulation oder Reverse-Engineering zu erschweren. Wir werden uns zuerst verschiedene Lösungen ansehen, die alle auf der Idee der Verschleierung basieren.
Der HTML-Ansatz
Wir können uns Bots als Software vorstellen, die das Web durchsucht und Webseiten durchkriecht. Sobald ein Bot ein HTML-Dokument erhält, interpretiert er den Inhalt und extrahiert Informationen. Dieser Extraktionsprozess wird als Web Scraping bezeichnet. Wenn ein Bot nach einem Muster sucht, das dem E-Mail-Format entspricht, können wir versuchen, es zu tarnen, indem wir ein anderes Format verwenden. Zum Beispiel könnten wir HTML-Kommentare verwenden
<p>If you want to get in touch, please drop me an email at<!-- fhetydagzzzgjds --> email@<!-- sdfjsdhfkjypcs -->addr<!-- asjoxp -->ess.com</p>
Das sieht unordentlich aus, aber der Benutzer sieht die E-Mail-Adresse so
If you want to get in touch, please drop me an email at [email protected]
Pro
- Einfach einzurichten.
- Es funktioniert auch mit deaktiviertem JavaScript.
- Es kann von assistiven Technologien gelesen werden.
Contra
- Spam-Bots können bekannte Sequenzen wie Kommentare überspringen.
- Es funktioniert nicht mit einem `mailto:`-Link.
Der HTML- & CSS-Ansatz
Was wäre, wenn wir die Styling-Macht von CSS verwenden, um einige Inhalte zu entfernen, die nur dazu dienen, Spam-Bots zu täuschen? Nehmen wir an, wir haben den gleichen Inhalt wie zuvor, aber diesmal platzieren wir ein ``-Element darin
<p>If you want to get in touch, please drop me an email at <span class="blockspam" aria-hidden="true">PLEASE GO AWAY!</span> email@<!-- sdfjsdhfkjypcs -->address.com</p>.
Dann verwenden wir die folgende CSS-Regel
span.blockspam {
display: none;
}
Der Endbenutzer sieht nur dies
If you want to get in touch, please drop me an email at [email protected].
... was der Inhalt ist, der uns wirklich wichtig ist.
Pro
- Es funktioniert auch mit deaktiviertem JavaScript.
- Es ist schwieriger für Bots, die E-Mail-Adresse zu erhalten.
- Es kann von assistiven Technologien gelesen werden.
Nachteil
- Es funktioniert nicht mit einem `mailto:`-Link.
Der JavaScript-Ansatz
In diesem Beispiel verwenden wir JavaScript, um unsere E-Mail-Adresse unleserlich zu machen. Wenn die Seite dann geladen wird, macht JavaScript die E-Mail-Adresse wieder lesbar. So können unsere Benutzer die E-Mail-Adresse erhalten.
Die einfachste Lösung verwendet den Base64-Encoding-Algorithmus, um die E-Mail-Adresse zu dekodieren. Zuerst müssen wir die E-Mail-Adresse in Base64 kodieren. Wir können dafür Websites wie Base64Encode.org nutzen. Geben Sie Ihre E-Mail-Adresse so ein

Klicken Sie dann auf die Schaltfläche zum Kodieren. Mit diesen wenigen Zeilen JavaScript dekodieren wir die E-Mail-Adresse und setzen das `href`-Attribut im HTML-Link
var encEmail = "ZW1haWxAYWRkcmVzcy5jb20=";
const form = document.getElementById("contact");
form.setAttribute("href", "mailto:".concat(atob(encEmail)));
Dann müssen wir sicherstellen, dass der E-Mail-Link die `id="contact"` im Markup enthält, so:
<a id="contact" href="">Send me an Email</a>
Wir verwenden die Methode `atob`, um einen String mit Base64-kodierten Daten zu dekodieren. Eine Alternative ist die Verwendung eines einfachen Verschlüsselungsalgorithmus wie der Caesar-Verschlüsselung, die in JavaScript relativ einfach zu implementieren ist.
Pro
- Es ist für Bots schwieriger, die E-Mail-Adresse zu erhalten, besonders wenn Sie einen Verschlüsselungsalgorithmus verwenden.
- Es funktioniert mit einem `mailto:`-Link.
- Es kann von assistiven Technologien gelesen werden.
Nachteil
- JavaScript muss im Browser aktiviert sein, sonst ist der Link leer.
Der Embedded-Formular-Ansatz
Kontaktformulare sind überall. Sie haben sicher schon einmal eines davon benutzt. Wenn Sie eine Möglichkeit wünschen, dass Leute Sie direkt kontaktieren können, ist eine der möglichen Lösungen die Implementierung eines Kontaktformular-Dienstes auf Ihrer Website.
Formspree ist ein Beispiel für einen Dienst, der Ihnen alle Vorteile eines Kontaktformulars bietet, ohne sich um serverseitigen Code kümmern zu müssen. Wufoo auch. Tatsächlich gibt es hier eine Menge, die Sie in Betracht ziehen können, um die Übermittlung von Kontaktformularen für Sie zu bearbeiten.
Der erste Schritt zur Nutzung eines Formular-Dienstes ist die Anmeldung und Erstellung eines Kontos. Die Preise variieren natürlich, ebenso wie die angebotenen Funktionen zwischen den Diensten. Aber eines, was die meisten von ihnen tun, ist, Ihnen einen HTML-Snippet zur Verfügung zu stellen, um ein von Ihnen erstelltes Formular in jede Website oder App einzubetten. Hier ist ein Beispiel, das ich direkt aus einem Formular gezogen habe, das ich in meinem Formspring-Konto erstellt habe
<form action="https://formspree.io/f/[my-key]" method="POST">
<label> Your email:
<input type="email" name="email" />
</label>
<label> Your message:
<textarea name="message"></textarea>
</label>
<!-- honeypot spam filtering -->
<input type="text" name="_gotcha" style="display:none" />
<button type="submit">Send</button>
</form>
In der ersten Zeile sollten Sie `action` basierend auf Ihrem Endpunkt anpassen. Dieses Formular ist ziemlich einfach, aber Sie können so viele Felder hinzufügen, wie Sie möchten.
Beachten Sie das versteckte Eingabefeld in Zeile 9. Dieses Eingabefeld hilft Ihnen, die von normalen Benutzern und Bots gemachten Einreichungen zu filtern. Tatsächlich wird Formspree, wenn das Backend eine Einreichung mit dieser Eingabe sieht, diese verwerfen. Ein normaler Benutzer würde das nicht tun, also muss es ein Bot sein.
Pro
- Ihre E-Mail-Adresse ist sicher, da sie nicht öffentlich ist.
- Es funktioniert auch mit deaktiviertem JavaScript.
Nachteil
- Verlässt sich auf einen Drittanbieter-Dienst (was je nach Ihren Bedürfnissen ein Vorteil sein kann)
Es gibt noch einen weiteren Nachteil dieser Lösung, den ich jedoch aus der Liste weggelassen habe, da er ziemlich subjektiv ist und von Ihrem Anwendungsfall abhängt. Bei dieser Lösung teilen Sie Ihre E-Mail-Adresse nicht. Sie geben den Leuten eine Möglichkeit, Sie zu kontaktieren. Was ist, wenn Leute Sie per E-Mail erreichen *möchten*? Was ist, wenn Leute nach Ihrer E-Mail-Adresse suchen und kein Kontaktformular wollen? Ein Kontaktformular könnte in einer solchen Situation eine übertriebene Lösung sein.
Fazit
Wir sind am Ende angelangt! In diesem Tutorial haben wir verschiedene Lösungen für das Problem des Online-E-Mail-Sharings besprochen. Wir haben verschiedene Ideen durchlaufen, die HTML-Code, JavaScript und sogar einige Online-Dienste wie Formspree zum Erstellen von Kontaktformularen beinhalten. Am Ende dieses Tutorials sollten Sie sich der Vor- und Nachteile der gezeigten Strategien bewusst sein. Nun liegt es an Ihnen, die am besten geeignete für Ihren spezifischen Anwendungsfall auszuwählen.
Hallo, ich denke, das HTML/CSS-Beispiel hätte so aussehen sollen
Wenn Sie Kontakt aufnehmen möchten, senden Sie mir bitte eine E-Mail an email@<span>BITTE GEH WEG!</span>address.com.Die Art und Weise, wie es derzeit geschrieben ist – mit einem Kommentar – hat keine andere Auswirkung als der reine HTML-Ansatz.
Wenn Sie WordPress verwenden, gibt es dort eine sehr praktische antispambot Funktion
Wow, danke fürs Teilen!
Lustig, wie schlecht die WordPress-Dokumentation ist, dass sie sich nicht die Mühe gemacht haben, dieses von Ihnen gegebene Vorlagenbeispiel einzufügen. Sie haben nur den Shortcode für die Verwendung in einem Inhaltsblock bereitgestellt.
Jedenfalls las ich gerade, wie es funktioniert hier für weitere Details und sehe, dass es ziemlich alt ist und unterschätzt, was Harvesting-Bots tun können.
Ich vermute, vielleicht funktioniert die oben gezeigte JavaScript-Option besser (?), aber es sieht so aus, als müssten Sie für jede einzelne E-Mail-Adresse auf der Website neue Zeilen hinzufügen, das ist also mühsam.
Wie wäre es mit der nativen Formularaktion?
Und zur Verschleierung für Bots
Pro
Funktioniert mit nativen Formularelementen
Keine zusätzlichen JavaScript-Dateien
Contra
Kann die E-Mail-Adresse nicht per Rechtsklick kopieren
Es gibt immer noch JavaScript, aber es ist im HTML
Normales HTML funktioniert perfekt mit JS, da es in mailto-Links funktioniert. Ich benutze das seit Jahrzehnten und es ist eine erprobte Methode, die ich seit über 20 Jahren beibehalte.
Oder kombinieren Sie mehrere Lösungen. Verwenden Sie HTML + CSS, um HTML-Scanner zu blockieren
Und dann verwenden Sie JavaScript, um die Adresse in einen ``-Tag mit einem `mailto:`-Attribut zu verpacken.
Weiß jemand aus Erfahrung, wie effektiv jeder Ansatz ist?
Ich erinnere mich, dass ich vor langer Zeit ein Kommentarformular eingerichtet habe, etwas wie der Embedded-Formular-Ansatz, mit einem Honeypot-Eingabefeld, und trotzdem gab es Bots, die darauf programmiert waren, den Honeypot zu ignorieren und Spam über dieses Formular zu senden. Kürzlich habe ich ein Kommentarformular erstellt, bei dem das Formular selbst mit JavaScript gerendert wurde: Es erhielt trotzdem eine Spam-Nachricht – nun ja, eine einzige, vielleicht war es ein menschlicher Spammer, kein Bot.
Ein Drittanbieter-Dienst wie https://pageclip.co/ ist auch im Notfall gut, verbindet sich auch mit Slack
Es gibt auch Dienste wie mailhide.io, die ein Captcha vor die E-Mail-Adresse setzen
Ich kann bestätigen, dass ein verstecktes Honeypot-Eingabefeld in einem Kontaktformular Bots nicht zuverlässig filtert. Ich habe das vor 15 Jahren versucht und schon damals waren Bots zu clever dafür.
Leute, das ist CSS-Tricks, richtig? Warum nicht das
span.email::after {content:”@domain.com”}
Es ist nicht zugänglich für Screenreader
Wie wäre es dann mit der Verwendung von `aria-label`, um den letzten Teil @domain.com hinzuzufügen?
Der HTML- & CSS-Ansatz funktioniert in TUI-Browsern nicht.
Ich habe gehört, dass das Ändern des At-Symbols (@) zu `@` und des Punktes (.) zu `.` funktioniert, wie im folgenden Beispiel. Ich verwende diesen Ansatz und er scheint zu funktionieren.
Pssst – verraten Sie es nicht. Spambots könnten aktualisiert werden, um Entitäten zu erkennen! Bisher (der Einfachheit halber) scannen sie nur nach dem @-Zeichen.
Warum verwendet der Autor ein `input` verschachtelt in einem `label`? `label` hat ein `for`-Attribut
Bin ich der Einzige, der ein Bild mit meiner E-Mail-Adresse in JPG oder GIF verwendet?
Für `for` wird jedoch eine `id` benötigt, im Gegensatz zum Umwickeln eines `input` mit `label`, sodass Sie keine `id`s verwalten müssen und die gleichen Vorteile erhalten. Da `id`s eindeutig sein müssen (außerhalb von z. B. Webkomponenten oder Iframes), spart das Zeit und Mühe. Ich persönlich finde es besser, aber das ist subjektiv
Die beste Lösung ist, zwei E-Mails zu haben. Eine Geister-E-Mail, auf der Sie sich für den extrem seltenen Fall von jemandem mit deaktiviertem JavaScript verlassen können.
Und die echte, die nach dem Laden der Seite mit JavaScript über die Geister-E-Mail geschrieben wird (nur 3 Codezeilen).
Sehr, sehr einfach + effektiv.
Pro
Alles.
Contra
2 E-Mail-Adressen.
ich benutze
.e-mail:before {
content: attr(data-website) “\0040” attr(data-user);
unicode-bidi: bidi-override;
direction: rtl;
}
Das gefällt mir sehr gut. Gute Arbeit.
Wie kann ich das klickbar machen, um den Standard-Mail-Client zu starten, idealerweise ohne JavaScript?
<a class=e-mail data-user="resu" data-website="moc.niamod" href="mailto://"></a>Okay, ich habe das gemacht
<script defer>document.querySelectorAll('.e-mail').forEach(e => {
e.addEventListener("click", event => {
// href=# verhindern
event.preventDefault();
// die (umgekehrte) E-Mail-Adresse des aufrufenden Ankers abrufen
z=event.currentTarget;
y=getComputedStyle(z,'::after');
x=y.getPropertyValue('content');
// String RTL umkehren
v=x.split("").reverse().join("");
// alle "" entfernen
v=v.replace(/['"]+/g, '');
// Standard-E-Mail-Client starten (auch auf Mobilgeräten testen!)
window.location.href="mailto://"+v;
})
});
</script>
Vielen Dank für diesen hilfreichen Artikel. Könnte es dasselbe für Telefonnummern und SMS geben? Danke.
Überrascht, dass Sie im ersten Punkt keine maskierten Zeichen erwähnt haben (die, die mit `&` beginnen). Diese funktionieren auch im mailto-Link (Sie können sogar das Protokoll selbst auf diese Weise verschleiern). Theoretisch täuscht dies keine Bots, die das DOM richtig verarbeiten, aber ich frage mich, wie stark es den Müll reduziert (besonders da es das `@`-Zeichen verbirgt).
Realistischerweise ist der Formularansatz wahrscheinlich der beste. Stellen Sie sicher, dass Sie eine Bestätigungs-E-Mail zurücksenden. Wenn es nicht funktioniert, können Sie davon ausgehen, dass es Müll ist, ohne es überhaupt auf Spam prüfen zu müssen (während legitime Benutzer einfach denken, dass es sie darüber informiert, dass Sie ihre Nachricht erhalten haben).
Benötigen Sie jedoch einen Drittanbieter-Dienst für Formulare? Obwohl es stimmt, dass es schwierig ist, es richtig zu machen (hier könnte ein Plugin hilfreich sein), bin ich mir ziemlich sicher, dass es auf dem Server der Website selbst machbar sein sollte, insbesondere wenn die E-Mail-Adresse eine lokale ist.
Ich schätze, der Vorteil eines Drittanbieter-Dienstes ist, dass Sie während der Konversation keine Ihrer echten Adressen preisgeben (der Benutzer sieht die des Drittanbieters), aber ich verstehe, dass der Benutzer die Adresse eines Drittanbieters aus seiner Sicht als zwielichtig empfinden kann, und in der Praxis brauchen Sie nur eine Möglichkeit, um zu wissen, welche E-Mails Sie verwerfen müssen, auch wenn sie Sie erreichen.
Ich verwende eine JS-Methode, bei der ich Code in den Header packe, um die E-Mail und die Domain und .com zu kombinieren, aber Bots sehen nur JS-Code. Total verwirrend für Bots, aber auswählbar und funktioniert gut
Egal, was Sie verwenden: Alles, was eine lesbare E-Mail-Adresse für den Besucher rendert, rendert sie auch für Scraper, die die gerenderte Ausgabe anstelle des Quellcodes verwenden, oder (noch schwieriger zu schlagen) OCR verwenden.
Bill Bontrager hat hier einen kostenlosen spambefreiten Formularersteller: https://spamfreeform.com/
Das ist ein großartiger Artikel – danke Lorenzo! Bedenken wie die Notwendigkeit, E-Mail-Adressen zu schützen, verschwinden nie ganz, und es ist hilfreich, gelegentlich zu überprüfen, welche Technologien und Techniken wir in unserem Werkzeugkasten haben.
Beim Lesen des Artikels sah ich, dass keine Erwähnung von SVG erfolgte. Mir fiel auf, dass ein SVG-basierter Ansatz eine Erkundung wert war – er würde die Notwendigkeit von JavaScript erfolgreich beseitigen und gleichzeitig normale `mailto:`-Links ermöglichen.
Kurz gesagt, es ist möglich, ein SVG zu schreiben, das Folgendes enthält
und dann dieses SVG über HTML einbetten durch
Ich habe hier eine vollständige Ausarbeitung
https://github.com/RouninMedia/protecting-your-email-address-via-svg-instead-of-js/blob/main/README.md
Ich habe zu diesem Zweck eine Webkomponente geschrieben, und der angenehme Vorteil ist, dass die angezeigte E-Mail-Adresse im Shadow DOM (geschlossen) liegt, sodass sie nicht ohne Weiteres von E-Mail-Harvesting-Tools, die einen Browser ausführen, inspiziert werden kann (was viele der hier gezeigten Tricks umgeht); und der Klick-Handler ist in JavaScript, z. B.
Der Shadow DOM-Code
Vielen Dank für den Artikel! Der Artikel und die Kommentare enthalten viele gute Ideen.
Gute Idee!
Wissen Sie, ob es tatsächlich gegen Bots wirkt?
Danke für den Artikel Lorenzo
Ich habe es auch mit etwas JavaScript und etwas UTF-8-Kodierung zur Anzeige gelöst
email @ address . com
Da es den String im Kommentar dekodiert, verwende ich zur Anzeige den UTF-8-Code 64 für das @ und den Code 46 für den Punkt und füge Leerzeichen dazwischen ein, sodass die E-Mail wie oben aussieht, aber ein Regex-Parser sie nicht erkennen würde.
Früher hatte ich die E-Mail-Adresse mit rot13 kodiert und 1 Zeile JavaScript, um sie beim Mouseover/Klick zu dekodieren. Sehr einfach und effektiv. Kann es jetzt nicht mehr finden, aber eine einfache Google-Suche wird es tun.
Zeigen Sie eine Adresse an, die korrekt formatiert, aber falsch geschrieben ist, damit der Scraper eine „gute“ Adresse erhält und nicht weiter sucht. Rufen Sie dann bei `onclick` ein kurzes Skript auf, um den Rechtschreibfehler zu korrigieren.
Das funktioniert für meine Seite gut.
Für die JavaScript-Version scheint es hilfreich zu sein, eine Schaltfläche/einen Link zum „E-Mail-Adresse kopieren“ anzubieten, für Leute (wie mich), die nie einen Standard-Mail-Client eingerichtet haben. Das wäre eine einfache Ergänzung mit `navigator.clipboard.writeText()`
Die Menge an Spam-E-Mails wird einfach zu viel! Sie schaffen es sogar, die Gmail-Spamfilter zu umgehen und landen im Posteingang!
Ich habe einfach das Gefühl, dass Spammer immer einen Weg finden werden, zu spammen, egal wie vorsichtig Sie sind.
Ich bin hierher gekommen und habe versucht zu sehen, ob es eine moderne Lösung gibt, aber ich bin überrascht, dass es immer noch dasselbe ist wie vor 20 Jahren (ich werde alt).
Es besteht kein Zweifel daran, dass Bots JavaScript und HTML-kodierte Zeichen jetzt parsen können ... vielleicht nicht alle, aber wahrscheinlich viel mehr, besonders da die Bedeutung von JavaScript-Crawlern und clientseitigem Code fast vollständig von Googles eigenen Bots analysiert wird.
Was wäre also die beste Lösung? Würde ein initialer AJAX-Aufruf, der nur ausgelöst wird, wenn eine Benutzerinteraktion erkannt wird (Tastaturereignis, Klickereignis, Scrollereignis, Fokusereignis, `visibilitychange`-Ereignis) mit CRSF-Code / Nonce zur Validierung der Anfrage, die vom vorgesehenen Website stammt, übertrieben sein?
Hier ist eine riesige Liste von Verschleierungstechniken mit Statistiken, die zeigen, wie oft sie in der Praxis gebrochen werden
https://spencermortensen.com/articles/email-obfuscation/
Der beste Ansatz wäre, niemals eine vollständige und gültige E-Mail-Adresse in irgendeiner Form zu speichern – nicht in HTML, CSS oder JavaScript. Sie würden wahrscheinlich die Cloudflare-Technik hinzufügen wollen. (Im Artikel wird sie als „Xor“-Technik bezeichnet. Aber es ist die, die von Cloudflare verwendet wird.)
Der beste Ansatz würde *auch* eine CSS-Technik beinhalten (wie die „`display:none`“-Technik), um nicht allein auf JS oder CSS angewiesen zu sein.
Und der beste Ansatz würde nur für einen Moment bei Benutzerinteraktion eine funktionierende E-Mail-Adresse erstellen, um selbst die Spam-Bots zu besiegen, die eine vollständige Webumgebung ausführen, aber weder Tastatur noch Maus verwenden.
kein JavaScript –
vielleicht irre ich mich – aber normalerweise benutze ich das
in HTML
<a href="#" class="cryptedmail" data-davor="stuttgart43" data-wohin="juweliere-kraemer" data-ende="de" ></a>in CSS
.cryptedmail:after {Inhalt: attr(data-davor) "@" attr(data-wohin) "." attr(data-ende);
}
Flashback vor 15 (!) Jahren: Graceful E-Mail Obfuscation (A List Apart). Von mir :)