Intégrer le code du captcha au reste du code de traitement [Résolu] - PHP - Programmation
Marsh Posté le 29-03-2012 à 11:04:41
Citation : que le message d'erreur ("Veuillez entrer votre adresse courriel ou recopier correctement le cryptogramme afin que je puisse vous répondre." ) apparaisse en rouge et non en vert. |
Une solution parmi d'autres consiste à remplacer :
$msg_erreur = "Veuillez entrer votre adresse courriel ou recopier correctement le cryptogramme "; |
par :
$msg_erreur = "<span style='color:red;'>Veuillez entrer votre adresse courriel ou recopier correctement le cryptogramme</span>"; |
Marsh Posté le 29-03-2012 à 15:06:34
Je t'en supplie, ne met pas de Captcha, c'est devenu la plaie du net
Marsh Posté le 29-03-2012 à 16:14:15
Merci énormément à vous deux pour vos réponses !
@Olivthill : Merci, ça fonctionne parfaitement ! Dois-je dire tant pis si ça ne passe pas par ma feuille de style ? Autrement dit, vis-à-vis des normes (W3C ou autres), que je ne respecte sans doute pas vraiment puisque mon code doit être plutôt sale en dépit de mes quelques efforts, est-ce une solution raisonnable ? Quoi qu'il en soit, à mon niveau, elle me convient parfaitement et merci encore.
@Format_c : tu t'adresses à un ignorant complet en matière de programmation côté serveur. Parce que je suis néanmoins un curieux profane, j'ai par exemple lu un article qui expliquait que les captchas sont aujourd'hui aisément contournés par les hackeurs. Que les captchas audio ne représentent pas une solution viable et que certains organismens pensent à des images de tel ou tel objet qu'il faudrait reconnaître dans une série d'objets divers (par exemple, reconnaître le ou les chiens dans un album de photos de chiens et de chats ;> ). Est-ce pour ces raisons de sécurité qui n'est pas assurée que tu me dis cela ou bien est-ce pour autre chose ? Parce que s'il ne s'agit que de sécurité, je me dis (sans doute un peu naïvement) qu'il vaut mieux cela que rien du tout.
Marsh Posté le 02-04-2012 à 17:19:32
Re-bonjour,
Afin d'être le plus précis possible, voici le code du formulaire que je teste et qui intègre le code de traitement à la page de formulaire même (verifier.php n'existe plus et son contenu PHP appartient désormais à formu.php) :
Code :
|
Voici alors mes questions principales. Que dois-je modifier pour :
- qu'à l'arrivée sur la page du formulaire, le visiteur ne voie pas par défaut la phrase d'erreur "Veuillez entrer votre adresse courriel ou recopier correctement le cryptogramme afin que je puisse vous répondre." ?
- que le contenu HTML du bas de la page (ce qui se trouve en dessous du formulaire) apparaisse lorsque le visiteur s'est trompé ? Il n'apparaît seulement en effet que lorsque le visiteur a poussé sur "Soumettre" en ayant rempli les deux conditions (remplir le champ "Adresse e-mail" et recopier correctement le captcha).
Une réponse à ces deux seules questions me contenterait amplement. J'ai encore essayé par moi-même de procéder aux changements nécessaires, mais rien n'y fait, je perds mon temps parce que je n'y connais vraiment rien en PHP.
Je me demande encore comment je pourrais un peu perfectionner la condition "if (empty($_POST['email_from'])" afin, par exemple, d'exiger du visiteur d'entrer un signe "@". J'ai pensé qu'il n'était pas si utilise que cela de le faire parce qu'un visiteur qui veut entrer une fausse adresse le pourra toujours ("lkdjgkshg@kdjfkojf.com" ) et qu'il ne sert à rien, dès lors, de compliquer mon code inutilement. L'esprit de la courte condition que j'ai posée est de rappeler au visiteur sérieux et distrait de m'indiquer son adresse.
Donc, peut-être qu'il n'y a pas, dans mon cas, de perfectionnement pertinent et que ma condition peut rester telle quelle.
Enfin, j'adorerais que l'espace d'entrée de l'adresse e-mail soit entouré de rouge en cas de non réponse.
Merci d'avance pour votre attention.
Marsh Posté le 02-04-2012 à 19:10:33
J'ai progressé !
Cela se passe ici désormais.
Voici le nouveau code (le reste n'a pas changé si ce n'est que j'ai attribué le nom "valider" à la base Submit du formulaire qui n'avait pas de nom jusque-là), ce qui change est en gras + la fonction au début :
Code :
|
Ma première question principale disparaît, du coup !
Aussi, j'ai perfectionné le traitement de l'adresse de courrier électronique du visiteur grâce à une fonction.
Il reste :
Que faire pour que le contenu HTML du bas de la page (ce qui se trouve en dessous du formulaire) apparaisse lorsque le visiteur s'est trompé (sur l'email ou le captcha) ? Il n'apparaît seulement en effet que lorsque le visiteur a poussé sur "Soumettre" en ayant rempli les deux conditions (remplir le champ "Adresse e-mail" et recopier correctement le captcha).
Enfin, j'adorerais que l'espace d'entrée de l'adresse e-mail soit entouré de rouge en cas de non réponse.
Bien entendu, tous vos bons conseils pour améliorer ce code sans doute peu professionelle sont les bienvenus...
Merci d'avance pour votre attention.
Marsh Posté le 03-04-2012 à 10:09:43
Pour mettre en valeur ton champs email en cas d'erreur, tu peux utiliser
<INPUT TYPE=text NAME=email VALUE="" SIZE=25 style="background:red">
Tu assignes une variable, par exemple $highlight qui sera assignéé en founction de la validité de ton email.
if (ValideCourriel('email_from')==true)
{
$highlight="";
}
else
{
$highlight = "style=\"background:red\"";
}
Ensuite dans ton formulaire (qui doit être placé après ce bout de code dans ta page sinon $highlight n'existera pas), tu rajoutes juste <?php echo $highlight;?>
et ça devrait le faire
Marsh Posté le 03-04-2012 à 10:42:04
Citation : que le contenu HTML du bas de la page (ce qui se trouve en dessous du formulaire) |
Il est en dessous du formulaire lorsque la page est complètement générée. Mais où se trouve les lignes qui génèrent ce bas de la page ?
Citation : apparaisse lorsque le visiteur s'est trompé |
Actuellement, quand l'utilisateur s'est trompé, le code suivant est exécuté :
echo $message; |
L'instruction die(), est équivalente à un exit(), c'est-à-dire, que cela faire quitter le programme. Or la génération du reste de la page se situe probablement en-dessous de cette ligne die(). Une solutions serait d'enlever ce die() et de mettre l'envoi du mail dans un bloc else {} :
if ($_POST['valider']==true && strlen($message) > strlen($msg_erreur)) |
Marsh Posté le 03-04-2012 à 14:10:33
Merci encore à vous deux pour vos réponses sympas.
@Format_c :
super ! Bien que ça ne fonctionne pas. Le champ e-mail est rouge quoi qu'il arrive (il est en fait rempli de rouge alors que je le voudrais entouré), il est rouge à l'entrée sur la page... Mais c'est surtout ta dernière ligne que je ne pige pas. Où est comment dois-je placer cela "<?php echo $highlight;?> " dans mon formulaire ??
@Olivthill :
Je comprends ton explication. Je savais aussi (après de nombreux tests et grâce à ce que j'ai pu lire) que c'était effectivement l'instruction "die()" qui tuait le HTML se situant en dessous.
J'ai écrit cela :
Code :
|
Et ça a l'air de fonctionner à merveille ! Merci merci merci ! Si je peux faire la moindre chose pour vous qui entrerait dans mes compétences, n'hésitez évidemment pas à me le demander.
PS:
J'ai simplifié ma fonction de vérification de la syntaxe de l'e-mail entré, en début de page, par une clé Regex (j'ai pris le temps d'apprendre, de comprendre et de l'écrire moi-même) :
<?php
$cryptinstall="./crypt/cryptographp.fct.php";
include $cryptinstall;
function ValideCourriel($email_from)
{
if (preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,3}$#", $_POST['email_from']))
{
return false;
}
else
{
return true;
}
}
?>
Marsh Posté le 03-04-2012 à 22:58:17
fnisse a écrit : Merci encore à vous deux pour vos réponses sympas.
|
Regarde dans ton code tu dois avoir quelquepart
<input name="email_from" id="status" size="30" type="text" value="" maxlength="40" />
c'est là qu'il faut que tu mettes le <?php echo $highlight; ?>
<input name="email_from" id="status" size="30" type="text" value="" maxlength="40" <?php echo $highlight; ?>/>
Marsh Posté le 03-04-2012 à 23:54:37
Pourquoi tu limites l'adresse email à 40 caractères ? c'est stupides, des gens ont des adresses email très longues, dû notamment au nom de domaine très long.
Je te conseille de supprimer fissa ce maxlength, ça n'a aucun sens.
Autre chose, ta regexp est mauvaise, elle ne valide pas les adresses email suivantes :
user+mailbox/department=shipping@example.com
!#$%&'*+-/=?^_`.{|}~@example.com
"Abc@def"@example.com
"Fred Bloggs"@example.com
"Joe.\\Blow"@example.com
monadresse@123.123.121.222
Et oui elles sont valides, et même l'utilisation d'une adresse ip comme domaine est valide .
Enfin en regle générale c'est les caractères non accentués, les chiffres, le underscore, le tiret qui sont le plus souvent utilisés
Marsh Posté le 04-04-2012 à 00:15:24
@Format_c : merci encore pour ton temps. J'ai réessayé, en suivant à la lettre ce que tu me dis, mais malheureusement rien ne se passe. Je sauvegarde toutefois (à défaut d'être bon en programmation, j'essaye d'être organisé ) tous vos bons conseils dans des fichiers textes que je conserve bien au chaud. Rien ici ne tombe dans l'oreille d'un sourd...
Le fait que cela ne fonctionne pas (ou, du moins, que je ne parvienne pas à faire fonctionner ton idée) est peut-être dû à tous les changements que j'ai pu faire depuis lors : voir la nouvelle version (qui intègre du JSQuery, chez moi toujours situé sur une autre page, en l'occurrence mon fichier JS, par un lien extérieur).
@Gatsu35 : Ah bon ? Je n'ai jamais vu, depuis 10 ans que je fréquente le Web, d'adresse e-mail contenant, par exemple, deux signes "@". Jamais. Je te crois bien évidemment. Je pense qu'en attendant que je règle d'autres problèmes, je vais conserver mon code tel quel. Je te remercie en tous cas chaleureusement également pour ton temps et note tes dires dans ma sauvegarde. J'y reviendrai tôt assez.
Ce qui me chagrine pour l'instant :
"" Warning: chk_crypt() [function.include]: Failed opening '' for inclusion (include_path='.usr/local/lib/php') in /homez.483/francoissi/www/crypt/cryptographp.fct.php on line 16 ""
Quelqu'un sait-il comment je peux faire disparaître cette ligne qui apparaît au premier chargement de la page du formulaire (et au premier chargement seulement, elle disparaît sur rafraîchissement de la page ou si l'on revient sur le site sans avoir quitté le navigateur) ?
J'ai trouvé ! : dans le fichier cryptographp.fct.php, il faut remplacer
Code :
|
par
Code :
|
.
Je n'aurais jamais trouvé (ce n'est pas non plus renseigné dans la documentation de Captcha.fr, à ma connaissance) si je n'étais tombé sur le message providentiel d'un internaute ici.
Ma mission actuelle, dans ce perfectionnement perpétuel de la seule page dynamique de mon petit site , est, peut-être grâce au JsQuery (dont j'ai puisé mes petits changements ici), d'entourer le champ e-mail d'une certaine couleur (le rouge par exemple) si et seulement si l'utilisateur a entré un format non valide de courriel. "Si et seulement si" : si le visiteur entre une bonne adresse courriel mais qu'il se trompe dans le captcha, le champ e-mail resterait inchangé, comme il se doit.
Pour ne pas envahir ce forum plus que nécessaire, je rappelle à qui voudrait m'aider plus loin que, autour de ma page de FORMULAIRE (qui est la page de formulaire et la page de traitement à la fois) gravitent :
différents fichiers directement liés au captcha, se trouvant dans le dossier "crypt" à partir de la racine du site;
un fichier Javascript externe qui contrôle, pour ce qui nous occupe, le Jsquery du formulaire;
un fichier CSS en relation avec ce JSQuery et qui contrôle aussi, bien entendu, l'affichage du formulaire en général.
Marsh Posté le 04-04-2012 à 08:43:27
J'ai regardé le code de ton formulaire
Code :
|
C'est cette partie en rouge qu'il faudrait remplacer par
<input name="email_from" id="status" size="30" type="text" value="" maxlength="100" <?php echo $highlight ?>/>
Mais ça ne marchera que si ta validation d'email est faite en amont de ce formulaire, car sinon ta variable $highlight sera vide.
Si jamais ça ne fonctionne pas, je me suis peut être gouré dans :
if (ValideCourriel('email_from')==true)
{$highlight="";}
else
{$highlight = "style=\"background:red\"";}
Mais en principe, si j'ai bien pigé, la fonction ValideCourriel renvoie true si l'email est correct.
Marsh Posté le 10-04-2012 à 11:48:30
J'avais en fait testé exactement ce que tu me montres, en écrivant cette même ligne en rouge.
Et j'avais écrit ceci en début de page :
Code :
|
En fait, la fonction renvoie FALSE si la syntaxe est CORRECTE, et TRUE si elle est MAUVAISE.
D'où, plus bas,
if ($_POST['valider']==true && (ValideCourriel('email_from')==true) || (!chk_crypt($_POST['code'])))
Ce que je traduis par : "si l'on a poussé sur Soumettre ET que la fonction de vérif. de la syntaxe du courriel est MAUVAISE (true) OU que l'on a mal recopié le crypto, alors..."
----
Gatsu35, je vais prendre en considération tous tes conseils pour assouplir cette clé et donc faire en sorte que le formulaire accepte une syntaxe plus permissive aux adresses e-mail postées. Voici la première étape.
Voici ma clé qui pour l'instant n'a pas changé : #^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,3}$#
J'aimerais tout simplement transformer ce code pour qu'il accepte les majuscules (avant ou après le "@", n'importe où dans l'adresse), venant en effet de constater que, par exemple, un "AAAA@aaa.com" ne passait pas.
Sais-tu ce que je devrais faire ? J'ai lu quelque part qu'il s'agissait d'ajouter un "i" quelque part, mais où, comment... ?
Merci d'avance !
Marsh Posté le 01-05-2012 à 17:43:58
Merci infiniment Gatsu !
J'écris donc :
#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,3}$#i
... et ça a l'air de fonctionner à merveille !
Marsh Posté le 04-05-2012 à 13:19:29
hello
au passage pour les emails, tu limites à 2 ou 3 lettres pour l'extension, mais certaines sont plus grandes ... par exemple des .info ça fait 4 lettres, et j'ai déjà vu des .museum ...
Je ne sais pas quel est le cadre d'application de ta page, si c'est pour un intranet par exemple tu n'auras probablement jamais de .museum
Marsh Posté le 17-05-2012 à 13:30:56
Merci NewsletTux ! Il s'agit d'un site vitrine pour ma recherche d'emploi (francoisnisse.be)... Tu me conseillerais donc de changer cette limitation de 3 signes max après l'arobas ?
J'en suis maintenant à la finition technique. J'aurais l'une ou l'autre dernière question qui, n'ayant plus rien à voir avec le formulaire, devraient être décrites dans un nouveau sujet ?
Marsh Posté le 28-03-2012 à 16:38:45
Bonjour à tous.
Je n'y connais absolument rien en PHP. Je ne me débrouille qu'en HTML et en CSS, ce qui m'a toujours convenu pour la création de petits sites, auxquels, au besoin, j'ajoutais un formulaire dont l'envoi était traité par des scripts préconçus (par exemple "formail.pl" -- si je me souviens bien de l'extension, lorsque j'hébergais chez Free.fr).
Là, c'est différent. Je crée mon site Web professionnel (hébergé chez OVH) et me dépatouille pour tout ce qui est la création de mes pages non dynamiques, avec au besoin l'application d'un peu de Javascript que je vais chercher ici ou là.
Bref, j'aimerais toutefois que les champs du formulaire que j'ai créé soient transmis vers une page PHP qui vérifie certaines conditions pour, ensuite, envoyer les entrées de champs sur l'adresse courriel de mon choix.
Voici ce que j'ai pu mettre en place.
Voici le code source de mon formulaire :
Et voici le code encore très fragile de ma page de traitement, en l'occurrence VERIFIER.PHP :
Le captcha (dont j'ai isolé le code y afférant par quelques sauts de lignes, à la fois pour la page du formulaire et pour la page de traitement, à défaut de pouvoir le mettre en couleur) fonctione très bien. Sauf que je ne parviens pas à l'intégrer au code PHP de ma page VERIFIER.PHP.
Comme réponse, si je remplis le champ e-mail, mais que je ne recopie pas le captcha, j'obtiens ceci : "Erreur, le code recopié est incorrect
Afin que je puisse vous répondre, votre adresse courriel est nécessitée.Afin que je puisse vous répondre, votre adresse courriel est nécessitée."
Il y a donc contradiction : le message ne devrait pas être envoyé puisque le code du captcha n'a pas bien été recopié par le visiteur (aussi, la deuxième phrase apparaît deux fois au lieu d'une).
Autrement dit, je ne sais pas comment intégrer le captcha, qui au demeurant fonctionne très bien (je l'ai testé indépendamment de tout code d'envoi), au reste du code de ma page de traitement des données.
Par manque de temps, je ne peux me consacrer à l'étude du PHP, laquelle me demanderait en outre un effort non négligeable parce que la programmation n'est absolument pas mon domaine.
Je ne peux non plus, d'un point de vue financier, me permettre pour l'instant de confier mon site à une boîte professionelle du Web. C'est aussi le seul lieu de mon site qui demande du PHP, le restant n'étant composé que de HTML, de CSS et d'un tout petit peu de Javascript.
Merci infiniment d'avance.
----------
ÉDITION :
----------
Oui, hourra ! Après des heures d'acharnement, restant sans réponse, j'ai fini, à l'instant, par trouver quelque chose qui a l'air de fonctionner à merveille !
Tous vos conseils ne sont pas seulement les bienvenus, ils sont également attendus !
J'aimerais par exemple que le message d'erreur ("Veuillez entrer votre adresse courriel ou recopier correctement le cryptogramme afin que je puisse vous répondre." ) apparaisse en rouge et non en vert. C'est ma seule balise "<p class=qqchose> PHP DE MA PAGE DE TRAITEMENT </p>" qui contrôle le CSS de cette page de traitement. Comment suis-je censé faire pour faire des distinctions ?
Aussi, comme il n'y a finalement qu'un seul message d'erreur possible, puisque j'ai assemblé les deux conditions de l'adresse courriel et du captcha, il y a sans doute moyen de faire plus simple pour écrire le code relatif à l'erreur.
Enfin, je me demande comment je pourrais perfectionner le tout, surtout d'un point de vue sécuritaire.
Message édité par fnisse le 26-05-2012 à 13:56:15