Comme j'avais déjà commencé une réponse, bien que Dr@ke ait déjà répondu, voici ma version qui abouti à la même conclusion.
En fait dès la
deuxième réponse de ton sujet tu avais la réponse pour les caractères accentués en enlevant htmlentities().
Mais en plus j'avais ajouté au passage une fonction Protege_header pour éviter que ton formulaire puisse servir à des personnes mal intentionnées qui auraient pu le détourner :
...
Tu ne dois pas utiliser htmlentities. Cela sert pour protéger l'affichage des données mais ici tu ne les affiche pas, tu les envoie dans un header. Il suffit juste de protéger les champs "nom" et "adresse mail" pour qu'on ne puisse pas se servir de ton formulaire comme boite à spam.
//...
function Protege_header($value)
{
$value = str_replace("\n", "", str_replace("\r", "", $value));
return $value;
}
$nom=Protege_header($_POST['nom']);
$email=Protege_header($_POST['email']);
$sujet=$_POST['sujet'];
$message=$_POST['message'];
// etc.
La nécessité de cette protection est expliquée par exemple dans ce message d'infomaniak (un gros hébergeur)
Quelques sites ont été victimes d'une attaque distribuée visant à envoyer un mailing en masse de spam via des sites client.
En effet, des spammeurs ont répertorié toutes les pages ayant un formulaire de contact envoyant un email. Plusieurs sites hébergé chez nous et dans le monde ont donc été exploité de la même façon.
Ils se sont servis d'une faille existante dans beaucoup de formulaires de contact qui ne vérifient pas la présence de retour de ligne dans certains champs, en particulier celui de l'e-mail de l'expéditeur à compléter dans les formulaires.
Vous pouvez éviter que cela se produise, soit en désactivant le script PHP de contact e-mail de votre site, soit en vous assurant qu'il n'y a pas de retour de ligne dans chacun des champs du formulaire de contact de votre site.
Voici comment éviter simplement que ceci soit exploitable en remplaçant les retours de ligne dans chacun des champs devant normalement contenir un email (ce champ est souvent nommé $email, $sender ou $from):
$EMAIL = str_replace("\n", "", str_replace("\r", "", $EMAIL));
Le spammer exploite les scripts ressemblant à ceci
$MESSAGE = $_POST[m s g];
$RECIPIENT = "
[email protected]";
$SUBJECT = "Formulaire de contact";
$EMAIL = $_POST[e m a i l];
// Sans cette ligne votre script est exploitable !!!!
$EMAIL = str_replace("\n", "", str_replace("\r", "", $EMAIL));
mail($RECIPIENT, $SUBJECT, $MESSAGE, "From: $EMAIL" );
Merci de bien vouloir vérifier ceci dans vos scripts PHP.
Donc ma fonction Protege_header fait la même chose mais en plus de l'email elle protège également le champ "nom" qui peut également servir pour l'envoi de spam puisqu'il est envoyé dans le header. C.F. ton code initial :
$headers .= 'From: '.$nom.' <'. $email.' >' . "\r\n";
Le principe de cette protection est d'éviter à d'éventuels pirates d'envoyer des retours lignes dans ces champs.
Pour ceux qui veulent en savoir plus, c'est expliqué plus en détail
dans cette page
Ensuite il restait un problème puisque la configuration get_magic_quotes_gpc() de ton serveur est activée.
Il faut donc enlever les \ insérés à l'aide de la fonction stripslashes(), ce que Dr@ke
avait fait dans un premier temps.
Pour que tu n'aies pas à modifier ton code en cas de changement de configuration de serveur j'ai proposé de créer une fonction Verif_magicquotes qui vérifie la configuration du serveur avant d'appliquer cette fonction.
Nous en somme donc à ce point.
function Verif_magicquotes ($chaine)
{
if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);
return $chaine;
}
function Protege_header($value)
{
$value = str_replace("\n", "", str_replace("\r", "", $value));
return $value;
}
$nom = Protege_header(Verif_magicquotes($_POST['nom']));
$email = Protege_header(Verif_magicquotes($_POST['email']));
$sujet = Verif_magicquotes($_POST['sujet']);
$message = Verif_magicquotes($_POST['message']);
Et pour supprimer les espaces inutiles en début ou en fin de chaine, Dr@ke a proposé entre temps d'ajouter la fonction trim. Ce n'est pas en rapport direct avec tes problèmes rencontrés ni avec la sécurité du script mais une option pratique.
Au final on obtient donc un code
function Verif_magicquotes ($chaine)
{
if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);
return $chaine;
}
function Protege_header($value)
{
$value = str_replace("\n", "", str_replace("\r", "", $value));
return $value;
}
$nom = trim(Protege_header(Verif_magicquotes($_POST['nom'])));
$email = trim(Protege_header(Verif_magicquotes($_POST['email'])));
$sujet = trim(Verif_magicquotes($_POST['sujet']));
$message = trim(Verif_magicquotes($_POST['message']));
Note : tu as une petite erreur dans ton code html :<label for="requete">Message</label> à remplacer par <label for="message">Message</label>
(n'oublie pas de cliquer sur une case à cocher verte si ton pb est résolu).
Comme j'avais déjà commencé une réponse, bien que Dr@ke ait déjà répondu, voici ma version qui abouti à la même conclusion.
En fait dès la [url=http://forum.phpfrance.com/php-debutant/accents-caracteres-speciaux-affichent-t249883.html#p305800]deuxième réponse de ton sujet[/url] tu avais la réponse pour les caractères accentués en enlevant htmlentities().
Mais en plus j'avais ajouté au passage une fonction Protege_header pour éviter que ton formulaire puisse servir à des personnes mal intentionnées qui auraient pu le détourner :
[quote="AB"]
...
Tu ne dois pas utiliser htmlentities. Cela sert pour protéger l'affichage des données mais ici tu ne les affiche pas, tu les envoie dans un header. Il suffit juste de protéger les champs "nom" et "adresse mail" pour qu'on ne puisse pas se servir de ton formulaire comme boite à spam.
[php]//...
function Protege_header($value)
{
$value = str_replace("\n", "", str_replace("\r", "", $value));
return $value;
}
$nom=Protege_header($_POST['nom']);
$email=Protege_header($_POST['email']);
$sujet=$_POST['sujet'];
$message=$_POST['message'];
// etc.[/php][/quote]
La nécessité de cette protection est expliquée par exemple dans ce message d'infomaniak (un gros hébergeur)
[quote="infomaniak"]
Quelques sites ont été victimes d'une attaque distribuée visant à envoyer un mailing en masse de spam via des sites client.
En effet, des spammeurs ont répertorié toutes les pages ayant un formulaire de contact envoyant un email. Plusieurs sites hébergé chez nous et dans le monde ont donc été exploité de la même façon.
Ils se sont servis d'une faille existante dans beaucoup de formulaires de contact qui ne vérifient pas la présence de retour de ligne dans certains champs, en particulier celui de l'e-mail de l'expéditeur à compléter dans les formulaires.
Vous pouvez éviter que cela se produise, soit en désactivant le script PHP de contact e-mail de votre site, soit en vous assurant qu'il n'y a pas de retour de ligne dans chacun des champs du formulaire de contact de votre site.
Voici comment éviter simplement que ceci soit exploitable en remplaçant les retours de ligne dans chacun des champs devant normalement contenir un email (ce champ est souvent nommé $email, $sender ou $from):
$EMAIL = str_replace("\n", "", str_replace("\r", "", $EMAIL));
Le spammer exploite les scripts ressemblant à ceci
$MESSAGE = $_POST[m s g];
$RECIPIENT = "
[email protected]";
$SUBJECT = "Formulaire de contact";
$EMAIL = $_POST[e m a i l];
// Sans cette ligne votre script est exploitable !!!!
$EMAIL = str_replace("\n", "", str_replace("\r", "", $EMAIL));
mail($RECIPIENT, $SUBJECT, $MESSAGE, "From: $EMAIL" );
Merci de bien vouloir vérifier ceci dans vos scripts PHP. [/quote]
Donc ma fonction Protege_header fait la même chose mais en plus de l'email elle protège également le champ "nom" qui peut également servir pour l'envoi de spam puisqu'il est envoyé dans le header. C.F. ton code initial : [php]$headers .= 'From: '.$nom.' <'. $email.' >' . "\r\n";[/php]
Le principe de cette protection est d'éviter à d'éventuels pirates d'envoyer des retours lignes dans ces champs.
Pour ceux qui veulent en savoir plus, c'est expliqué plus en détail [url=http://www.phpsecure.info/v2/article/MailHeadersInject.php]dans cette page[/url]
Ensuite il restait un problème puisque la configuration get_magic_quotes_gpc() de ton serveur est activée.
Il faut donc enlever les \ insérés à l'aide de la fonction stripslashes(), ce que Dr@ke [url=http://forum.phpfrance.com/php-debutant/accents-caracteres-speciaux-affichent-t249883-15.html#p305993]avait fait dans un premier temps[/url].
Pour que tu n'aies pas à modifier ton code en cas de changement de configuration de serveur j'ai proposé de créer une fonction Verif_magicquotes qui vérifie la configuration du serveur avant d'appliquer cette fonction.
Nous en somme donc à ce point.
[php]function Verif_magicquotes ($chaine)
{
if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);
return $chaine;
}
function Protege_header($value)
{
$value = str_replace("\n", "", str_replace("\r", "", $value));
return $value;
}
$nom = Protege_header(Verif_magicquotes($_POST['nom']));
$email = Protege_header(Verif_magicquotes($_POST['email']));
$sujet = Verif_magicquotes($_POST['sujet']);
$message = Verif_magicquotes($_POST['message']);[/php]
Et pour supprimer les espaces inutiles en début ou en fin de chaine, Dr@ke a proposé entre temps d'ajouter la fonction trim. Ce n'est pas en rapport direct avec tes problèmes rencontrés ni avec la sécurité du script mais une option pratique.
Au final on obtient donc un code
[php]function Verif_magicquotes ($chaine)
{
if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);
return $chaine;
}
function Protege_header($value)
{
$value = str_replace("\n", "", str_replace("\r", "", $value));
return $value;
}
$nom = trim(Protege_header(Verif_magicquotes($_POST['nom'])));
$email = trim(Protege_header(Verif_magicquotes($_POST['email'])));
$sujet = trim(Verif_magicquotes($_POST['sujet']));
$message = trim(Verif_magicquotes($_POST['message']));[/php]
Note : tu as une petite erreur dans ton code html :<label for="requete">Message</label> à remplacer par <label for="message">Message</label>
(n'oublie pas de cliquer sur une case à cocher verte si ton pb est résolu).