Nabiot Posté 17 Juin 2008 Posté 17 Juin 2008 Bonjour, Je dispose d'un code php me permetttant d'envoyer par email les informations remplies par nos visiteurs sur un formulaire en html. L'envoi des informations se fait grace a la page action.php dont le code est le suivant : CODE <?php $idFormulaire = '-- WEBSITE -- ENG --'; //objet du mail $to = 'webmaster_AT_domaine.com'; //destinataires du mail $location = 'formulaire.htm'; //page de reroutage page pour remerciement $body = "CONTENT: \n\n"; foreach ($_POST as $variable => $value) { $body .= $variable . ' -> ' . $value . "\n\n"; } $body .= "\nEND\n\n Date - " . strftime("%c") . "\n"; $subject = $idFormulaire; $headers = "From: WEBSITE"; _AT_mail($to, $subject, $body, $headers); header('location: ' . $location); foreach($bad_strings as $bad_string) { if(eregi($bad_string, strtolower($str_to_test))) { echo "$bad_string found. Suspected injection attempt - mail not being sent."; exit; } } function contains_newlines($str_to_test) { if(preg_match("/(%0A|%0D|\\n+|\\r+)/i", $str_to_test) != 0) { echo "newline found in $str_to_test. Suspected injection attempt - mail not being sent."; exit; } } ?> voici une partie du code html : <form method="POST" action="action.php" name="info" onSubmit="MM_validateForm('contact','','R','phone','','NisNum','email','','RisEmail','company','','R');return document.MM_returnValue"> <input type="hidden" name="TYPE" value="INFO">....<td width="377" valign="baseline"><input type="radio" name="salutation" value="Mr">...<input type="text" name="phone" size="30" maxlength="30" > Le probleme est que parfois, le formulaire est envoye vide. lorsque je recoit le mail, les informations du formulaire y sont absentes. Voici un email "vide" type : CONTENT: END Date - 05/16/08 21:06:41 Avez une idee sur l'origine du probleme ? Un debut de reponse ? Une piste a suivre ? Si vous en avez, n'hesitez a m'en faire part svp parce que je ne sais pas du tout d'ou ca peut provenir. Merci d'avance et desole pour le manque d'accent... je ne les ai pas trouves sur les qwerty Nabiot
Dadou Posté 17 Juin 2008 Posté 17 Juin 2008 tous simplement arce que le bouton envoyé est cliqué sans remplir quoique ce soit, aucuns champ n'est obligatoire
Nabiot Posté 17 Juin 2008 Auteur Posté 17 Juin 2008 Hum non desole, trop facile ! 3 champs sont obligatoires. Voici le mail recu qd on remplit juste ces 3 champs : CONTENT: TYPE -> INFOcontact -> Guillaumetitle -> phone -> email -> me_AT_ou.comcompany -> One More testCountry -> -Select your country-remarks -> Submit -> SubmitEND Date - 06/17/08 06:42:15 Les tests pour verifier que les champs sont corrects sont effectue par ce script sur la page formulaire.htm : CODE <script type="text/JavaScript"><!-- function MM_findObj(n, d) { //v4.01 var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) { d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[n]; for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers.document); if(!x && d.getElementById) x=d.getElementById(n); return x; } function MM_validateForm() { //v4.0 var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments; for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=MM_findObj(args); if (val) { nm=val.name; if ((val=val.value)!="") { if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@'); if (p<1 || p==(val.length-1)) errors+='- '+nm+' must contain an e-mail address.\n'; } else if (test!='R') { num = parseFloat(val); if (isNaN(val)) errors+='- '+nm+' must contain a number.\n'; if (test.indexOf('inRange') != -1) { p=test.indexOf(':'); min=test.substring(8,p); max=test.substring(p+1); if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.\n'; } } } else if (test.charAt(0) == 'R') errors += '- '+nm+' is required.\n'; } } if (errors) alert('The following error(s) occurred:\n'+errors); document.MM_returnValue = (errors == ''); } function MM_showHideLayers() { //v9.0 var i,p,v,obj,args=MM_showHideLayers.arguments; for (i=0; i<(args.length-2); i+=3) with (document) if (getElementById && ((obj=getElementById(args))!=null)) { v=args[i+2]; if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v=='hide')?'hidden':v; } obj.visibility=v; } } //--> </script> desole pour le manque de precisions du premier post. je ne sais ce qu'il faut comme renseignements supplementaires
Nabiot Posté 17 Juin 2008 Auteur Posté 17 Juin 2008 je reprecise cela dit que les formulaires qui me sont envoyes par ce biais fonctionnent bien la plupart du temps, mais environ un tiers des formulaires arrivent vides, ce qui est assez penalisant pour un site professionnel ayant pour but d'attirer des contacts... Est ce du a une certaine configuration au niveau du visiteur du site ? Mes tests en local fonctionnent bien, mais je recois de tps en tps des prises de contacts vides des visiteurs du sites...
iNCiTE Web Posté 17 Juin 2008 Posté 17 Juin 2008 C'est un test en Javascript, donc un robot spammeur ou autre ne passe pas par ce test (de même qu'un internaute qui l'aurait désactivé). Il faut tester si les champs sont remplis en PHP, dans la page suivante. Il y a des vestiges ($bad_string par exemple), mais comme on a pas le code complet on en sait pas d'où vient le problème...
Nabiot Posté 17 Juin 2008 Auteur Posté 17 Juin 2008 voici les codes complets : Pour le formulaire.htm CODE #####La partie scripts dans le <head> <script type="text/JavaScript"> <!-- function MM_findObj(n, d) { //v4.01 var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) { d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[n]; for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers.document); if(!x && d.getElementById) x=d.getElementById(n); return x; } function MM_validateForm() { //v4.0 var i,p,q,nm,test,num,min,max,errors='',args=MM_validateForm.arguments; for (i=0; i<(args.length-2); i+=3) { test=args[i+2]; val=MM_findObj(args); if (val) { nm=val.name; if ((val=val.value)!="") { if (test.indexOf('isEmail')!=-1) { p=val.indexOf('@'); if (p<1 || p==(val.length-1)) errors+='- '+nm+' must contain an e-mail address.\n'; } else if (test!='R') { num = parseFloat(val); if (isNaN(val)) errors+='- '+nm+' must contain a number.\n'; if (test.indexOf('inRange') != -1) { p=test.indexOf(':'); min=test.substring(8,p); max=test.substring(p+1); if (num<min || max<num) errors+='- '+nm+' must contain a number between '+min+' and '+max+'.\n'; } } } else if (test.charAt(0) == 'R') errors += '- '+nm+' is required.\n'; } } if (errors) alert('The following error(s) occurred:\n'+errors); document.MM_returnValue = (errors == ''); } function MM_showHideLayers() { //v9.0 var i,p,v,obj,args=MM_showHideLayers.arguments; for (i=0; i<(args.length-2); i+=3) with (document) if (getElementById && ((obj=getElementById(args))!=null)) { v=args[i+2]; if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v=='hide')?'hidden':v; } obj.visibility=v; } } //--> </script> <script src="../quality_control_assembling_china/scripts/AC_RunActiveContent.js" type="text/javascript"></script #####la partie formulaire <td valign="top"><form method="POST" action="action.php" name="info" onSubmit="MM_validateForm('contact','','R','phone','', 'NisNum','email','','RisEmail','company','','R'); return document.MM_returnValue"> <input type="hidden" name="TYPE" value="INFO"> <table width="480" border="0" cellpadding="3" cellspacing="0" class="fonts01"> <tr> <tr> <td> </td> </tr> <tr> <td><strong>Would you like us to call you ?</strong> Clic here for an <a href="call.htm" class="link07"> <strong>IMMEDIATE CALL REQUEST</strong></a></td> </tr> <tr> <td> </td> </tr> <td colspan="2" valign="top"><table width="480" border="0" cellpadding="3" cellspacing="1"> Please complete the form below and we will answer you <strong>as soon as possible.</strong> <br> <i>* denotes required information.</i> <tr> <td> </td> </tr> <tr> <td width="92" align="right">Salutation</td> <td width="377" valign="baseline"><input type="radio" name="salutation" value="Mr"> Mr. <input type="radio" name="Salutation" value="Ms"> Ms. <input type="radio" name="Salutation" value="Mrs" > Mrs. </td> </tr> <tr> <td align="right"><span class="formFont02"><strong>*</strong></span>Name</td> <td valign="baseline"><input type="text" name="contact" size="30" maxlength="50"></td> </tr> <tr> <td align="right">Job Title</td> <td valign="baseline"><input type="text" name="title" size="30" maxlength="30" ></td> </td> </tr> <tr> <td align="right">Telephone</td> <td valign="baseline"><input type="text" name="phone" size="30" maxlength="30" ></td> </tr> <tr> <td align="right"><span class="formFont02"><strong>*</strong></span>E-mail</td> <td valign="baseline"><input type="text" name="email" size="30" maxlength="60" ></td> </tr> <tr> <td colspan="2" valign="top"><table width="480" border="0" cellpadding="3" cellspacing="1"> <tr> <td width="92" align="right"><span class="formFont02"><strong>*</strong></span>Company</td> <td width="377" valign="baseline"><input type="text" name="company" size="30" maxlength="50" ></td> </tr> <tr> <td align="right"><span class="formFont02"></span>Country</td> <td valign="baseline"><select name="Country" class="fonts01"> <option selected="selected">-Select your country- </option> <option value="Afghanistan">Afghanistan</option> ... <option value="Zimbabwe">Zimbabwe </option> </select></td> </tr> <tr> <td align="right"><span class="formFont02"></span>Message</td> <td valign="top"> <div valign="left"> <textarea name="remarks" wrap="VIRTUAL" cols="40" rows="5"></textarea> </div> </td> </tr> <tr> <td colspan="2" align="center" valign="top"><input name="Submit" type="submit" id="Submit" value="Submit" > <input name="Reset" type="reset" id="Reset" value="Reset" ></td> </tr> </table></td> </tr> </table></table></td> </form></td> Je vous rassure ####xxx sont des commentaires que je viens de rajouter sur le post... Voici le AC_RunActiveContent.js CODE //v1.0//Copyright 2006 Adobe Systems, Inc. All rights reserved. function AC_AddExtension(src, ext) { if (src.indexOf('?') != -1) return src.replace(/\?/, ext+'?'); else return src + ext; } function AC_Generateobj(objAttrs, params, embedAttrs) { var str = '<object '; for (var i in objAttrs) str += i + '="' + objAttrs + '" '; str += '>'; for (var i in params) str += '<param name="' + i + '" value="' + params + '" /> '; str += '<embed '; for (var i in embedAttrs) str += i + '="' + embedAttrs + '" '; str += ' ></embed></object>'; document.write(str); } function AC_FL_RunContent(){ var ret = AC_GetArgs ( arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" , "application/x-shockwave-flash" ); AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs); } function AC_SW_RunContent(){ var ret = AC_GetArgs ( arguments, ".dcr", "src", "clsid:166B1BCA-3F9C-11CF-8075-444553540000" , null ); AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs); } function AC_GetArgs(args, ext, srcParamName, classid, mimeType){ var ret = new Object(); ret.embedAttrs = new Object(); ret.params = new Object(); ret.objAttrs = new Object(); for (var i=0; i < args.length; i=i+2){ var currArg = args.toLowerCase(); switch (currArg){ case "classid": break; case "pluginspage": ret.embedAttrs[args] = args[i+1]; break; case "src": case "movie": args[i+1] = AC_AddExtension(args[i+1], ext); ret.embedAttrs["src"] = args[i+1]; ret.params[srcParamName] = args[i+1]; break; case "onafterupdate": case "onbeforeupdate": case "onblur": case "oncellchange": case "onclick": case "ondblClick": case "ondrag": case "ondragend": case "ondragenter": case "ondragleave": case "ondragover": case "ondrop": case "onfinish": case "onfocus": case "onhelp": case "onmousedown": case "onmouseup": case "onmouseover": case "onmousemove": case "onmouseout": case "onkeypress": case "onkeydown": case "onkeyup": case "onload": case "onlosecapture": case "onpropertychange": case "onreadystatechange": case "onrowsdelete": case "onrowenter": case "onrowexit": case "onrowsinserted": case "onstart": case "onscroll": case "onbeforeeditfocus": case "onactivate": case "onbeforedeactivate": case "ondeactivate": case "type": case "codebase": ret.objAttrs[args] = args[i+1]; break; case "width": case "height": case "align": case "vspace": case "hspace": case "class": case "title": case "accesskey": case "name": case "id": case "tabindex": ret.embedAttrs[args] = ret.objAttrs[args] = args[i+1]; break; default: ret.embedAttrs[args] = ret.params[args] = args[i+1]; } } ret.objAttrs["classid"] = classid; if (mimeType) ret.embedAttrs["type"] = mimeType; return ret; } voici la page action.php pour envoye le formulaire CODE <?php $idFormulaire = '-- WEBSITE -- ENG --'; //objet du mail $to = 'guillaume_AT_asiapack.com, sales_AT_asiapack.com, webmaster_AT_asiapack.com'; //destinataires du mail $location = 'thankyou1.htm'; //page de reroutage page pour remerciement $body = "CONTENT: \n\n"; foreach ($_POST as $variable => $value) { $body .= $variable . ' -> ' . $value . "\n\n"; } $body .= "\nEND\n\n Date - " . strftime("%c") . "\n"; $subject = $idFormulaire; $headers = "From: WEBSITE"; _AT_mail($to, $subject, $body, $headers); header('location: ' . $location); foreach($bad_strings as $bad_string) { if(eregi($bad_string, strtolower($str_to_test))) { echo "$bad_string found. Suspected injection attempt - mail not being sent."; exit; } } function contains_newlines($str_to_test) { if(preg_match("/(%0A|%0D|\\n+|\\r+)/i", $str_to_test) != 0) { echo "newline found in $str_to_test. Suspected injection attempt - mail not being sent."; exit; } } ?> Cette page action.php m'a ete fournie par un ami qui m'a dit avoir le mm probleme mais ne pas savoir d'ou cela provient. j'ajoute que je suis un boulet en javascript... merci de votre aide !
iNCiTE Web Posté 17 Juin 2008 Posté 17 Juin 2008 Je confirme ce que j'ai dit : les contrôles sont en Javascript, donc si pas de javascript (robots), pas de tests. Les tests en PHP ne semblent pas complet ($str_to_test jamais utilisée) Quant au fichier AC_RunActiveContent.js, aucun rapport avec la choucroute, c'est pour le flash dans IE7.
Nabiot Posté 17 Juin 2008 Auteur Posté 17 Juin 2008 Pour resumer : Le robot qui confirme depuis la page de formulaire n'est pas la cause car le mail recu devrait etre CONTENT:TYPE -> INFOcontact -> title ->phone ->email -> company -> Country -> -Select your country-remarks ->Submit -> SubmitEND Mais par contre l'envoi du formulaire vient du fait qu'un visiteur, robot probablement, passe sur la page action.php directement, sans etre passe par une page de formulaire, d'ou le fait que le mail recu est totalement vide. Pas de champs transmis par la page precedente.... CONTENT:END Ok, la solution n'est finalement pas tres difficile, encore merci de vous etre penche sur mon cas...
iNCiTE Web Posté 17 Juin 2008 Posté 17 Juin 2008 Et bien oui c'est ce que je disais, le robot appelle directement la page action.php, et comme tu ne contrôles pas ensuite, ça part comme ça.
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant