accents et caractères spéciaux ne s'affichent

Mammouth du PHP | 985 Messages

12 sept. 2009, 14:28

Le code plus haut est maintenant correct pour le problème de Spam.
Et donc pour la sécurisation du script de humantarget, l'important est qu' AB a bien fait d'intervenir, et donc je l'en remercie :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

humantarget
Invité n'ayant pas de compte PHPfrance

13 sept. 2009, 19:38

@FuZZyLine

Merci d'intervenir ! :wink: Depuis un moment, je vois Dr@ke et AB se déchirer mais, je tiens à préciser que je suis un débutant en php, que j'ai posté dans le forum "débutant" et que là, je commence à avoir du mal à suivre.

Donc, est-ce que quelqu'un pourrait résumer ? Je m'y perd un peu entre le but original (originel) de ce topic (à savoir comment afficher des caractères spéciaux et des accents dans un mail reçu sur Yahoo! et envoyé à partir d'un formulaire de contact de ma page perso...) et la question dérivée (comment me protéger des spams et des injections SQL, etc envoyés à partir du formulaire de contact).

En tout cas je vous remercie car vous avez cherché à m'aider au mieux... :D

Ah oui, j'oublais : si vous postez des codes, est-ce que vous pouvez les commenter de manière simple et compréhensible pour un débutant comme moi ?

Merci pour tout !!!!

Mammouth du PHP | 985 Messages

13 sept. 2009, 19:56

Il fallait enlever la fonction htmlentities de ton code, je pense que tu as vue la différence et donc compris pourquoi...

Ensuite ton code paraissait non sécurisé, on l'a souligné et posté une portion de code avec une fonction supplémentaire pour te protéger du Spam.
La fonction Protege_header() protège tes variables de quelques caractères interdits...

La fonction trim() supprime les espaces en début et fin de chaine...

Ensuite tu as souligné un problème d'antislashs:
Des antishashs sont ajoutés quand magic_quotes_gpc est à ON. Cette fonction sera supprimée dès PhP 6 car obsolète.
Donc la fonction Verif_magicquotes permet de les supprimer de façon sécurisé.

C'est juste ce qui t'a été conseillé de faire.
Ensuite libre à toi de faire différemment, c'est juste un exemple fonctionnel mais évidemment non parfait comme tout en fait...

Pour le reste oui cela a dévié un peu , mais c'est un forum public, et cela n'était pas forcement inutile pour tout le monde, en tout cas pour moi personnellement.

Donc le code à titre d'exemple et informatif:
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']));
En espérant que ce soit plus clair maintenant.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

humantarget
Invité n'ayant pas de compte PHPfrance

13 sept. 2009, 20:19


Pour le reste oui cela a dévié un peu , mais c'est un forum public, et cela n'était pas forcement inutile pour tout le monde, en tout cas pour moi personnellement.
Je comprend ce que tu dis et j'en suis bien conscient. Heureusement qu'on n'empêche pas les gens de donner leur avis et de débattre sur un sujet :wink: J'ai trouvé vos discussions très instructives même si je n'ai pas tout compris et il est clair que cela servira à d'autre...

Merci pour ce "débrief".

Je vais tester ça et je vous dirais ce qu'il en ait...

Bonne soirée à vous, merci pour votre aide :D

Mammouth du PHP | 985 Messages

13 sept. 2009, 20:20

Plaisir :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
AB
ViPHP | 5818 Messages

13 sept. 2009, 22:47

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).

humantarget
Invité n'ayant pas de compte PHPfrance

14 sept. 2009, 14:41

@ AB et Dr@ke : et bien, merci pour tout !

Merci pour votre aide, vos explications et ... votre patience.
Donc, c'est officiel : problème résolu =D>

Je vais continuer sur ma lancée. Mais croyez bien que je ne manquerais pas de revenir

Bonne continuation !

Mammouth du PHP | 985 Messages

14 sept. 2009, 14:54

Tant mieux et j'ai moi-même appris des choses grâce a ce Topic :wink:
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.