2009-12-29 12 views
12

Szenario:
Ich habe ein Kontaktformular auf meiner Web-App, es wird viel Spam.
Ich überprüfe das Format von E-Mail-Adressen lose, d. H. ^[email protected]+\..+$
Ich benutze einen Spam-Filter-Dienst (Defensio), aber die Spam-Scores überschneiden sich mit gültigen Nachrichten. Bei einem Schwellenwert von 0,4 kommt Spam durch und einige Kundenfragen werden falsch in ein Protokoll geworfen und ein Fehler angezeigt.Verwenden von MX-Datensätzen zum Validieren von E-Mail-Adressen

Alle Spam-Nachrichten verwenden gefälschte E-Mail-Adressen, z. [email protected]

Dedicated PHP5 Linux-Server in den USA, mysql, nur Spam-Spam, E-Mail die nicht-Spam-Nachrichten (nicht gespeichert).

Vorschlag: Verwendung von PHP checkdnsrr(preg_replace(/^[email protected]/, '', $_POST['email']), 'MX') ist die E-Mail-Domäne auf eine gültige Adresse aufgelöst zu überprüfen, eine Datei protokollieren, dann mit einem Fehler umleiten für Nachrichten, die geht in den Spam-Filter-Service nach wie vor für Adressen nicht auflösen die sich nach checkdnsrr() auflösen.

Ich habe gelesen (und ich bin skeptisch über diese selbst), dass Sie diese Art der Validierung nie auf Remote-Lookups verlassen sollten, aber warum?

Abgesehen von Konnektivitätsproblemen, wo ich größere Probleme als ein Kontaktformular sowieso haben werde, wird Checkdnsrr auf falsche Positive/Negative stoßen?
Würden einige Adreßtypen nicht aufgelöst werden? Regierungsadressen? IP-E-Mail-Adressen?
Muss ich den Hostnamen umgehen, den ich an checkdnsrr() übergebe?

Lösung: Eine Kombination aller drei Antworten (wünschte, ich könnte mehr als eine als eine zusammengesetzte Antwort akzeptieren).

Ich verwende:

$email_domain = preg_replace('/^[email protected]/', '', $email).'.'; 
if(!checkdnsrr($email_domain, 'MX') && !checkdnsrr($email_domain, 'A')){ 
    //validation error 
} 

Alle Spam protokolliert wird und gedreht wird. Mit dem Ziel, zu einem späteren Zeitpunkt auf eine Jobwarteschlange zu aktualisieren.

Einige Kommentare wurden über die Frage der Mail-Server für den Benutzer zu überprüfen, ich dachte, dies wäre zu viel Verkehr und könnte meinen Server gebannt oder in Schwierigkeiten geraten, und dies ist nur um die meisten der E-Mails, die aufgrund ungültiger Serveradressen zurückgeschickt wurden.

http://en.wikipedia.org/wiki/Fqdn und

RFC2821 
The lookup first attempts to locate an MX record associated with the name. 
If a CNAME record is found instead, the resulting name is processed as if 
it were the initial name. 
If no MX records are found, but an A RR is found, the A RR is treated as 
if it was associated with an implicit MX RR, with a preference of 0, 
pointing to that host. If one or more MX RRs are found for a given 
name, SMTP systems MUST NOT utilize any A RRs associated with that 
name unless they are located using the MX RRs; the "implicit MX" rule 
above applies only if there are no MX records present. If MX records 
are present, but none of them are usable, this situation MUST be 
reported as an error. 

Vielen Dank an alle (vor allem ZoogieZork für die Ein Tipp Rekordrückfall)

+0

+1 .. Ich habe noch nie überprüft für eine gültige E-Mail gehört durch die MX-Datensätze überprüft .. das ist eine gute Idee, wie ich finde. – Earlz

+3

Denken Sie daran, den A-Eintrag zu überprüfen, wenn kein MX-Eintrag aufgeführt ist, wie in RFC 5321 definiert. Es ist selten, aber einige Domänen haben keinen MX-Eintrag (aus verschiedenen Gründen). Mehr Infos: http://en.wikipedia.org/wiki/MX_record#History_of_fallback_to_A – ZoogieZork

+0

Prost Zork, genau die Art von Gotchas, um die ich mir Sorgen machte. –

Antwort

4

Ich sehe keinen Schaden ein MX-Lookup mit checkdnsrr() tun, und ich sehe nicht, wie auch Falsche Positive können auftreten. Sie müssen dem Hostnamen nicht entkommen, Sie können diese Technik tatsächlich verwenden und ein wenig weiter gehen, indem Sie mit dem MTA sprechen und testen, ob der Benutzer auf einem bestimmten Host existiert (diese Technik kann und wird Ihnen wahrscheinlich einige falsche Informationen liefern) Positives in einigen Hosts).

+6

Die meisten SMTP-Hosts, die Sie finden können, reagieren nicht gut auf VRFY-Befehle (sowohl immer OK als auch immer ERROR sind Antworten, die Sie erwarten können). Es wird dringend davon abgeraten, VRFY zur Validierung von Adressen zu verwenden. – Guss

5

DNS-Lookups können manchmal langsam sein, je nach Netzwerkverkehr & Staus, so dass etwas zu beachten ist.

Wenn ich in Ihren Schuhen wäre, würde ich es ausprobieren und sehen, wie es geht. Melden Sie für eine Woche alle E-Mails in einer Datenbank oder Protokolldatei und fügen Sie ein Feld hinzu, um anzugeben, ob es als Spam oder legitime E-Mail markiert wäre. Nachdem die Woche vorbei ist, werfen Sie einen Blick auf die Ergebnisse und sehen Sie, ob es so funktioniert, wie Sie es erwarten würden.

Mit diesem Protokollierungs-/Testansatz haben Sie die Flexibilität, es auszuprobieren und sich keine Gedanken über den Verlust von Kunden-E-Mails zu machen.

Ich habe es mir angewöhnt, meinen Formularen ein zusätzliches Feld hinzuzufügen, das mit CSS ausgeblendet ist. Wenn es ausgefüllt ist, nehme ich an, es wird von einem Spam-Bot eingereicht. Ich achte auch darauf, einen Namen wie "url" oder "website_url" zu verwenden, der für einen Spam-Bot wie ein legitimer Feldname aussieht. Fügen Sie eine Beschriftung für das Feld hinzu, das etwa so lautet: "Füllen Sie dieses Feld nicht aus". Wenn der Browser eines Nutzers es nicht korrekt darstellt, weiß es, dass das Feld "Spam" nicht ausgefüllt werden muss. Bis jetzt funktioniert es sehr gut für mich.

+1

Re: verstecktes Feld - Gute Idee! Wie für die Protokollierung - stellen Sie sicher, dass Sie auch die Zeit aufzeichnen, die Sie zur Auflösung des DNS-Eintrags benötigt haben. Sie können feststellen, dass es zu lange dauert und zu einer schlechten Benutzererfahrung führt. – Guss

+0

Ich teste das versteckte Feld jetzt aus, scheint in Ordnung zu sein, obwohl einige ... Benutzer eingeben "Nicht sicher, was in dieses Feld zu setzen" –

+0

Wenn Benutzer etwas in das Feld eingeben, wird es nicht richtig ausgeblendet. Es könnte einen Fehler in deinem CSS geben, der das Feld nicht richtig versteckt. ich in der Regel so etwas tun: ich nicht auf die Formen gesehen habe kommt jeden möglichen Spam, wo ich habe dies schon lange umgesetzt. – bradym

0

Ein MX-Lookup ist nur ein Teil des Bildes. Wenn Sie sicherstellen möchten, dass die E-Mail-Adresse selbst gültig ist, müssen Sie versuchen, eine E-Mail an dieses Konto zu senden.

Das andere mögliche Szenario ist, jemand kann einfach entführt E-Mail-Konten von einer kompromittierten Maschine sowieso einfach. Natürlich ist das wahrscheinlich ein wenig weniger wahrscheinlich, aber es tut es immer noch.

Es gibt E-Mail-Adresse Validierung Bibliotheken da draußen, die dies tun, einfach nach E-Mail-Validierung suchen.

All dies kann asynchron erfolgen. Ich habe dieses Setup auf meiner Website, in welchem ​​Fall die E-Mail in der Datenbank gespeichert wird (zu Prüfzwecken), ein Job in die Warteschlange gestellt, und wenn der Job zur Ausführung kommt, wird zu diesem Zeitpunkt eine zusätzliche Validierung durchgeführt. Es entlastet das schwere Heben zu einem anderen Faden.

Für den Benutzer scheint es, als ob die E-Mail bereits gesendet wurde (es ist in der Datenbank), und kann intern angezeigt werden, aber die eigentliche E-Mail wird nicht verschickt, bis dieser Job ausgeführt wird sofort oder einige Zeit abhängig von der Serverlast.

Walter

+0

Ich mag die Idee einer Validierungsauftragswarteschlange –

+0

Es ist eine Jobwarteschlange, ein Teil dieses Jobs ist die Validierung. Das Problem mit diesem Modell ist, dass jemand eine E-Mail eingeben kann, die denkt, dass sie gültig und gesendet ist, und wenn sie später verarbeitet wird, wird das System sie ablehnen. –

0
function mxrecordValidate($email){ 
     list($user, $domain) = explode('@', $email); 
     $arr= dns_get_record($domain,DNS_MX); 
     if($arr[0]['host']==$domain&&!empty($arr[0]['target'])){ 
       return $arr[0]['target']; 
     } 
} 
$email= '[email protected]'; 

if(mxrecordValidate($email)) { 
     echo('This MX records exists; I will accept this email as valid.'); 
} 
else { 
     echo('No MX record exists; Invalid email.'); 
} 
Verwandte Themen