perte de caractere @ dans un get
Le
Eric Stern
Bonsoir,
N'etant pas un developpeur chevroné, j'espere que vous excuserez la question
basique que je vais poser.
le contexte: wordpress chez OHV.
le probleme:
le caractere @ est systematiquement suprimé de $_GET['mail']
si je rentre @@@@ par exemple, $_GET['mail'] est vide.
je verrai bien un pb de secu mais je ne sais pas trop ou chercher.
un google php $_GET lost/perte @ me trouve plein de chose mais pas du php ;)
Merci
Eric
<form action="<?php bloginfo('wpurl');
?>/index.php/content/bulletin" method="get" name="maildata"><input
name="mail" type="text" size="15" maxlength="150" /><input name="ok"
type="submit" value="ok" /></form>
<?php $result = ($_GET['result']); ?>
<?php if ($result==merci) { ?>
<span><br />Votre adresse a bien été
enregistrée. Merci.</span>
<?php } elseif ($result==existe) { ?>
<span class="rouge"><br />Votre adresse a déjà
été enregistrée.</span>
<?php } elseif ($result==erreur) { ?>
<span class="rouge"><br />Erreur. Veuillez renseigner
à nouveau votre adresse.</span>
<?php } elseif ($result==0) { } ?>
<?php
if (isset($_GET['mail'])) {
$verif = $wpdb->query("SELECT * FROM maildata WHERE
adresse='".$_GET['mail']."'");
if ($verif ==0) {
$wpdb->query('INSERT INTO maildata (adresse) VALUES("'.$_GET['mail'].'")');
$TO = 'xxxxxxxxxxxxxxxxxxxx';
$limite = "_-=_parties_".md5(uniqid (rand()));
$subject = 'Nouvelle inscription au bulletin';
$text = 'Nouvelle inscription au bulletin à l\'adresse : '.$_GET['mail'];
$html = '<p>Nouvelle inscription au bulletin à l\'adresse :
<strong>'.$_GET['mail'].'</strong></p>';
$h = 'From: '.$TO."";
$h .= "X-Mailer: PHP";
$h .= "X-auth-smtp-user: ".$TO." ";
$h .= "X-abuse-contact: ".$TO." ";
$h .= "Date: ".date("D, j M Y G:i:s O")."";
$h .= "MIME-Version: 1.0";
$h .= "Content-Type: multipart/alternative; boundary=\"".$limite."\"";
$message = "";
$message .= "--".$limite."";
$message .= "Content-Type: text/plain";
$message .= "charset=\"iso-8859-1\"";
$message .= "Content-Transfer-Encoding: 8bit";
$message .= $text;
$message .= "--".$limite."";
$message .= "Content-Type: text/html; ";
$message .= "charset=\"iso-8859-1\"; ";
$message .= "Content-Transfer-Encoding: 8bit;";
$message .= $html;
$message .= "--".$limite."--";
mail($TO, $subject, $message, $h);
$TO2 = $_GET['mail'];
$text = 'Votre inscription a bien été prise en compte. Pour vous
désinscrire, veuillez vous rendre à cette adresse :
http://xxxxxxxxxxxxxxxxxx';
$html = '<p>Votre inscription a bien été prise en compte. Pour vous
désinscrire, veuillez vous rendre à cette adresse : <a
href="xxxxxxxxxxxxxxxxx</a></p>';
$subject = "Inscription .";
$h = 'From: '.$TO."";
$h .= "X-Mailer: PHP";
$h .= "X-auth-smtp-user: ".$TO." ";
$h .= "X-abuse-contact: ".$TO." ";
$h .= "Date: ".date("D, j M Y G:i:s O")."";
$h .= "MIME-Version: 1.0";
$h .= "Content-Type: multipart/alternative; boundary=\"".$limite."\"";
$message = "";
$message .= "--".$limite."";
$message .= "Content-Type: text/plain";
$message .= "charset=\"iso-8859-1\"";
$message .= "Content-Transfer-Encoding: 8bit";
$message .= $text;
$message .= "--".$limite."";
$message .= "Content-Type: text/html; ";
$message .= "charset=\"iso-8859-1\"; ";
$message .= "Content-Transfer-Encoding: 8bit;";
$message .= $html;
$message .= "--".$limite."--";
mail($TO2, $subject, $message, $h);
header('Location: http://xxxxxxxxxxxxx?result=merci');
}
elseif ($verif !==0) {
header('Location: http://xxxxxxxxxxxxxxxx?result=existe');
}}
else
{
header('Location: http://xxxxxxxxxxxxxx?result=erreur');
}
N'etant pas un developpeur chevroné, j'espere que vous excuserez la question
basique que je vais poser.
le contexte: wordpress chez OHV.
le probleme:
le caractere @ est systematiquement suprimé de $_GET['mail']
si je rentre @@@@ par exemple, $_GET['mail'] est vide.
je verrai bien un pb de secu mais je ne sais pas trop ou chercher.
un google php $_GET lost/perte @ me trouve plein de chose mais pas du php ;)
Merci
Eric
<form action="<?php bloginfo('wpurl');
?>/index.php/content/bulletin" method="get" name="maildata"><input
name="mail" type="text" size="15" maxlength="150" /><input name="ok"
type="submit" value="ok" /></form>
<?php $result = ($_GET['result']); ?>
<?php if ($result==merci) { ?>
<span><br />Votre adresse a bien été
enregistrée. Merci.</span>
<?php } elseif ($result==existe) { ?>
<span class="rouge"><br />Votre adresse a déjà
été enregistrée.</span>
<?php } elseif ($result==erreur) { ?>
<span class="rouge"><br />Erreur. Veuillez renseigner
à nouveau votre adresse.</span>
<?php } elseif ($result==0) { } ?>
<?php
if (isset($_GET['mail'])) {
$verif = $wpdb->query("SELECT * FROM maildata WHERE
adresse='".$_GET['mail']."'");
if ($verif ==0) {
$wpdb->query('INSERT INTO maildata (adresse) VALUES("'.$_GET['mail'].'")');
$TO = 'xxxxxxxxxxxxxxxxxxxx';
$limite = "_-=_parties_".md5(uniqid (rand()));
$subject = 'Nouvelle inscription au bulletin';
$text = 'Nouvelle inscription au bulletin à l\'adresse : '.$_GET['mail'];
$html = '<p>Nouvelle inscription au bulletin à l\'adresse :
<strong>'.$_GET['mail'].'</strong></p>';
$h = 'From: '.$TO."";
$h .= "X-Mailer: PHP";
$h .= "X-auth-smtp-user: ".$TO." ";
$h .= "X-abuse-contact: ".$TO." ";
$h .= "Date: ".date("D, j M Y G:i:s O")."";
$h .= "MIME-Version: 1.0";
$h .= "Content-Type: multipart/alternative; boundary=\"".$limite."\"";
$message = "";
$message .= "--".$limite."";
$message .= "Content-Type: text/plain";
$message .= "charset=\"iso-8859-1\"";
$message .= "Content-Transfer-Encoding: 8bit";
$message .= $text;
$message .= "--".$limite."";
$message .= "Content-Type: text/html; ";
$message .= "charset=\"iso-8859-1\"; ";
$message .= "Content-Transfer-Encoding: 8bit;";
$message .= $html;
$message .= "--".$limite."--";
mail($TO, $subject, $message, $h);
$TO2 = $_GET['mail'];
$text = 'Votre inscription a bien été prise en compte. Pour vous
désinscrire, veuillez vous rendre à cette adresse :
http://xxxxxxxxxxxxxxxxxx';
$html = '<p>Votre inscription a bien été prise en compte. Pour vous
désinscrire, veuillez vous rendre à cette adresse : <a
href="xxxxxxxxxxxxxxxxx</a></p>';
$subject = "Inscription .";
$h = 'From: '.$TO."";
$h .= "X-Mailer: PHP";
$h .= "X-auth-smtp-user: ".$TO." ";
$h .= "X-abuse-contact: ".$TO." ";
$h .= "Date: ".date("D, j M Y G:i:s O")."";
$h .= "MIME-Version: 1.0";
$h .= "Content-Type: multipart/alternative; boundary=\"".$limite."\"";
$message = "";
$message .= "--".$limite."";
$message .= "Content-Type: text/plain";
$message .= "charset=\"iso-8859-1\"";
$message .= "Content-Transfer-Encoding: 8bit";
$message .= $text;
$message .= "--".$limite."";
$message .= "Content-Type: text/html; ";
$message .= "charset=\"iso-8859-1\"; ";
$message .= "Content-Transfer-Encoding: 8bit;";
$message .= $html;
$message .= "--".$limite."--";
mail($TO2, $subject, $message, $h);
header('Location: http://xxxxxxxxxxxxx?result=merci');
}
elseif ($verif !==0) {
header('Location: http://xxxxxxxxxxxxxxxx?result=existe');
}}
else
{
header('Location: http://xxxxxxxxxxxxxx?result=erreur');
}

Poser une question


Perte d'un @ ? Vous seriez passé de @@@ à @@+ ?
--
Pierre Maurette
Le 21/01/2012 21:14, Eric Stern a écrit :
Oui, bien sûr.
Je ne connais pas wordpress, quant à OHV, dois-je supposer que c'est
OVH ?
Ça ne se produit pas si tu renommes le paramètre en autre chose que
'mail' ?
Si ça marche avec $_GET['zorglub'] et pas avec $_GET['mail'], alors
c'est sûrement une protection à la con chez l'hébergeur.
Bon, voyons le code.
Euh... « merci » c'est une constante définie par define("merci", ...) ?
Si oui, il est d'usage de mettre les constantes en majuscules. Mais si
comme je le suppose tu veux comparer avec la chaîne fixe « "merci" »,
c'est un bug dans ton code qui devrait générer une alerte de type
E_NOTICE.
Voir
Idem.
Le « class="rouge" », ce n'est pas une erreur de PHP, mais une mauvaise
conception HTML : une classe devrait définir une sémantique, pas une
apparence.
Euh... tu ne vérifies pas la valeur avant de passer une donnée
utilisateur à une requête de base de donnée ? Tu as déjà entendu
parler d'injection SQL ?
Voir
Idem.
ARRRRGHHH !!!
S'il te plaît, débranche *IMMÉDIATEMENT* ton site, il est probablement
déjà utilisé par des spammeurs pour envoyer des pubs pour le Viagra à
la terre entière !
Puis fais appel à un professionnel pour passer en revue tous tes scripts
ou pour les réécrire. Il te résoudra au passage ton problème de « @ »
qui ne passe pas.
Je suis sérieux. Merci de stopper le plus vite possible cette source de
spam involontaire (de ta part).
Cordialement,
--
Olivier Miakinen
Bonjour
je vais essayer.... comme c'est tombé en panne du jour au lendemain, je
pense aussi à une protection quelconque.
OK
OK
oui, j'ai supprimé la vérification pour être certain que ce n'était pas la
cause pendant les tests.
normallement, ya ça
if (isset($_GET['mail']) && preg_match("/^[w.-]+@[w.-]+.[a-z]{2,3}$/i",
$_GET['mail'])
est ce suffisant ?
Pas de panique, cette partie (l'envoi de courriel) n'y est plus depuis que
ça ne marche plus...
Evidemment,en relisant, je comprends le ARRRRGHHH !!!
je suppose que votre grande crainte est que le vilain pas beau soit maître
de $message ?
là ou le bât blesse,c'est que c'est un professionnel qui l'a écrit .........
mais à titre privé en bénévolat,s'agissant d'un site d'association.
mon seul boulot a été de tracer pourquoi ça ne marchait plus.
en virant tout les tests, (celle dont vous parliez contre le SQL INJECTION
et celle qui renvoie à merci),ça m'a permit de voir la disparition du @ dans
la base.
Merci
Eric (mais vraiment pas développeur web,qu'un peu en C des fois le WK)
Et pour les adresses en .museum ça donne quoi ?
--
Nous vivons dans un monde étrange/
http://foo.bar.quux.over-blog.com/
Ok. Je n'ai pas demandé, mais c'est bien $_GET['mail'] lui-même qui est
vide, et pas le résultat d'un traitement fait sur cette valeur ?
Ok.
Là, pour le coup, c'est trop restrictif : cela interdit par exemple
mon adresse om+ qui est valide. Voir la FAQ du forum
à
Par exemple le dernier :
preg_match('/^[.A-Za-z0-9+_-]+@[.A-Za-z0-9-]+$/', $_GET['mail'])
Le vilain pas beau n'a pas besoin de maîtriser $message pour envoyer
ce qu'il veut à qui il veut -- du moins c'était vrai dans certaines
versions de la fonction mail(), mais je crois que les sauts de lignes
sont maintenant filtrés.
Dans certaines versions de PHP, il suffisait de mettre dans $TO2 un truc
du genre :
", , ...,
Subject: mon joli spamn
Content-Type: multipart/alternative; boundary=trucn
n
--truc
Content-Type: text/htmln
n
Achetez mes jolis produits !n
n
--truc--n"
Avec ce seul paramètre, on peut choisir à la fois la liste des 1000
spammés, le sujet du spam, et son contenu.
Il vaudrait mieux faire un « echo $_GET['mail']; » et voir le code
source du HTML généré (ou mieux, l'envoyer comme text/plain par un
header() en début de script).
Cordialement,
--
Olivier Miakinen