J'utilise is_email()
pour vérifier si une adresse e-mail fournie par l'utilisateur est valide. Par exemple:
$email = $_POST['email'];
if ( is_email( $email ) )
// Do something.
À ma connaissance, rien dans cette fonction n'écrit d'informations dans la base de données. Dois-je désinfecter $email
avant de le passer à la fonction?
sanitization
Henrywright
la source
la source
Réponses:
En regardant les
is_email()
fonctionnalités de trac, il semble que vous n'ayez pas besoin de sanatizie car il s'agit simplement de tests de chaînes. J'irais même jusqu'à dire que si cette fonction retourne true, vous n'auriez pas besoin de la nettoyer avant de l'envoyer dans la base de données.la source
Cœur WordPress et PHP
La
is_email()
fonction Source est une implémentation WordPress typique et ne fonctionne pas complètement avec ce que permet le RFC 6531 . Une des raisons pourrait être que laFILTER_VALIDATE_EMAIL
constante PHP par défautfilter_var()
n'est pas beaucoup plus efficace pour valider quelque chose selon les directives de l' IETF® (Internet Engineering Task Force) .Normes
Le fait est que le RFC 6531 autorise "les caractères Unicode au-delà de la plage ASCII" . À savoir ce sont (pour la partie locale - avant le
@
):et pour la partie globale / domaine:
Source: Wikipedia
Qu'est-ce qui est valable?
Cela peut conduire à des adresses e-mail étranges mais valides comme les suivantes:
Source: php.net / author [email protected] - exemple corrigé par l'auteur de ce post
Limites
Il existe également des limites de longueur locales et de domaine:
Source: Wikipedia
Restrictions WordPress
Et c'est ce que WordPress vérifie:
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 );
puis2 > count( $subs )
trim( $sub, " \t\n\r\0\x0B-" ) !== $sub
!preg_match('/^[a-z0-9-]+$/i', $sub )
Source: WP Core v4.0
Filtres et validation personnalisée
Tous les cas mentionnés ci-dessus déclencheront un
is_email()
retour faux. Le résultat est filtrable (un rappel peut être attaché) et le filtre aura trois arguments, où le dernier argument est la raison. Exemple:ce qui signifie que vous pouvez remplacer les résultats renvoyés par des vérifications spécifiques.
Cela vous permet d'ajouter des vérifications spéciales, par exemple pour autoriser les domaines Umlaut, les parties de domaine TLD uniquement, etc.
Conclusion
WordPress est sûr dans la plupart des cas, mais plus restrictif car les serveurs de messagerie doivent être conformes à RFC. Gardez à l'esprit que tous les serveurs de messagerie ne seront pas alignés sur les directives RF 6531.
Éditer
Sidefact drôle: Il y a deux fonctions liées à l'intérieur
~/wp-includes/formatting
:is_email()
etsanitize_email()
. Ils ont pratiquement la même fonction. Je n'ai aucune idée pourquoi quelqu'un a décidé que ce serait une bonne idée de copier le contenu de la fonction de l'un à l'autre au lieu d'ajouter simplement l'un comme rappel aux filtres que l'autre fournit. Comme depuis la v0.71 et depuis la v1.5 sont les mêmes, j'utiliserais personnellement la dernière que vous obtenez une chaîne nettoyée. Notez que même indique qu'il n'est pas compatible RFC.is_email()
sanitize_email()
is_email()
la source
Désinfectez toutes les choses!
L'une des règles cardinales de sécurité est de ne jamais faire confiance à l'entrée de l'utilisateur. En général, je ne me soucie pas de l'implémentation de is_email () ou de toute autre fonction spécifique, ou si cette fonction fait quelque chose de dangereux avec ce que je lui donne. Peut-être que la mise en œuvre changera un jour. Qui sait. Je dois supposer que cela peut être compromis. L'hypothèse devrait toujours être que l'entrée utilisateur est activement hostile, doublement pour tout ce qui est éventuellement destiné à une base de données, et pour nettoyer chaque bit d'entrée utilisateur avant de le transmettre à une fonction. C'est juste une bonne hygiène de sécurité générale.
la source