Formulaire et sécurité

Résolu
ivanmac Messages postés 25 Date d'inscription mardi 3 mai 2005 Statut Membre Dernière intervention 6 octobre 2005 - 16 sept. 2005 à 11:16
ivanmac Messages postés 25 Date d'inscription mardi 3 mai 2005 Statut Membre Dernière intervention 6 octobre 2005 - 5 oct. 2005 à 15:56
Bonjour,

Depuis quelques temps un petit malin s'amuse avec le formulaire d'inscription à la newsletter d'un site dont je m'occupe. N'étant pas un expert en php (j'utilise la fonction mail pour recevoir les inscriptions), j'ai cherché à sécuriser un minimum le formulaire.

Voici son code avec le php qui traite les variables générées :

<form action= "sommaire.php3" method="post" name="news" OnSubmit="return(VerifForm(this))">
NEWSLETTER , les nouvelles par mail. Je m'inscris :




Oui

Non

</form>
<?php //Envoi newsletter
if (!empty($_POST['choix']) && !empty($_POST['monmail'])) {
$email2 ="webmaster@mondomaine.com";
$headers="From: ".$_POST['monmail'];
$titre="NEWSLETTER : ".$_POST['choix'];
$message="Demande pour la newsletter :\n";
$message.="- Choix : ".$_POST['choix']."\n" ;
$message.="- Adresse email : ".$_POST['monmail']."\n";
$message.="\n - Message envoyé par le site http://www.mondomaine.com -\n";
mail($email2,$titre,$message,$headers);
echo " -> envoyé !";
}
?>

J'utilise $_POST comme il est recommandé, pour ne pouvoir récupérer que les variables générées par le formulaire, et bien que mon hébergeur ait laissé les variables globales à ON.
En oubliant la vérification de l'adresse mail via javascript, je devrais recevoir que "oui" ou "non pour la variable "choix". Or, le petit malin arrive à mettre un peu ce qu'il veut dans ces variables, ainsi qu'à faire du bcc vers une adresse aol. C'est pas bien méchant mais j'aime pas trop ça.

Des idées pour blinder tout ça ?

29 réponses

FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
16 sept. 2005 à 11:23
Pourle bouton radio :

$choix ( $_POST['choix'] 'oui' ) ? 'oui' : 'non';

Ca force la variable à etre "oui" ou "non"... comme ca, pas de problème.



Pour le BCC, il faut que tu regardes au niveau de $_POST['monmail'].

Par exemple, utilise une expression régulière pour adresse e-mail, et
tu verras, t'auras beaucoup moins de problème par la suite :)
3
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
16 sept. 2005 à 19:41
Salut,



if(!eregi("([a-z]|[0-9]|\-\.)@([a-z]|[0-9]|\-\.)",$_POST['email']))

{

//email invalide

}



c'est une vérification basique, y'en a de bien plus élaborées, mais ça évitera les failles de ce côté au moins :-)

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li>
3
ivanmac Messages postés 25 Date d'inscription mardi 3 mai 2005 Statut Membre Dernière intervention 6 octobre 2005
16 sept. 2005 à 12:11
Tu veux dire que j'utilise
$choix ( $_POST['choix'] 'oui' ) ? 'oui' : 'non';
au début du traitement php pour forcer la variable à ne prendre que ces valeurs là ou bien à la place du "if" ?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
16 sept. 2005 à 12:29
Mets le dans le bloc de ton if () (donc dans le traitement php). Ainsi,
en effet, si le choix est égal à autre chose que 'oui', il sera mis à
non par défaut.

Tu peux aussi sortir du traitement, si le choix est différent de oui ou de non, et logger une erreur.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ivanmac Messages postés 25 Date d'inscription mardi 3 mai 2005 Statut Membre Dernière intervention 6 octobre 2005
16 sept. 2005 à 12:52
Merci pour l'explication. Ce qui m'intéresse c'est qu'on ne puisse pas mettre autre chose que ce qui est prévu :
- Pour $choix : oui ou non.
- Pour $monmail : un email (dont je valide le @ et le . en javascript), donc ça peut être n'importe quoi dans la limite du champ (50 caractères).

Les logs que je récupère me prouve que ce n'est pas blindé car mon petit malin arrive également à faire passer du html (avec pas grand chose dedans jusqu'à présent) dans $monmail.

Un exemple de log que je récupère avec du php (mondomaine.com remplace le nom du site):

16/09/2005 02:40:32 ;
// la première parenthèse montre le contenu de $monmail)
(tduzwsqkxe@mondomaine.com
Content-Type: multipart/mixed; boundary="===============1629525477=="
MIME-Version: 1.0
Subject: bde4ce20
To: tduzwsqkxe@mondomaine.com
bcc: mhkoch321@aol.com
From: tduzwsqkxe@mondomaine.com

This is a multi-part message in MIME format.

--===============1629525477==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

mgplvm
--===============1629525477==--
);
// la deuxième parenthèse montre le contenu de $choix)
(tduzwsqkxe@mondomaine.com); 66.199.163.xxx(66.199.163.xxx) ; ; ; /

Je n'ai aucune info sur l'environnement (navigateur et plate-forme).
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
16 sept. 2005 à 13:04
Normal...



plusieurs choses :

- dans ton if (), teste aussi le submit de ton formulaire

- le principe de sécurisation n'est pas tant d'empêcher un utilisateur
malveillant d'essayer de te hacker...mais d'empêcher que ses tentatives
soient couronnées de succès. Il enverra toujours ce qu'il veut dans tes
$_POST...ton but à toi est de vérifier que tes $_POST contiennent bien
les valeurs que tu attends, et pas d'autres. Là, il est bloqué. ON se
fiche qu'il ait réussi à t'envoyer toto ou tata...toi, tu n'acceptes
que oui ou non.

- ne teste pas tes emails en javascript...pour 2 raisons : c'est moins
efficace qu'une expression régulière côté serveur, et ...il suffit de
désactiver le javascript au moment de la saisie pour que ta "sécurité"
soit anéantie. Le javascript doit rester un confort optionnel! Il doit
se cantonner à ça. Jamais, Ô grand jamais, il ne faut l'utiliser dans
une optique de sécurisation. C'est voué à l'échec. Et c'est le B-A BA
de tout hacker que d'éviter les sécurisations javascript.

- mettre, toujours, toutes les vérifications possibles et imaginables.
Enfin, un maximum, en tous cas. Teste le domaine du mail. Passe l'email
aux expressions régulières. Pense aux addslashes. Pense à tout... ;-)
0
ivanmac Messages postés 25 Date d'inscription mardi 3 mai 2005 Statut Membre Dernière intervention 6 octobre 2005
16 sept. 2005 à 13:12
En fait je mentionnais juste le javascript comme option de confort, tout à fait, pour les utilisateurs distraits, pas dans un but de sécurisation.

Ce site est très modeste ; je souhaite juste éviter que le serveur envoie des mails à tout va pour rien. Mais bon, comme mes connaissances sont limitées en php, j'apprends petit à petit.

- Pour tester la saisie d'une adresse mail en php, je vais trouver ça.
- Pour tester le submit, on fait comment en gros (cad tester qu'il a bien cliqué sur le bouton ?)
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
16 sept. 2005 à 13:21
if (!empty($_POST['choix']) && !empty($_POST['monmail'])) {

Bah comme ca par exemple. Quand tu cliques sur ton bouton "envoyer", tu
as une variable superglobal qui contient toute ta liste de champs ainsi
que les valeurs que l'utilisateur a rentrées dedand.



Donc tu testes via un if ( isset($_POST['un_champ_au_hasard']) ) pour savoir si le formulaire a été soumis où non :)
0
ivanmac Messages postés 25 Date d'inscription mardi 3 mai 2005 Statut Membre Dernière intervention 6 octobre 2005
16 sept. 2005 à 16:12
Si je comprends bien la fonction isset teste si la variable testée est renseignée par le bouton de validation. Ça ne garantie pas que le champ est renseigné, juste qu'il est renseigné par le bouton de validation ?
Donc je pourrais faire quelque chose comme ça ?

$choix=( $_POST['choix']==='oui' )?'oui' : 'non';
$monmail=$_POST['monmail'];
if (isset($monmail) && !empty($choix) && !empty($monmail)) {
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
16 sept. 2005 à 23:15
"$monmail=$_POST['monmail'];"

Non, car tu peux avoir une erreur avec une variable de type null :/ (ca m'est déja arrivé).

Teste d'abord ta variable dans $_POST AVANT de la mettre dans une variable différente.

Ca t'évitera de créer 40000 variables pour rien :)
0
ivanmac Messages postés 25 Date d'inscription mardi 3 mai 2005 Statut Membre Dernière intervention 6 octobre 2005
17 sept. 2005 à 01:14
Hello,
Grâce à votre aide, j'ai pu améliorer le traitement de mon petit formulaire.
Il me reste deux questions pour mieux comprendre :

1) Comme suggéré par Fhx, est-ce que if ( isset($_POST['un_champ_au_hasard']) ) ne sert qu'à contrôler que la valeur du champ a bien été généré par le bouton submit et lui seul ?

2) Toujours Fhx, tu me disais "Pour le BCC, il faut que tu regardes au niveau de $_POST['monmail']"
Mais ajouter un BCC veut dire ajouter des infos aux headers. Quelle est la meilleure vérification pour m'assurer que mes headers ne contiennent que le From: ".$_POST['monmail'] ?

Merci à vous :o)
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
17 sept. 2005 à 09:46
"Comme suggéré par Fhx, est-ce que if (
isset($_POST['un_champ_au_hasard']) ) ne sert qu'à contrôler que la
valeur du champ a bien été généré par le bouton submit et lui seul ?"



Non, ça te permet de voir que ton champ "un_champ_au_hasard" faisait partie du formulaire envoyé :-)



"Mais ajouter un BCC veut dire ajouter des infos aux headers. Quelle
est la meilleure vérification pour m'assurer que mes headers ne
contiennent que le From: ".$_POST['monmail'] ?"



bah il faut s'assurer que le mail est valide d'où l'expression régulière que je t'ai proposée plus haut :-)


<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li>
0
ivanmac Messages postés 25 Date d'inscription mardi 3 mai 2005 Statut Membre Dernière intervention 6 octobre 2005
17 sept. 2005 à 10:03
Ok, donc :
- d'une part l'utilisation de $_POST['monchamp'] m'assure de ne traiter que les variables envoyées par le formulaire (et non dans l'url par exemple)
- d'autre part tester avec (isset($_POST['monchamp']) fait partie du formulaire envoyé. Sous entendu, sans ça on peut quand même envoyer un champ par d'autres moyens, même en ne récupérant que des variables $_POST ?

Pour l'expression régulière qui vérifie le mail, merci, ça marche bien et si je comprends bien, l'ajout du BCC a dû se faire en mettant dans le champ monmail : toto@toto.com, bcc:test@toto.com, ce qu'empêche la vérification.
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
17 sept. 2005 à 10:10
"d'une part l'utilisation de $_POST['monchamp'] m'assure de ne traiter
que les variables envoyées par le formulaire (et non dans l'url par
exemple)"



oui


"d'autre part tester avec (isset($_POST['monchamp']) fait partie du
formulaire envoyé. Sous entendu, sans ça on peut quand même envoyer un
champ par d'autres moyens, même en ne récupérant que des variables
$_POST ?"



heu oui on peut envoyer un champ par d'autres moyens, d'ailleurs ma
dernière source sur qmail admin permet de faire ça, je simule l'envoi
de données en post via un formulaire :-)



<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li>
0
ivanmac Messages postés 25 Date d'inscription mardi 3 mai 2005 Statut Membre Dernière intervention 6 octobre 2005
18 sept. 2005 à 10:25
Rebonjour, suite de mes aventures, puisque quelqu'un arrive toujours à envoyer du html pour le champ "monmail" et son adresse mail pour le champ "choix", un bcc et d'autres choses?
Voici mon code php actuellement :

<?php
//Envoi newsletter

$_POST['choix']=( $_POST['choix']==='oui' )?'oui' : 'non';
if (isset($_POST['monmail'])) {
if (!empty($_POST['monmail'])) {
if(eregi("([a-z]|[0-9]|\-\.)@([a-z]|[0-9]|\-\.)",$_POST['monmail']))
{
$email2="webmaster@ mondomaine.com";
$headers="From: ".$_POST['monmail'];
$titre="NEWSLETTER : ".$_POST['choix'];
$message="Demande pour la newsletter :\n";
$message.="- Choix : ".$_POST['choix']."\n" ;
$message.="- Adresse email : ".$_POST['monmail']."\n";
$message.="\n - Message envoyé par le site http://www. mondomaine.com -\n";
mail($email2,$titre,$message,$headers);
echo "Votre demande a été envoyée avec succès !";
} else echo "Merci d'indiquer une adresse email valide.";
} else echo "Il manque des informations pour pouvoir traiter votre demande.";
} else echo "Demande non traitée.";
?>

Que puis-je faire pour éviter que mon formulaire soit détourné de son utilisation prévue ?
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
18 sept. 2005 à 19:15
t'es sûr que ça vient de ce formulaire ?

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li>
0
ivanmac Messages postés 25 Date d'inscription mardi 3 mai 2005 Statut Membre Dernière intervention 6 octobre 2005
19 sept. 2005 à 00:50
Hello,
Je pense que la fonction mail est bien appelée par mon script php puisque je retrouve le texte (hors variables) que j'ai prévu de mettre dans le mail qui est envoyé. Maintenant, les variables ne proviennent peut-être pas du formulaire lui-même. En fait j'en sais rien.

D'ailleurs, le log de d'utilisation du formulaire ne fournissant pas de nom de navigateur comme c'est le cas normalement, je me demande si c'est pas une machine directeur qui attaque le script.

Tu veux dire que d'après mon code, ça ne devrait pas trop arriver ?
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
19 sept. 2005 à 18:56
"Tu veux dire que d'après mon code, ça ne devrait pas trop arriver ?"



exact

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li>
0
ivanmac Messages postés 25 Date d'inscription mardi 3 mai 2005 Statut Membre Dernière intervention 6 octobre 2005
19 sept. 2005 à 19:25
Alors c'est assez mystérieux tout ça.
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
19 sept. 2005 à 19:39
C'est mal codé de toute facon. On écrit jamais dans $_POST, on écrit dans une variable de tout ce qu'il ya de plus normale :)



"<?php



if (isset($_POST['monmail'])&& !empty($_POST['monmail']) ) {

if(eregi("([a-z]|[0-9]|\-\.)@([a-z]|[0-9]|\-\.)",$_POST['monmail'])) {



$choix ( $_POST['choix'] 'oui' )? 'oui' : 'non';

$email2="webmaster@mondomaine.com";

$headers="From: ".$_POST['monmail'];



$titre="NEWSLETTER : ".$choix;

$message="Demande pour la newsletter :\n";

$message.="- Choix : ".$choix."\n" ;

$message.="- Adresse email : ".$_POST['monmail']."\n";

$message.="\n - Message envoyé par le site http://www. mondomaine.com -\n";

if ( mail($email2,$titre,$message,$headers) ) {

echo "Votre demande a été envoyée avec succès
!";

} else echo "Merci d'indiquer une adresse email valide.";

}



} else echo "Il manque des informations pour pouvoir traiter votre demande.";

}



} else {

echo "Erreur de je sais plus quoi";

}

?>"



Mais c'est pas normal, devrait pas y avoir d'erreur normalement...
0
Rejoignez-nous