WordPress und PHP-Kern
Die is_email()
Funktion Source ist eine typische WordPress-Implementierung und funktioniert nicht vollständig mit dem, was der RFC 6531 zulässt. Ein Grund könnte sein, dass die Standard-PHP- FILTER_VALIDATE_EMAIL
Konstante für filter_var()
nicht viel besser ist, um etwas gemäß den Richtlinien der Internet Engineering Task Force (IETF®) zu validieren .
Standards
Punkt ist, dass der RFC 6531 "Unicode-Zeichen außerhalb des ASCII-Bereichs" zulässt . Das sind nämlich (für den lokalen Teil - vor dem @
):
- Englische Groß- und Kleinbuchstaben (AZ, AZ) (ASCII: 65-90, 97-122)
- Ziffern
0
bis 9
(ASCII: 48–57)
- Diese Sonderzeichen:
! # $ % & ' * + - / = ? ^ _ ` { | } ~
- Zeichen
.
(Punkt, Punkt, Punkt) (ASCII: 46), sofern es sich nicht um das erste oder letzte Zeichen handelt, und sofern es nicht fortlaufend vorkommt (z. B. John..Doe@example.com
nicht zulässig).
- Sonderzeichen sind mit Einschränkungen erlaubt. Sie sind:
- Leerzeichen und
"(),:;<>@[\]
(ASCII: 32, 34, 40, 41, 44, 58, 59, 60, 62, 64, 91–93)
- Die Einschränkungen für Sonderzeichen bestehen darin, dass sie nur zwischen Anführungszeichen verwendet werden dürfen und dass 2 von ihnen (der Backslash \ und das Anführungszeichen "(ASCII: 92, 34)) ebenfalls mit einem Backslash
\
(zB "\\"
und "\""
) versehen werden müssen. .
- Kommentare sind mit runden Klammern an beiden Enden des lokalen Teils zulässig. zB
john.smith(comment)@example.com
und (comment)john.smith@example.com
sind beide äquivalent "john.smith@example.com"
, john.(comment)smith@example.com
wären aber ungültig.
- Die obigen internationalen Zeichen
U+007F
, die als UTF-8 codiert sind, sind nach RFC 6531 zulässig, obwohl Mailsysteme möglicherweise die Verwendung der Zeichen für die Zuweisung lokaler Teile einschränken.
und für den globalen / Domain-Teil:
Der Domainnamen-Teil einer E-Mail-Adresse muss strengen Richtlinien entsprechen: Er muss den Anforderungen für einen Hostnamen entsprechen, der aus Buchstaben, Ziffern, Bindestrichen und Punkten besteht. Darüber hinaus kann der Domänenteil ein IP-Adressliteral sein, das von eckigen Klammern wie jsmith@[192.168.2.1]
oder jsmith@[IPv6:2001:db8::1]
[…] umgeben ist.
Quelle: Wikipedia
Was ist gültig?
Dies kann zu seltsamen, aber gültigen E-Mail-Adressen wie den folgenden führen:
localpart.ending.with.dot.@example.com
(comment)localpart@example.com
"this is v@lid!"@example.com
"much.more unusual"@example.com
postbox@com
admin@mailserver1
"()<>[]:,;\\@\"\\\\!#$%&\'*+-/=?^_`{}| ~.a"@example.org
" "@example.org
Quelle: php.net / author gt@kani.hu - Beispiel vom Autor dieses Beitrags behoben
Grenzen
Es gibt auch lokale und Domain-Längenbeschränkungen:
Im Format der E-Mail-Adressen darflocal-part@domain
der lokale Teil bis zu 64 Zeichen lang sein und der Domain-Name darf maximal 253 Zeichen lang sein. Die maximale Länge eines Vorwärts- oder Rückwärtspfads von 256 Zeichen beschränkt die gesamte E-Mail-Adresse jedoch auf darf nicht länger als 254 Zeichen sein . [2] Die formalen Definitionen sind in RFC 5322 (Abschnitte 3.2.3 und 3.4.1) und RFC 5321 enthalten. Eine besser lesbare Form finden Sie im informativen RFC 3696 [3] und den zugehörigen Errata .
Quelle: Wikipedia
WordPress-Einschränkungen
Und darauf prüft WordPress:
- Testen Sie die Mindestlänge der E-Mail:
strlen( $email ) < 3
- Test auf ein @ -Zeichen nach der ersten Position:
strpos( $email, '@', 1 ) === false
- Auf ungültige Zeichen prüfen:
!preg_match( '/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]+$/', $local )
- Test für Abfolgen von Perioden:
preg_match( '/\.{2,}/', $domain )
- Test für führende und nachfolgende Perioden und Leerzeichen:
trim( $domain, " \t\n\r\0\x0B." ) !== $domain
- Angenommen, die Domain hat mindestens zwei Subs:
$subs = explode( '.', $domain );
und dann
2 > count( $subs )
trim( $sub, " \t\n\r\0\x0B-" ) !== $sub
!preg_match('/^[a-z0-9-]+$/i', $sub )
Quelle: WP Core v4.0
Filter & benutzerdefinierte Validierung
Alle oben genannten Fälle lösen is_email()
den Rückgabewert false aus. Das Ergebnis ist filterfähig (ein Rückruf kann angehängt werden) und der Filter hat drei Argumente, wobei das letzte Argument der Grund ist. Beispiel:
return apply_filters( 'is_email', false, $email, 'sub_hyphen_limits' );
Dies bedeutet, dass Sie die von bestimmten Prüfungen zurückgegebenen Ergebnisse überschreiben können.
Auf diese Weise können Sie spezielle Prüfungen hinzufügen, um beispielsweise Umlaut-Domains, nur TLD-Domain-Teile usw. zuzulassen.
Fazit
WordPress ist in den meisten Fällen sicher, aber restriktiver, da Mailserver RFC-konform sein müssen. Beachten Sie, dass nicht jeder Mailserver den RF 6531-Richtlinien entspricht.
Bearbeiten
Lustiger Nebeneffekt: Es gibt zwei verwandte Funktionen ~/wp-includes/formatting
: is_email()
und sanitize_email()
. Sie haben praktisch die gleiche Funktion. Ich habe keine Ahnung, warum jemand entschieden hat, dass es eine gute Idee ist, den Funktionsinhalt von einem zum anderen zu kopieren, anstatt nur den einen als Rückruf zu den Filtern hinzuzufügen, die der andere bereitstellt. Da v0.71 und v1.5 gleich sind, würde ich das später verwenden, da man einen gereinigten String bekommt. Beachten Sie, dass sogar angegeben wird, dass es nicht RFC-konform ist.is_email()
sanitize_email()
is_email()