Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

petit problème de formulaire

34 réponses
Avatar
docanski
Bonjour la foule !

Voui, je sais, je suis un peu (beaucoup) HS sur ce coup mais je crois
que ça ne vaut pas vraiment la peine de m'abonner à un groupe où je suis
largué depuis un bout de temps (la vieillesse, quoi ...) pour poser une
question ponctuelle.
Je me lance donc ... :
il s'agit d'ajouter une condition dans un petit JS destiné à un
formulaire ... et j'y arrive plus :-(.
En l'occurrence, je voudrais *exclure* la possibilité d'inscription de
faux membres soumettant des adresses email "exotiques" généralement
génératrices de spam, du genre xxxxxxx@xxxxx.ru ou xxxxxxx@xxxxx.uk,
etc ...
Ce sont donc les extensions de ces adresses que je vise.
Mon script se présente actuellement comme suit :

<script type="text/javascript">
<!--
function process_form(the_form)
{
var element_names = new Object()
element_names["req_username"] = "Nom d\'utilisateur"
element_names["req_password1"] = "Mot de passe"
element_names["req_password2"] = "Confirmez votre mot de passe"
element_names["req_email1"] = "Courriel"
element_names["req_email2"] = "Courriel 2"

if (document.all || document.getElementById)
{
for (i = 0; i < the_form.length; ++i)
{
var elem = the_form.elements[i]
if (elem.name && elem.name.substring(0, 4) == "req_")
{
if (elem.type && (elem.type=="text" || elem.type=="textarea" ||
elem.type=="password" || elem.type=="file") && elem.value=='')
{
alert("\"" + element_names[elem.name] + "\" est un champ requis
pour ce formulaire.")
elem.focus()
return false
}
}
}
}

return true
}
// -->

Quelqu'un peut m'offrir le bout de code kivabien ?

Cordialement,
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/

10 réponses

1 2 3 4
Avatar
CrazyCat
Olivier Miakinen wrote:
J'ai bien compris le but, mais je reste en désaccord avec la solution,
qui n'en est pas une : tu risques de décourager des visiteurs honnêtes,
sans efficacité réelle contre le spam.



Rien ne vaut un bon test de Turing.
Pour ma part, j'utilise celui que j'ai développé:
<http://www.c-p-f.org/php-Un_Captcha_accessible_pour_tous-a35.html>

--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces webmasters : http://www.c-p-f.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Avatar
Olivier Miakinen
Le 03/10/2008 16:46, CrazyCat a écrit :

Rien ne vaut un bon test de Turing.
Pour ma part, j'utilise celui que j'ai développé:
<http://www.c-p-f.org/php-Un_Captcha_accessible_pour_tous-a35.html>



Joli. Mais c'est la solution « riche ». Je reste persuadé que la plupart
du temps demander une réponse immuable suffit.
Avatar
Patrick Mevzek
Le Fri, 03 Oct 2008 17:22:10 +0200, Olivier Miakinen a écrit:
Rien ne vaut un bon test de Turing.
Pour ma part, j'utilise celui que j'ai développé:
<http://www.c-p-f.org/php-Un_Captcha_accessible_pour_tous-a35.html>



Joli.



Mais trivialement attaquable (si cela protégeait quelque chose de
sensible ou de convoité) car l'espace d'entrée du MD5 est très petit. Il
faudrait au moins un élément variable (l'équivalent du salt d'un mot de
passe) mais même là l'espace d'entrée si petit permettrait une recherche
exhaustive très rapide.

D'autant que si le seul test qui est fait côté serveur est la comparaison
des deux champs POST, il est trivial de se choisir l'un et d'envoyer
l'autre comme MD5 du premier, en court-circuitant la valeur présente dans
le formulaire.

--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
<http://www.dotandco.net/> <http://www.dotandco.com/>
Avatar
docanski
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
Olivier Miakinen ecrit ce qui suit en ce 03.10.2008 15:07 :

J'ai bien compris le but, mais je reste en désaccord avec la solution ...


...
La meilleure solution que je te propose, c'est de demander aux visiteurs
qu'ils saisissent dans un champ la réponse à la question « combien font
2+2 », et que *en PHP* tu vérifies que la réponse est bien "4". Si un
jour tu t'aperçois que des spams passent quand même, tu remplaceras la
question par « combien font 2×3 », ou bien dès le départ tu prévois
quelques questions de base.



Soit. Il convient donc d'ajouter un champ dans le formulaire avec le
renvoi kivabien et d'en ajouter le traitement dans "register.php".
Mais comment ? Quel est le code à ajouter dans les deux ? ... car je te
rappelle que je n'y entrave que dalle à l'écriture de code PHP ... et
que j'espère qu'une bonne âme m'offrira du prémâché ...
On peut rêver, hein ! ;-)

Cordialement,
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Avatar
docanski
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
SAM ecrit ce qui suit en ce 03.10.2008 15:28 :

Mais je sais pas faire ... :-(



$passl = $_POST['eq_password1'];
$pass2 = $_POST['eq_password2'];

$email = $_POST['req_email1'];
$emai2 = $_POST['req_email2'];

$acceptePas = "/.(uk|ru|sp|it|tk)$/";

if( eregi ( $acceptePas , $url ) == false) {
if( ($email1 != $email2) || ($rpass1 != $pass2) /* etc etc */ )
include('ceFormulaire.php');
else
include('formulaire_suite.inc');
}



Boudiou ! T'es devenu une lame en peu de temps en matière de codage PHP !
Je m'incline, que dis-je, je m'étale ! ;-)
Reste à voir à quel endroit du script "register.php" je vais pouvoir
insérer ton code. Pour ça, je vais redescendre dans Win2k pour faire les
essais sous EasyPHP : je ne maîtrise pas encore les relations
serveur-client sous Linux.
On avance ! ;-)

Cordialement,
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Avatar
docanski
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
SAM ecrit ce qui suit en ce 03.10.2008 14:56 :

J'imagine qu'on doit ...
dans le genre :

$url = $_POST['email'];
$acceptePas = "/.(uk|ru|sp|it|tk)$/";
if( ereg ( $acceptePas , $url ) == false)
inscriptionOK();



Désolé pour la suite tardive : beaucoup d'agitation en ce moment et pas
eu le temps de revenir.
J'ai tenté la manoeuvre aussi bien dans le register.php que le
login.php, ça ne marche pas. La fonction " inscriptionOK()" n'étant pas
définie, j'ai un message d'erreur, c'était couru.
J'ai tenté :

$url = $_POST['email'];
$acceptePas = "/.(uk|ru|tk)$/";
if ereg ( $acceptePas , $url )
return false;

mais ça laisse passer les email censées être filtrées :-(

La partie destinée à contrôler l'email des inscriptions est la suivante :

require PUN_ROOT.'include/email.php';

if (!is_valid_email($email1))
message($lang_common['Invalid e-mail']);
else if ($pun_config['o_regs_verify'] == '1' && $email1 != $email2)
message($lang_register['E-mail not match']);

// Check it it's a banned e-mail address
if (is_banned_email($email1))
{
if ($pun_config['p_allow_banned_email'] == '0')
message($lang_prof_reg['Banned e-mail']);

$banned_email = true; // Used later when we send an alert e-mail
}
else
$banned_email = false;

et c'est donc en tête de celle-ci que j'ai tenté d'ajouter ton code et
ma correction. Le "$banned_email" est la variable des inscrits qui ont
été bannis manuellement, ceci dit à toutes fins utiles pour faire
avancer le schmilblick.

Cordialement,
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Avatar
SAM
Le 10/7/08 7:07 PM, docanski a écrit :
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
SAM ecrit ce qui suit en ce 03.10.2008 14:56 :

J'imagine qu'on doit ...
dans le genre :

$url = $_POST['email'];
$acceptePas = "/.(uk|ru|sp|it|tk)$/";
if( ereg ( $acceptePas , $url ) == false)
inscriptionOK();



Désolé pour la suite tardive : beaucoup d'agitation en ce moment et pas
eu le temps de revenir.



Avant de s'étendre + longuement,
et sans regarder le code proposé qui me semble complexe (avec appel à un
tas de trucs définis par ailleurs comme ces choses qui semblent être
pour du "multi langages") on va dire que ton formulaire est OK
(et on se fout des provenances des adresses mail)

Donc ton formulaire,
qui devait fonctionner avant les histoires d'e-mail non désirés,
vérifie des remplissages et conformités des pass-1/pass-2 email_1/email_2.
Si tout cela est OK
le formulaire est envoyé à une page de validation anti-robots

et c'est là que tu demandes de répondre à 2 + 2
si c'est 4 alors ce n'est pas un robot et la suite peut être jouée,
sinon ... blocage.

Comment ça marche :
Le formulaire anti-robot qui reprend l'ensemble des champs pré-remplis +
la question qui tue les robots est renvoyé à lui-même pour controle de
la réponse.
Si elle est OK l'action du form change pour cette fois aller à
l'enregistrement (ou je ne sais quelle suite à donner) et en même temps
la page présente le récapitulatif titre, date, nom, prénom, pass, email,
message pour dernière validation
sinon ça repose la question (ou une autre)

J'ai tenté la manoeuvre aussi bien dans le register.php que le
login.php, ça ne marche pas. La fonction " inscriptionOK()" n'étant pas
définie, j'ai un message d'erreur, c'était couru.



Ben oui, peut-être faut-il la créer ?

Mais de ttes façons il faut préférer le truc de la question qui tue le
robot : un fichier 'anti-robot.php' entre 'loggin.php' et 'register.php'
par exemple.


J'ai tenté :

$url = $_POST['email'];
$acceptePas = "/.(uk|ru|tk)$/";
if ereg ( $acceptePas , $url )
return false;

mais ça laisse passer les email censées être filtrées :-(



Puisqu'on a dit que le filtrage sur une provenance n'était pas une
solution !

La partie destinée à contrôler l'email des inscriptions est la suivante :

require PUN_ROOT.'include/email.php';



dèjà là on ne peut qu'imaginer ce que ça doit bien pouvoir être ...
ce : 'email.php'

if (!is_valid_email($email1))
message($lang_common['Invalid e-mail']);
else if ($pun_config['o_regs_verify'] == '1' && $email1 != $email2)
message($lang_register['E-mail not match']);



espérons que ça ne vérifie que la syntaxe de type adresse mail


// Check it it's a banned e-mail address
if (is_banned_email($email1))
{
if ($pun_config['p_allow_banned_email'] == '0')
message($lang_prof_reg['Banned e-mail']);

$banned_email = true; // Used later when we send an alert e-mail
}
else
$banned_email = false;

et c'est donc en tête de celle-ci que j'ai tenté d'ajouter ton code et
ma correction. Le "$banned_email" est la variable des inscrits qui ont
été bannis manuellement, ceci dit à toutes fins utiles pour faire
avancer le schmilblick.



Ma foi ...
on peut bien avoir une énième vérification ici seulement

if(!$banned_email) {
$url = $_POST['email1'];
$acceptePas = "/.(uk|ru|sp|it|tk)$/";
if( !eregi ( $acceptePas , $url ))
echo "<input type='submit' value='continuer' name='banned_email'>";
else {
echo "<h3>Votre post ne peut être accepté</h3>";
echo "<input type='hidden' value='0' name='banned_email'>";
}
}
?>
</form>


Cordialement,



Le php est bête, il ne réfléchit que sur le serveur, il faut donc
trouver des mécanismes pour passer d'un fichier de contrôle à l'autre,
quitte à parfois utiliser en boucle le même fichier jusqu'à ce que tous
les contrôles soient OK, le formulaire se réaffiche alors avec une
nouvelle url pour l'action du form et une dernière validation de la part
de l'usager.

--
sm
Avatar
SAM
Le 10/8/08 10:29 AM, SAM a écrit :

(voir le post précédent)

Je vois que j'ai oublié d'envoyer d'autres posts
qui pourraient éclairer cette histoire de question anti-robot

Voici :

====================================== Le 10/3/08 12:30 PM, docanski a écrit :

Blague à part, un robot peut-il arriver à obtenir de telles adresses
ou à *constater* par ses tentatives qui n'aboutissent pas qu'il doit
tenter l'inscription par une adresse de ce genre ?



Un robot spameur de BAL mail tente *toutes* les adresses, soit par essai
de l'alphabet à chaque lettre, soit par analogie sur certains noms. Il
finira bien par t'envoyer qque chose un jour dans ta BAL.
Dès que tu ouvres son message, ou accepte l'image y insérée, ou y clique
sur le lien proposé, ou ... etc, hop! il reçoit confirmation d'une
adresse réelle et il a atteint son but : il pourra te spamer à loisir.

Le robot spammeur n'a pas besoin de te donner une url de retour qui lui
serve, il peut bien "emprunter" n'importe quelle adresse paraissant valide.

Je peux me tromper mais je crois que le fait de rester *bloqué* sur la
page d'inscription ne lui permettra pas d'en comprendre la raison



Maintenant, fouiller un site pour y trouver un formulaire d'inscription,
ça ne doit pas être aussi facile.

puisqu'il n'y aura aucune réaction. Il passerait ainsi son chemin ...



Il s'en moque, je doute qu'il attende une réponse
(saura t-il lire ou exploiter le texte renvoyé ?)



===================================== Le 10/3/08 7:49 PM, docanski a écrit :
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
SAM ecrit ce qui suit en ce 03.10.2008 15:28 :

Mais je sais pas faire ... :-(



$passl = $_POST['eq_password1'];
$pass2 = $_POST['eq_password2'];

$email = $_POST['req_email1'];
$emai2 = $_POST['req_email2'];

$acceptePas = "/.(uk|ru|sp|it|tk)$/";

if( eregi ( $acceptePas , $url ) == false) {
if( ($email1 != $email2) || ($rpass1 != $pass2) /* etc etc */ )
include('ceFormulaire.php');
else
include('formulaire_suite.inc');
}



Boudiou ! T'es devenu une lame en peu de temps en matière de codage
PHP !



:-)

j'ai rien testé,
y a des coquilles,
le PHP j'aime touj pas ça :-(
(déjà que j'aime pas voir tout ces $,
en plus faut mettre en branle le serveur).

Je m'incline, que dis-je, je m'étale ! ;-)
Reste à voir à quel endroit du script "register.php" je vais pouvoir



dommage que tu n'aies pas créé toi même ce fichier.

insérer ton code. Pour ça, je vais redescendre dans Win2k pour faire
les essais sous EasyPHP : je ne maîtrise pas encore les relations
serveur-client sous Linux.
On avance ! ;-)



Ben ...
ici encore ce n'est que pour tenter de ne répondre qu'à ta question.
Mais je signale quand même et avant que tu n'essaies de l'inutile
qu'Olivier en a cassé le bien fondé et a donné une vraie soluce.

Soluce dont j'imagine que ça doit fonctionner un peu comme ça :
(dès qu'on aura corrigé les erreurs de code)

$problemes = array( // tableau des questions et leurs réponses
array('q' => '2 x 2', 'r' => '4'),
array('q' => 'couleur du cheval blanc d'Henri IV ?', 'r' => 'blanc'),
array('q' => Le jour de Noël est en décembre le : ', 'r' => '25'),
array('q' => '2 + 3', 'r' => '5'),
array('q' => '6 x 7', 'r' => '42')
);

$probleme = array_rand($problemes); // tirage aléatoire index problemes
$question = $problemes[$probleme]['q']; // la question correspondante

echo 'Répondez à la question suivante : '.$question;
echo " - réponse : <input type='text' name='reponse'>";
echo "<input type="hidden" value='".$probleme.'" name='probleme'>";

if( isset($_POST['reponse']) { // si la réponse est reçue
// on est maintenant au stade où
// le form anti-robot a été envoyé
$reponse = $_POST['reponse'];
$probleme = $problemes[$_POST['probleme']]['r'];
if ( strtolower($reponse) == $probleme) // si la réponse est bonne
{
// ce n'est pas un robot, on peut maintenant vérifier :
// - le password
// - la concordance des 2 emails
// - etc etc
// avant de renvoyer la suite (écrire la suite, mettre en BdD)
}
else
{
// sinon on renvoie le formulaire à compléter
}
}


--
sm
Avatar
docanski
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
SAM ecrit ce qui suit en ce 08.10.2008 10:29 :

Avant de s'étendre + longuement,



C'est pourtant tellement reposant ... ;-)

... on va dire que ton formulaire est OK



Voui, là il n'y a aucun problème. Je ne désire pas le changer évidemment
mais simplement y ajouter une petite condition pour qu'il soit validé.
Mon problème étant un problème d' *origine* des adresses email, c'est
sur cette voie que je voudrais trouver la solution. Ce n'est sans doute
pas la meilleure mais quand je constate à quel point certains ont déjà
du mal à remplir *correctement* un formulaire simple (j'ai déjà eu de
retours de ce genre !), je crains toujours qu'une question
supplémentaire ne soit un handicap supplémentaire.

(et on se fout des provenances des adresses mail)



Ben ... moi pas tant que ça ... :-(

Si tout cela est OK



C'est.

le formulaire est envoyé à une page de validation anti-robots



C'est une page de validation "tout court" : register.php qui constitue
le formulaire d'inscription et en même temps son traitement par l'action
: onsubmit="this.register.disabled=true;if(process_form(this)){return
true;}else{this.register.disabledúlse;return false;}"

et c'est là que tu demandes de répondre à 2 + 2
si c'est 4 alors ce n'est pas un robot et la suite peut être jouée,
sinon ... blocage.



Voui mais ici tu es donc parti sur un captcha. Cela suppose que j'ajoute
alors un champ au formulaire et qu'il soit analysé dans son propre seing
(voir ci-dessus). J'ai vu celui de Crazy-Cat (merci au passage pour
cette intervention) mais il est nettement plus évolué. Si je choisis une
telle solution, je préfère un captcha réduit à sa plus simple
expression, en une seule question comme l'a suggéré Olivier. Mais je ne
sais pas comment coder en PHP, comme je l'ai déjà écrit. Ce serait
chouette qu'on me donne la totale, le code de la partie champ intégrant
la partie traitement, comme c'est déjà le cas pour le reste du
formulaire. Le JS initialement cité en fait partie même si je n'ai pas
été très clair à ce sujet : il faudrait pour cela que je publie tout le
code de cette page et je crains que cela ne dérangent certains. Déjà que
je suis un peu (beaucoup ?) HS ici ... :-( Mais j'ai des excuses :
difficile de passer sur le forum dédié, trop modéré à mon goût.

J'ai tenté la manoeuvre aussi bien dans le register.php que le
login.php, ça ne marche pas. La fonction " inscriptionOK()" n'étant
pas définie, j'ai un message d'erreur, c'était couru.



Ben oui, peut-être faut-il la créer ?



En effet. Mais quand on ne sait pas causer PHP ...

Puisqu'on a dit que le filtrage sur une provenance n'était pas une
solution !



Peut-être pas la meilleure, soit.
Et comme je ne suis pas (trop) têtu, j'accepterai sans sourciller mais
avec grand plaisir et une infinie reconnaissance :-) toute solution
"clef en main", de préférence.
Je sais, je suis difficile ...

require PUN_ROOT.'include/email.php';



dèjà là on ne peut qu'imaginer ce que ça doit bien pouvoir être ...
ce : 'email.php'



C'est la partie qui va permettre de vérifier l'entrée des membres, leur
contrôle d'identité.

Ma foi ...
on peut bien avoir une énième vérification ici seulement

if(!$banned_email)



Tu ne peux faire une vérification sur une Email *déjà* bloquée
puisqu'elle l'a été manuellement. C'est en amont qu'il faut agir.
Peut-être en changeant la variable ci dessus par (!$req_email1) qui est
le "name" du premier champ de saisie ?
Faudra que j'essaie ça ... si c'est la façon d'écrire cette variable est
bonne ... et si je peux l'utiliser telle quelle.

quitte à parfois utiliser en boucle le même fichier jusqu'à ce que tous
les contrôles soient OK,



C'est apparemment ce que j'essaie de faire ici.

Je vais redescendre ce soir (si j'ai le temps) dans Win2k pour faire de
nouveau essais.

Cordialement,
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
Avatar
docanski
Alors que les eleveurs et agriculteurs polluent toujours la Bretagne,
SAM ecrit ce qui suit en ce 08.10.2008 10:49 :

Le 10/3/08 7:49 PM, docanski a écrit :



ou la machine à remonter le temps ;-) ...

(déjà que j'aime pas voir tout ces $,



Tu préfères les zorros ?

en plus faut mettre en branle le serveur).



Perso, ça m'ennuie également car je ne le maîtrise pas encore sous Linux
et il faut alors que je redesccende chaque fois sous Win2k, ma seconde
machine étant en rade en ce moment.

dommage que tu n'aies pas créé toi même ce fichier.



Pour ça, il eut fallu que je sois un maître du codage PHP.

Ben ...
ici encore ce n'est que pour tenter de ne répondre qu'à ta question.
Mais je signale quand même et avant que tu n'essaies de l'inutile
qu'Olivier en a cassé le bien fondé et a donné une vraie soluce.



Je suis preneur. Mais encore faut-il pouvoir l'écrire dans le formulaire
existant.

Soluce dont j'imagine que ça doit fonctionner un peu comme ça :
(dès qu'on aura corrigé les erreurs de code)



Je vais donc attendre un peu pour celle-ci car elle me paraît bien
alambiquée ;-)

Cordialement,
--
docanski

Portail et annuaire du nord-Bretagne : http://armorance.free.fr/
Guide des champignons d'Europe : http://mycorance.free.fr/
La vallée de la Rance maritime : http://valderance.free.fr/
Les côtes du nord de la Bretagne : http://docarmor.free.fr/
1 2 3 4