[PHP] Auch ohne Captcha-Code kein Spam

[PHP] Auch ohne Captcha-Code kein Spam

Es ist häufig so, dass wenn man ein Kontaktformular nutzt, dies auch oft genug von Bots für Spam-Nachichten genutzt wird. Die häufigste Lösung, die im Internet dann vorgeschlagen wird, ist der so genannte Captcha-Code. Man gibt ein paar Zeichen ein, die auf dem Bild zu sehen sind und die Seite überprüft, ob der eingegebene Code stimmt.

Von meiner Mutter und anderen älteren Menschen weiß ich, dass manche Leute immer wieder Probleme haben, den Code richtig zu lesen. Warum also nicht mal einen anderen Weg versuchen?
Ein anderer, aus meiner Sicht schönerer Weg, ist die Untersuchung der E-Mail-Adresse, ob diese stimmen kann und das will ich hier kurz darlegen, wie das geht.

Zuerst überprüfen wir, ob alleine von der Zeichenlänge und der gewählten Zeichen her, die E-Mailadresse gültig sein kann:
PHP:
//Erst die Länge der E-Maialdresse überprüfen:
if (strlen($mail) > 255) {
            $valid_address = false;
//Dann ob PHP es als eine gültige E-Mailadresse bestätigen würde
        } elseif (function_exists('filter_var') && defined('FILTER_VALIDATE_EMAIL')) {
            $valid_address = (bool) filter_var($mail, FILTER_VALIDATE_EMAIL);
//Und sonst ob die Zeichenabfolge stimmen kann. Also auch ob nur Buchstaben und Zahlen nach dem @ verwendet werden. 
        } else {
            if (substr_count($mail, '@') > 1) {
                $valid_address = false;
            }

            if (preg_match("/[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/i", $mail)) {
                $valid_address = true;
            } else {
                $valid_address = false;
            }
        }
In dem Skriptteil werden natürlich teilwiese auch doppelt abgefragt, aber ich geh da nach dem Motto: Doppelt hält besser!

Als zweites überprüfen wir nun ob die Domain überhaupt existiert. Dabei greifen wir auf die PHP-Funktion checkdnsrr zurück:
PHP:
if ($valid_address) {
            $domain = explode('@', $mail);

            if (!checkdnsrr($domain[1], "MX") && !checkdnsrr($domain[1], "A")) {
                $valid_address = false;
            }
        }

Natürlich ist auch dies keine Möglichkeit, um 100% Spam zu vermeiden, aber es hält 99% mindestens ab.
Autor
ByeBye 270552
Aufrufe
673
First release
Last update
Bewertung
2,00 Stern(e) 2 Bewertungen

Neueste Bewertungen

Da die meisten gmail oder ähnliches nutzen, ist deine "Methode" sinnfrei.

Da machen Honeypots, die sinnvoll erstellt werden, bedeutend mehr Sinn.

Die Möglichkeit zu überprüfen, ob eine Domain existiert, ist grundsätzlich für einige Benutzer sicherlich interessant.
Es ist nicht geklärt, in wie weit diese Prüfungen Spam verhindern sollen. Der Anwendungsfall ergibt sich nicht aus dem Kontext. Die Funktion filter_var gibt es seit PHP 5.2 also etwa 9 Jahre. Statt dieser Funktion noch andere Checks selbst zu implementieren ist meiner Meinung nach nicht sinnvoll. Insbesondere Reguläre Ausdrücke, die man auch nach 5 Min. Analyse noch nicht vollends durchdrungen hat, sollten gemieden werden.

checkdnsrr ist ein Notbehelf und sollte auch als dieser bewertet werden. Sich darauf zu verlassen, dass es für den Host-Anteil einer Mail-Adresse einen DNS-Eintrag gibt, bringt genau welche Sicherheit oder hält in wie fern von Spam ab?

Der Artikel sollte überarbeitet werden, mir fehlen hier Informationen, wie den Aufbau der Anwendung und den Sinn und Zweck der Checks.

Ansonsten gibt es diverse Spielarten von Captchas auch für Personen mit Handycap.