Ich is_email()
überprüfe mit, ob eine vom Benutzer angegebene E-Mail-Adresse gültig ist. Beispielsweise:
$email = $_POST['email'];
if ( is_email( $email ) )
// Do something.
Nach meinem besten Wissen schreibt nichts in dieser Funktion Informationen in die Datenbank. Sollte ich bereinigen, $email
bevor ich es an die Funktion weitergebe?
sanitization
Henrywright
quelle
quelle
Antworten:
Wenn Sie sich die
is_email()
Funktionen von trac ansehen, müssen Sie anscheinend nicht sanieren, da es sich nur um Stringtests handelt. Ich würde sogar so weit gehen zu sagen, dass wenn diese Funktion true zurückgibt, Sie sie nicht bereinigen müssen, bevor Sie sie in die Datenbank senden.quelle
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ürfilter_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
@
):und für den globalen / Domain-Teil:
Quelle: Wikipedia
Was ist gültig?
Dies kann zu seltsamen, aber gültigen E-Mail-Adressen wie den folgenden führen:
Quelle: php.net / author [email protected] - Beispiel vom Autor dieses Beitrags behoben
Grenzen
Es gibt auch lokale und Domain-Längenbeschränkungen:
Quelle: Wikipedia
WordPress-Einschränkungen
Und darauf prüft WordPress:
strlen( $email ) < 3
strpos( $email, '@', 1 ) === false
!preg_match( '/^[a-zA-Z0-9!#$%&\'*+\/=?^_`{|}~\.-]+$/', $local )
preg_match( '/\.{2,}/', $domain )
trim( $domain, " \t\n\r\0\x0B." ) !== $domain
$subs = explode( '.', $domain );
und dann2 > 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: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()
undsanitize_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()
quelle
Sanitize all die Dinge!
Eine der wichtigsten Sicherheitsregeln besteht darin, den Eingaben des Benutzers niemals zu vertrauen. Im Allgemeinen interessiert mich die Implementierung von is_email () oder einer anderen spezifischen Funktion nicht, oder ob diese Funktion mit dem, was ich gebe, etwas Gefährliches anstellt. Vielleicht wird sich die Implementierung eines Tages ändern. Wer weiß. Ich muss davon ausgehen, dass es kompromittiert werden kann. Die Annahme sollte immer sein, dass Benutzereingaben aktiv feindselig sind, doppelt für alles, was irgendwann für eine Datenbank bestimmt ist, und dass jede Benutzereingabe bereinigt werden muss, bevor sie an eine Funktion übergeben wird. Dies ist nur eine gute allgemeine Sicherheitshygiene.
quelle