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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : accents et caractères spéciaux ne s'affichent

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

par Dr@ke » 14 sept. 2009, 14:54

Tant mieux et j'ai moi-même appris des choses grâce a ce Topic :wink:

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

par humantarget » 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 !

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

par AB » 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).

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

par Dr@ke » 13 sept. 2009, 20:20

Plaisir :wink:

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

par humantarget » 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

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

par Dr@ke » 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.

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

par humantarget » 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 !!!!

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

par Dr@ke » 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:

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

par FuZZyLine » 12 sept. 2009, 09:13

Salut les gens,

@AB: Les préconisations dont tu parles sont interressantes. Te serait-il possible d'en faire un résumé
et le rendre disponible en section Faq ou contributions... voir un exemple les regroupants ?. Le sujet,
à mon avis, s'y prête assez bien.

Le topic, malheureusement, tourne un peu en rond. Les méthodes (les fonctions) que tu exposes,
bien qu'évidentes, se diluent dans le discour, contradictoire, d'un autre.

Si ca t'es possible, je pense que ca en ravirait d'autres que moi ;)

@+ bon code ;)

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

par Dr@ke » 12 sept. 2009, 00:45

sur php tu as de grooosses lacunes qu'il te sera d'autant plus long à combler que tu réponds du tac au tac sans connaître les subtilités du langage.
Avant de savoir encore faut-il apprendre. Après peut-être tu pourras m'expliquer :)
T'as du oublier un ou deux o à grosses lacunes :D


C'est l'ajout des caractères chr(13) et chr(10) dans un Post qui pose problème et donc la syntaxe de \r et \n fonctionne mais prête largement à confusion surtout dans ce cas précis...
D'où l'illogisme qui s'en dégage...
Car les caractères \r et \n, comme le démontre mon script, ne sont pas interprétés au moment du Post mais seulement à l'affichage des données.

Donc les saut de lignes dans les textarea... dont tu parles, n'ont rien avoir avec \r et \n.
"\r" et "\n" dans un str_replace sont juste un moyen de les détecter...
Ceux-ci sont d'ailleurs très souvent insérés en clair dans les headers des mails...

Je pense que dans les notions en Php ,dont tu parles, on peut souligner l'importance de l'utilisation de la bonne syntaxe.
Et encore plus en développement...
Je pense aussi que mon code était plus que correct pour détecter des \r et \n en clair.
Et pour les chr(13) et chr(10), avec cette syntaxe, maintenant oui je suis d'accord :wink:

La bonne syntaxe:
function Verif_magicquotes ($chaine)
{
if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);
return $chaine;
}

$regex_array = array(chr(13).chr(10), chr(10), chr(13));

$nom = trim(Verif_magicquotes(str_replace($regex_array, '', $_POST['nom'])));
$email = trim(Verif_magicquotes(str_replace($regex_array, '', $_POST['email'])));
$sujet = trim(Verif_magicquotes($_POST['sujet']));
$message = trim(Verif_magicquotes($_POST['message']));

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

par AB » 11 sept. 2009, 23:52

Bon tu as l'air de t'énerver, mais maintenant je prend un peu de temps pour tester...
Il est logique d'utiliser les simples guillemets, prend un peu de distance...
J'ai essayé de t'expliquer mais bon...
Bien c'est pas compliqué -> Démonstration:
<?php
header('Content-Type: text/html; charset=UTF-8');
$text = $_POST['envoye'];
$regex_array = array('\r\n', '\n', '\r');
$regex_array2 = array("\r\n", "\n", "\r");
$nom = $text;
$nom2 = trim(str_replace($regex_array2, '', $text));
$nom3 = trim(str_replace($regex_array, '', $text));
if (isset($_POST['envoye'])) {
echo 'en clair: ';
var_dump($nom);
echo 'ta methode: ';
var_dump($nom2);
echo 'la mienne: ';
var_dump($nom3);
}
?>
<form action="#" method="post">
<table summary="Free IP INFO">
<tr>
<td><input type="radio" name="envoye" value='ggg\r\ncxc' onclick="submit();" /><b>Ok</b>&nbsp;</td>
</tr>
</table>
</form>
Tu véras que ce qui est reçue au moment du Post est en clair, et non exécuté, un conseil met à jour tous tes formulaires mails :wink:
Car ta méthode avec les doubles guillemets ne sert a rien du tout...

[EDIT]
Oups j'oubliais: non met :tir2:
:wink:

[EDIT2]
Ryle et Zeus m'avaient fais un super Topo sur les guillemets, ce n'est pas pour rien :wink:
Ryle et Zeus ne t'ont pas tout dis...

Bon je t'en dirai plus demain, mais si tes formulaires d'envoi de mail sont comme ce que tu préconises, tu as du souci à te faire. Au passage as-tu lu mon lien qui expliquait cela dans le détail ?

Sinon mes smiles sont sur le ton de la plaisanterie. Cela m'amuse assez que tu m'explique des choses sans avoir compris le fond du problème (idem que pour htmlentities avec l'UTF-8).

Je ne remet pas en cause ton niveau de programmation général, mais sur php tu as de grooosses lacunes qu'il te sera d'autant plus long à combler que tu réponds du tac au tac sans connaître les subtilités du langage.

Et puis quand bien même on indiquerait une chaine de caractères entre double quote alors qu'elle pourrait être entre simples quotes, cela ne nécessite pas pour autant une mise à jour du code puisqu'on obtient le même résultat. Les optimisations ne se situes pas à ce niveau là.

Par contre dans le sujet dont nous parlons, les doubles quotes sont indispensables avec un str_replace sur les \n et \r , sinon cela ne remplace rien.

Ton test n'est pas valide car non adapté à ce qu'il faut tester.

Pour faire quelque chose de correct il faut que tu testes avec un champ textarea dans lequel tu inséreras des retours lignes.
Ensuite tu appliques tes différentes fonctions pour supprimer les retours lignes et tu testes le résultat avec par exemple :
if (strpos($variable, "\n") !== false) echo '\n trouvé';
Je ne m'énerve pas, mais bon niveau "distance" comme tu dis... justement tu n'a pas assez de recul ou de connaissances suffisantes pour pouvoir parler de php sans réfléchir un peu plus que maintenant :wink:

Tu crois réellement que pour pirater un formulaire d'envoi de mail il suffit d'écrire des \r ou \n dans le champ de saisie ? Ben ça prouve que tu n'as pas lu le lien que je t'ai donné dans mon précédent post.

Avant de savoir encore faut-il apprendre. Après peut-être tu pourras m'expliquer :)

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

par Dr@ke » 11 sept. 2009, 22:02

Bon tu as l'air de t'énerver, mais maintenant je prend un peu de temps pour tester...
Il est logique d'utiliser les simples guillemets, prend un peu de distance...
J'ai essayé de t'expliquer mais bon...
Bien c'est pas compliqué -> Démonstration:
<?php
header('Content-Type: text/html; charset=UTF-8');
$text = $_POST['envoye'];
$regex_array = array('\r\n', '\n', '\r');
$regex_array2 = array("\r\n", "\n", "\r");
$nom = $text;
$nom2 = trim(str_replace($regex_array2, '', $text));
$nom3 = trim(str_replace($regex_array, '', $text));
if (isset($_POST['envoye'])) {
echo 'en clair: ';
var_dump($nom);
echo 'ta methode: ';
var_dump($nom2);
echo 'la mienne: ';
var_dump($nom3);
}
?>
<form action="#" method="post">
<table summary="Free IP INFO">
<tr>
<td><input type="radio" name="envoye" value='ggg\r\ncxc' onclick="submit();" /><b>Ok</b>&nbsp;</td>
</tr>
</table>
</form>
Tu véras que ce qui est reçue au moment du Post est en clair, et non exécuté, un conseil met à jour tous tes formulaires mails :wink:
Car ta méthode avec les doubles guillemets ne sert a rien du tout...

[EDIT]
Oups j'oubliais: non met :tir2:
:wink:

[EDIT2]
Ryle et Zeus m'avaient fais un super Topo sur les guillemets, ce n'est pas pour rien :wink:

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

par AB » 11 sept. 2009, 21:16

function Verif_magicquotes ($chaine)
{
if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);
return $chaine;
}

$regex_array = array('\r\n', '\n', '\r');

$nom = trim(Verif_magicquotes(str_replace($regex_array, '', $_POST['nom'])));
$email = trim(Verif_magicquotes(str_replace($regex_array, '', $_POST['email'])));
$sujet = trim(Verif_magicquotes($_POST['sujet']));
$message = trim(Verif_magicquotes($_POST['message']));
Ca fonctionne beaucoup mieux maintenant... :)

Ps: m'apprendra a ne pas tester...
ça fonctionne moyen voir pas pour ce qui est de la protection des injections de retours lignes :twisted:
Il faudrait écrire
$regex_array = array("\r\n", "\n", "\r");
pour les mêmes raisons que j'écrivais avec des doubles quotes
function Protege_header($value)
                {
                        $value = str_replace("\n", "", str_replace("\r", "", $value));
                        return $value;
                }
Relis ce que j'en disais plus haut :axe:
Une doc complémentaire ici

Donc je remet mon code initial (qui était plus lisible) avec la fonction trim et Verif_magicquotes
(cela dit ton code avec regex array est également bon pour peu que tu mette les éléments de ton tableau entre double quote)
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']));
Et puis réfléchis à deux fois avant de me dire (comme dans le post que tu as supprimé) que la fonction stripslashes va supprimer les \ des caractères invisibles de retour ligne "\n" ou "\r" sinon :tir2: :lol:

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

par Dr@ke » 11 sept. 2009, 19:54

function Verif_magicquotes ($chaine)
{
if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);
return $chaine;
}

$regex_array = array('\r\n', '\n', '\r');

$nom = trim(Verif_magicquotes(str_replace($regex_array, '', $_POST['nom'])));
$email = trim(Verif_magicquotes(str_replace($regex_array, '', $_POST['email'])));
$sujet = trim(Verif_magicquotes($_POST['sujet']));
$message = trim(Verif_magicquotes($_POST['message']));
Ca fonctionne beaucoup mieux maintenant... :)

Ps: m'apprendra a ne pas tester...

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

par AB » 11 sept. 2009, 19:22

@Dr@ke C'est aussi bien que tu aies supprimé ton dernier message :axe: :)