Seite 1 von 1
E-Mail-Validierungs-Funktion
Verfasst: Mo 16. Nov 2009, 22:18
von Drizzt
Hallo,
es wird ja ein PHP-Mailer mit Contenido ausgeliefert und sicher werden auch nahezu alle Seiten irgendeine Form eines Kontaktformulars mitbringen. Deshalb fände ich es gut, wenn man eine Funktion zur Verifikation von E-Mails direkt in die Contenido-Bibliotheken aufnehmen könnte (der Check in
contenido/classes/class.form.php ist leider nicht geeignet den kompletten RFC abzudecken).
Ich würde folgenden Code vorschlagen:
Code: Alles auswählen
<?php
/*
* A function for verifying an e-mail address.
* Copyright © 2009 Kai Wasserbäch <kai@dev.carbon-project.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
function verifyEmailString( $sEMailToCheck ) {
//
// Check for RFC conformance.
//
if( filter_var($sEMailToCheck, FILTER_VALIDATE_EMAIL) === false ) {
return false;
}
//
// Check for MX or ANY record in DNS.
//
$sEmailHost = substr( strstr( $sEMailToCheck, '@'), 1).'.';
if( !getmxrr( $sEMailHost, $tmpArray ) && !checkdnsrr( $sEmailHost, 'ANY' ) ) {
return false;
}
// no failed tests
return true;
}
?>
Grüße,
Kai
P.S.: Der »isNotEmpty()«-Check in der o.g. PHP-Datei sollte doch hoffentlich so aussehen:
Code: Alles auswählen
function isNotEmpty($value) {
return !empty($value);
} // end function
P.P.S.: Ähnliches gilt für diverse andere der FormCheck-Member auch IMHO.
Re: E-Mail-Validierungs-Funktion
Verfasst: Mi 18. Nov 2009, 19:35
von Drizzt
Ok, das hatte ich beim letzten Mal vergessen, aber man sollte RFC-2606-Domains/TLDs auch noch ausfiltern, deshalb hier die aktualisierte Version der Funktion:
Code: Alles auswählen
<?php
/*
* A function for verifying an e-mail address.
* Copyright © 2009 Kai Wasserbäch <kai@dev.carbon-project.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
function verifyEmailString( $sEMailToCheck ) {
//
// Check for RFC conformance.
//
if( filter_var($sEMailToCheck, FILTER_VALIDATE_EMAIL) === false ) {
return false;
}
//
// RFC 2606 filter (<http://tools.ietf.org/html/rfc2606>)
//
$sEmailHost = substr( strstr( $sEMailToCheck, '@'), 1);
$sEmailTLD = strrchr( $sEmailHost, '.' );
if( $sEmailTLD === '.test' || $sEmailTLD === '.example' ||
$sEmailTLD === '.invalid' || $sEmailTLD === '.localhost' ) {
return false;
}
if( $sEmailHost === 'example.com' || $sEmailHost === 'example.org' ||
$sEmailHost === 'example.net' ) {
return false;
}
//
// Check for MX or ANY record in DNS.
//
$sEmailHost .= '.';
if( !getmxrr( $sEMailHost, $tmpArray ) && !checkdnsrr( $sEmailHost, 'ANY' ) ) {
return false;
}
// no failed tests
return true;
}
?>
Grüße,
Kai
Re: E-Mail-Validierungs-Funktion
Verfasst: Di 9. Feb 2010, 00:51
von xmurrix
Hallo Drizzt,
vielen Dank für das Einbringen deiner Ideen. Das Validieren von E-Mail Adressen mit der filter_var() Funktion ist auch meiner Meinung nach besser, als die Validierung mit preg_match().
Ein Punkt wäre da zu beachten. Die filter_var() Funktionen gibt es ab PHP 5.2.0. Eine Übernahme solcher Funktionen, kann schnell dazu führen, dass viele Contenido-User Probleme bekommen. Da draußen gibt es viele Installationen, die zwar mit PHP5 laufen, aber noch nicht PHP 5.2.
Man könnte aber mit function_exists() arbeiten, und älteren Installationen dennoch einen preg_match anbieten.
Es gibt aber noch einen E-Mail Check in Contenido, die Funktion isValidMail() in der Datei contenido/includes/function.general.php. Dieser Check ist weitaus besser, als die Überprüfung in der class.form.php.
Neuere Versionen von PHP Mailer haben auch eine Funktion zum Validieren von E-Mails, vielleicht sollte man den PHP Mailer in Contenido auf den neuesten Stand bringen, und die Validierung der E-Mails etwas zentralisieren.
Gruß
xmurrix
Re: E-Mail-Validierungs-Funktion
Verfasst: Di 9. Feb 2010, 11:55
von kummer
xmurrix hat geschrieben:Das Validieren von E-Mail Adressen mit der filter_var() Funktion ist auch meiner Meinung nach besser, als die Validierung mit preg_match().
und warum, wenn man fragen darf? während eine regex auf einen schlag alle massgeblichen apsekte zu prüfen vermag, begnügt sich die filter_var auf einen teilaspekt. ganz zu schweigen vom umstand - vor dir ja auch schon angesprochen -, dass die einführung erst mit der version 5.2 vorgenommen worden ist. zwei unterschiedliche varianten zu integrieren ist im hinblick auf die redzibilität auch nicht wirklich günstig. und die leistungsfähigkeit kann die anwendung einer solchen funktion kaum beeinflussen.
Re: E-Mail-Validierungs-Funktion
Verfasst: Di 9. Feb 2010, 12:57
von xmurrix
filter_var() verwendet ja auch einen Regex, der dann nativ in PHP verarbeitet wird (siehe php-src-5.3/ext/filter/logical_filters.c). Habe zwar beide Regex (native Regex in PHP gegen Regex im Script) nicht gegeneinander verglichen, aber die von filter_var() ist auch nicht ganz ohne, hier die entsprechende Zeile:
Code: Alles auswählen
const char regexp[] = "/^((\\\"[^\\\"\\f\\n\\r\\t\\b]+\\\")|([A-Za-z0-9_][A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\\+\\-\\~\\/\\=\\?\\^\\`\\|\\{\\}]*(\\.[A-Za-z0-9_\\!\\#\\$\\%\\&\\'\\*\\+\\-\\~\\/\\=\\?\\^\\`\\|\\{\\}]*)*))@((\\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9])(([A-Za-z0-9\\-])*([A-Za-z0-9]))?(\\.(?=[A-Za-z0-9\\-]))?)+[A-Za-z]+))$/D";
Dieser Regex müsste doch ausreichend sein oder?
Natürlich kann man es bei einem preg_match im PHP-Script auch belassen, ich persönlich verwende gerne Features, die nativ von PHP unterstützt werden. Solange man nicht tausende Mails prüfen muss, ist der Geschwindigkeitssvorteil von filter_var() nicht wichtig.
zwei unterschiedliche varianten zu integrieren ist im hinblick auf die redzibilität auch nicht wirklich günstig
Du hast schon damit schon recht. Andererseits, wenn man neuere Möglichkeiten nicht in eine Applikation integriert, weil die alten Funktionen weiterhin perfekt funktionieren, kann sich das im Laufe der Jahre nachteilig auswirken. Bin der Meinung, dass man hin und wieder die Sourcen etwas auffrischen sollte. Auch auf die Gefahr hin, dass beide Varianten unter Umständen andere Ergebnisse liefern. Installationen mit neuesten PHP-Versionen profitieren davon, und andere mit etwas älteren PHP-Versionen haben immer noch die alte Funktionalität.
Software lebt ja von Weiterentwicklung...
Gruß
xmurrix
Re: E-Mail-Validierungs-Funktion
Verfasst: Di 9. Feb 2010, 14:13
von Drizzt
kummer hat geschrieben:während eine regex auf einen schlag alle massgeblichen apsekte zu prüfen vermag, begnügt sich die filter_var auf einen teilaspekt.
Mal abgesehen von der Tatsache, dass so ein RegEx fast nie vollständig sein kann, da der Standard, der den Aufbau von Adressen beschreibt nicht ganz leicht umzusetzen ist, und meist sogar davon abgeraten wird E-Mail-Adressen überhaupt weiter als „enthält ein @“ zu prüfen, sollte man nicht vergessen, dass zum Einen auch filter_var() intern mit einem RegEx arbeitet und es mir zum Anderen deutlich sinnvoller erscheint, diesen zu erweitern/verbessern, wenn er etwas nicht erwischen sollte. Das hat dann den enormen Vorteil, dass alle PHP-Installationen in den Genuss der besseren Validierung kommen und nicht nur ein Projekt oder ein Teil eines Projekts.
Unabhängig davon hat die vorgeschlagene Funktion noch den enormen Vorteil, dass sie auch RFC-2606-Domains/TLDs ausfiltert und den MX-Eintrag (oder ANY, falls vorhanden) prüft. Wobei man das natürlich auch in die aktuellen Funktionen einbetten könnte.
Grüße,
Kai
Re: E-Mail-Validierungs-Funktion
Verfasst: Fr 16. Apr 2010, 17:21
von Drizzt
Die oben vorgeschlagene Funktion ist jetzt
als Patch in meinem
Git-Repository für Contenido verfügbar (wobei der Patch den Inhalt von isEmail() tauscht).
Re: E-Mail-Validierungs-Funktion
Verfasst: Fr 16. Apr 2010, 19:04
von Drizzt
xmurrix hat geschrieben:Es gibt aber noch einen E-Mail Check in Contenido, die Funktion isValidMail() in der Datei contenido/includes/function.general.php. Dieser Check ist weitaus besser, als die Überprüfung in der class.form.php.
Diese Funktion ist jetzt auch gefixt in meinem Git-Repository (
Patch).
Wer gleich das ganze Repository haben möchte, holte es sich am Besten mit:
Code: Alles auswählen
git clone git://git.carbon-project.org/contenido.git kws_contenido
Grüße,
Kai
Re: E-Mail-Validierungs-Funktion
Verfasst: Mi 12. Okt 2011, 23:42
von xmurrix
Dieser Punkt ist als Todo angelegt und sollte auch bald abgearbeitet werden.
Re: E-Mail-Validierungs-Funktion
Verfasst: Do 13. Okt 2011, 15:09
von Drizzt
Schön, dass es hier mal Bewegung gibt.
Auch die in diesem Thread vorgeschlagenen Änderungen an den beiden Funktionen sind in der
gestern geposteten Serie enthalten. Alternativ sind sie auch in
meinem Git-Repository zu finden. Der Vorteil der Patches aus der Serie ist, dass sie eigentlich ohne Probleme auf die aktuellen Dateien (wie mit 4.8.15 ausgeliefert) als Patch anwendbar sein sollten.
Re: E-Mail-Validierungs-Funktion
Verfasst: Fr 14. Okt 2011, 00:57
von xmurrix
Hallo Kai,
es wurde nun ein neues Todo angelegt, deine Änderungen zu prüfen und gegebenenfalls zu übernehmen. Die Patches können sehr wahrscheinlich nicht angewandt werden, da der aktuelle Entwicklungsstand von CONTENIDO weit entfernt von der Version 4.8.15 ist. Es sind nicht nur neue Features hinzu gekommen, es wurde auch einiges vereinheitlicht, also Tabs, Spaces, Zeilenumbrüche, Sourcecode Dokumentation, Formatieren der Sourcen, usw...
Gruß
xmurrix
Re: E-Mail-Validierungs-Funktion
Verfasst: Fr 18. Nov 2011, 02:39
von xmurrix
Kurze Statusinfo zur E-Mails. Das Prüfen von E-Mail Adressen wurde im CONTENIDO Core nun vereinheitlicht, isValidMail() und FormCheck->isEmail() verwenden nun die Identische Überprüfung.
Grüße
xmurrix