Dans le script de messagerie PHP de la section précédente, il existe une vulnérabilité.
Tout d’abord, regardez le code PHP du chapitre précédent :
<html><head><meta charset="utf-8"><title>Tutoriel Codeur (codercto.com)</title></head><body><?phpif (isset($_REQUEST['email' ] )) { // Si le paramètre email est reçu, envoyer un email // Envoyer un email $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] $message = $_REQUEST['message'] ; mail("[email protected]", $subject, $message, "From:" . $email); echo "Mail envoyé avec succès";} else { // S'il n'y a pas d'e-mail paramètre puis Afficher le formulaire echo "<form method='post' action='mailform.php'> Email : <input name='email' type='text'><br> Objet : <input name='subject' type='text'><br> Message :<br> <textarea name='message' rows='15' cols='40'> </textarea><br> <input type='submit'> </form >";}?></body></html>
Le problème avec le code ci-dessus est que des utilisateurs non autorisés peuvent insérer des données dans l'en-tête de l'e-mail via le formulaire de saisie.
Que se passera-t-il si l'utilisateur ajoute le texte suivant à l'e-mail dans la zone de saisie du formulaire ?
quelqu'[email protected]%0ACc:[email protected]%0ABcc:[email protected],[email protected],[email protected],[email protected]%0ABTo:[email protected]
Comme d'habitude, la fonction mail() place le texte ci-dessus dans l'en-tête de l'e-mail, donc l'en-tête comporte désormais des champs Cc :, Bcc : et To : supplémentaires. Lorsque l'utilisateur clique sur le bouton Soumettre, cet e-mail sera envoyé à toutes les adresses ci-dessus !
La meilleure façon d’empêcher l’injection d’e-mails est de valider la saisie.
Le code suivant est similaire à celui du chapitre précédent, mais nous avons ajouté ici un validateur d'entrée pour détecter le champ email dans le formulaire :
<html><head><meta charset="utf-8"><title>Tutoriel du codeur (codercto.com)</title></head><body><?phpfunction spamcheck($field){ // filter_var ( ) Filtrer les e-mails // Utiliser FILTER_SANITIZE_EMAIL $field=filter_var($field, FILTER_SANITIZE_EMAIL); //filter_var() Filtrer les e-mails // Utilisez FILTER_VALIDATE_EMAIL if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE; }}if (isset($_REQUEST['email'])){ // Si le paramètre email est reçu, envoyez l'e-mail // Détermine si l'e-mail est légal $mailcheck = spamcheck($_REQUEST['email']); ($mailcheck==FALSE) { echo "Entrée illégale"; } else { // Envoyer un email $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; message'] ; mail("quelqu'[email protected]", "Objet : $sujet", $message, "De : $email" ); pour utiliser notre formulaire mail"; }}else{ // S'il n'y a pas de paramètre email, afficher le formulaire echo "<form method='post' action='mailform.php'> Email : <input name='email' type ='text '><br> Sujet : <input name='subject' type='text'><br> Message :<br> <textarea name='message' rows='15' cols='40'> </textarea><br> <input type='submit'> </form>";}?></body></html>
Dans le code ci-dessus, nous utilisons un filtre PHP pour valider l'entrée :
Le filtre FILTER_SANITIZE_EMAIL supprime les caractères illégaux de l'e-mail de la chaîne
Le filtre FILTER_VALIDATE_EMAIL valide la valeur d'une adresse email
Vous pouvez en savoir plus sur les filtres dans notre filtre PHP.