E-Mail-Validierungs-Funktion

Ideen für neue Funktionen in CONTENIDO?
Antworten
Drizzt
Beiträge: 17
Registriert: Do 3. Jul 2008, 19:39
Kontaktdaten:

E-Mail-Validierungs-Funktion

Beitrag von Drizzt » Mo 16. Nov 2009, 22:18

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.
Zuletzt geändert von Drizzt am Mi 18. Nov 2009, 19:35, insgesamt 1-mal geändert.

Drizzt
Beiträge: 17
Registriert: Do 3. Jul 2008, 19:39
Kontaktdaten:

Re: E-Mail-Validierungs-Funktion

Beitrag von Drizzt » Mi 18. Nov 2009, 19:35

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

xmurrix
Beiträge: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: E-Mail-Validierungs-Funktion

Beitrag von xmurrix » Di 9. Feb 2010, 00:51

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
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Re: E-Mail-Validierungs-Funktion

Beitrag von kummer » Di 9. Feb 2010, 11:55

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.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)

xmurrix
Beiträge: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: E-Mail-Validierungs-Funktion

Beitrag von xmurrix » Di 9. Feb 2010, 12:57

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
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Drizzt
Beiträge: 17
Registriert: Do 3. Jul 2008, 19:39
Kontaktdaten:

Re: E-Mail-Validierungs-Funktion

Beitrag von Drizzt » Di 9. Feb 2010, 14:13

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

Drizzt
Beiträge: 17
Registriert: Do 3. Jul 2008, 19:39
Kontaktdaten:

Re: E-Mail-Validierungs-Funktion

Beitrag von Drizzt » Fr 16. Apr 2010, 17:21

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).

Drizzt
Beiträge: 17
Registriert: Do 3. Jul 2008, 19:39
Kontaktdaten:

Re: E-Mail-Validierungs-Funktion

Beitrag von Drizzt » Fr 16. Apr 2010, 19:04

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

xmurrix
Beiträge: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: E-Mail-Validierungs-Funktion

Beitrag von xmurrix » Mi 12. Okt 2011, 23:42

Dieser Punkt ist als Todo angelegt und sollte auch bald abgearbeitet werden.
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Drizzt
Beiträge: 17
Registriert: Do 3. Jul 2008, 19:39
Kontaktdaten:

Re: E-Mail-Validierungs-Funktion

Beitrag von Drizzt » Do 13. Okt 2011, 15:09

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.

xmurrix
Beiträge: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: E-Mail-Validierungs-Funktion

Beitrag von xmurrix » Fr 14. Okt 2011, 00:57

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
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

xmurrix
Beiträge: 3143
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: E-Mail-Validierungs-Funktion

Beitrag von xmurrix » Fr 18. Nov 2011, 02:39

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
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Antworten