ivanmac
Messages postés25Date d'inscriptionmardi 3 mai 2005StatutMembreDernière intervention 6 octobre 2005
-
16 sept. 2005 à 11:16
ivanmac
Messages postés25Date d'inscriptionmardi 3 mai 2005StatutMembreDerniè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.
ivanmac
Messages postés25Date d'inscriptionmardi 3 mai 2005StatutMembreDerniè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" ?
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
ivanmac
Messages postés25Date d'inscriptionmardi 3 mai 2005StatutMembreDerniè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
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).
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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... ;-)
ivanmac
Messages postés25Date d'inscriptionmardi 3 mai 2005StatutMembreDerniè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 ?)
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 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 :)
ivanmac
Messages postés25Date d'inscriptionmardi 3 mai 2005StatutMembreDerniè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 ?
ivanmac
Messages postés25Date d'inscriptionmardi 3 mai 2005StatutMembreDerniè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'] ?
cs_Anthomicro
Messages postés9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 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 :-)
ivanmac
Messages postés25Date d'inscriptionmardi 3 mai 2005StatutMembreDerniè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.
cs_Anthomicro
Messages postés9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 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 :-)
ivanmac
Messages postés25Date d'inscriptionmardi 3 mai 2005StatutMembreDerniè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 ?
ivanmac
Messages postés25Date d'inscriptionmardi 3 mai 2005StatutMembreDerniè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 ?