captcha Olivier pour formulaire [long]
Le
docanski
Je m'adresse plus particulièrement à Olivier sur ce coup puisque le
problème se situe au niveau de l'insertion de son captcha dans un
formulaire existant.
J'en restranscris ici l'essentiel pour une meilleure compréhension :
<copie register.php>
> <?php
>
> define('PUN_ROOT', './');
> require PUN_ROOT.'include/common.php';
>
>
> // If we are logged in, we shouldn't be here
> if (!$pun_user['is_guest'])
> {
> header('Location: index.php');
> exit;
> }
>
> // Load the register.php language file
> require PUN_ROOT.'lang/'.$pun_user['language'].'/register.php';
>
> // Load the register.php/profile.php language file
> require PUN_ROOT.'lang/'.$pun_user['language'].'/prof_reg.php';
>
> if ($pun_config['o_regs_allow'] == '0')
> message($lang_register['No new regs']);
>
>
> // User pressed the cancel button
> if (isset($_GET['cancel']))
> redirect('index.php', $lang_register['Reg cancel redirect']);
>
>
> else if ($pun_config['o_rules'] == '1' && !isset($_GET['agree']) && !isset($_POST['form_sent']))
> {
> $page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_register['Register'];
> require PUN_ROOT.'header.php';
>
> ?>
> <div class="blockform">
> <h2><span><?php echo $lang_register['Forum rules'] ?></span></h2>
> <div class="box">
> <form method="get" action="register.php">
> <div class="inform">
> <fieldset>
> <legend><?php echo $lang_register['Rules legend'] ?></legend>
> <div class="infldset">
> <p><?php echo $pun_config['o_rules_message'] ?></p>
> </div>
> </fieldset>
> </div>
> <p><input type="submit" name="agree" value="<?php echo $lang_register['Agree'] ?>" /><input type="submit" name="cancel" value="<?php echo $lang_register['Cancel'] ?>" /></p>
> </form>
> </div>
> </div>
> <?php
>
> require PUN_ROOT.'footer.php';
> }
>
>
> else if (isset($_POST['form_sent']))
> {
> // Check that someone from this IP didn't register a user within the last hour (DoS prevention)
> $result = $db->query('SELECT 1 FROM '.$db->prefix.'users WHERE registration_ip=\''.get_remote_address().'\' AND registered>'.(time() - 3600)) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
>
> if ($db->num_rows($result))
> message($lang_register['User same IP']);
>
> $username = pun_trim($_POST['req_username']);
> $email1 = strtolower(trim($_POST['req_email1']));
>
> if ($pun_config['o_regs_verify'] == '1')
> {
> $email2 = strtolower(trim($_POST['req_email2']));
>
> $password1 = random_pass(8);
> $password2 = $password1;
> }
> else
> {
> $password1 = trim($_POST['req_password1']);
> $password2 = trim($_POST['req_password2']);
> }
>
> [snip les différents autres contrôles ]
>
>
> // Insert the new user into the database. We do this now to get the last inserted id for later use.
> $now = time();
>
> $intial_group_id = ($pun_config['o_regs_verify'] == '0') ? $pun_config['o_default_user_group'] : PUN_UNVERIFIED;
> $password_hash = pun_hash($password1);
>
> // Add the user
> $db->query('INSERT INTO '.$db->prefix.'users (username, group_id, password, email, email_setting, save_pass, timezone, language, style, registered, registration_ip, last_visit) VALUES(\''.$db->escape($username).'\', '.$intial_group_id.', \''.$password_hash.'\', \''.$email1.'\', '.$email_setting.', '.$save_pass.', '.$timezone.' , \''.$db->escape($language).'\', \''.$pun_config['o_default_style'].'\', '.$now.', \''.get_remote_address().'\', '.$now.')') or error('Unable to create user', __FILE__, __LINE__, $db->error());
> $new_uid = $db->insert_id();
>
>
> [snip les différents contrôles ]
>
> // Must the user verify the registration or do we log him/her in right now?
> if ($pun_config['o_regs_verify'] == '1')
> {
> // Load the "welcome" template
> $mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_user['language'].'/mail_templates/welcome.tpl'));
>
> // The first row contains the subject
> $first_crlf = strpos($mail_tpl, "");
> $mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
> $mail_message = trim(substr($mail_tpl, $first_crlf));
>
> $mail_subject = str_replace('<board_title>', $pun_config['o_board_title'], $mail_subject);
> $mail_message = str_replace('<base_url>', $pun_config['o_base_url'].'/', $mail_message);
> $mail_message = str_replace('<username>', $username, $mail_message);
> $mail_message = str_replace('<password>', $password1, $mail_message);
> $mail_message = str_replace('<login_url>', $pun_config['o_base_url'].'/login.php', $mail_message);
> $mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'].' '.$lang_common['Mailer'], $mail_message);
>
> pun_mail($email1, $mail_subject, $mail_message);
>
> message($lang_register['Reg e-mail'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.', true);
> }
>
> pun_setcookie($new_uid, $password_hash, ($save_pass != '0') ? $now + 31536000 : 0);
>
> redirect('index.php', $lang_register['Reg complete']);
> }
>
>
> $page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_register['Register'];
> $required_fields = array('req_username' => $lang_common['Username'], 'req_password1' => $lang_common['Password'], 'req_password2' => $lang_prof_reg['Confirm pass'], 'req_email1' => $lang_common['E-mail'], 'req_email2' => $lang_common['E-mail'].' 2');
> $focus_element = array('register', 'req_username');
> require PUN_ROOT.'header.php';
> ?>
>
> <?php
> session_start();
>
> // Si le formulaire est validé, on vérifie la réponse
> // avec les valeurs de référence stockées en session
> if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
>
> list($word, $index, $position, $question) = $_SESSION['captcha'];
> $answer = substr($word, $index - 1, 1);
> $passed = ( (string)$_POST['captcha'] (string)$answer );
>
> }
>
> // Sinon on génère un nouveau test en prenant un mot au
> // hasard ainsi qu'une position de lettre dans ce mot
> else {
>
> // Chargement de la liste des mots
> $words = file('words.txt');
>
> // Sélection d'un mot au hasard
> $word = trim($words[rand(0, count($words) - 1)]);
>
> // Génération de l'index de la lettre à saisir
> $index = rand(1, strlen($word));
>
> // Transformation de l'index en toutes lettres
> if ( $index == strlen($word) ) $position = 'dernière';
> elseif ( $index == strlen($word) - 1 ) $position = 'avant-dernière';
> else {
> require_once 'nel.php';
> $position = enlettres($index, NEL_NIEME);
> if ( $position == 'premier' ) $position = 'première';
> }
>
> // Construction de la question
> $question = 'Quelle est '.( substr($position, 0, 1) == 'a' ? 'l\'' : 'la ' ).preg_replace('/[\w]/e', '"&#".ord("$0").";"', $position).' lettre du mot « '.preg_replace('/[\w]/e', '"&#".ord("$0").";"', $word).' » ?';
>
> // Stockage de la valeur en session
> $_SESSION['captcha'] = array($word, $index, $position, $question);
>
> }
> // Extraction des infos depuis la session et le résultat du formulaire
> list($word, $index, $position, $question) = $_SESSION['captcha'];
> $captcha = ( isset($_POST['captcha']) ) ? $_POST['captcha'] : '';
> ?>
>
> <div class="blockform">
> <h2><span><?php echo $lang_register['Register'] ?></span></h2>
> <div class="box">
> <form id="register" method="post" action="register.php?action=register" onsubmit="this.register.disabled=true;if(process_form(this)){return true;}else{this.register.disabledúlse;return false;}">
> <div class="inform">
> <div class="forminfo">
> <h3><?php echo $lang_common['Important information'] ?></h3>
> <p><?php echo $lang_register['Desc 1'] ?></p>
> <p><?php echo $lang_register['Desc 2'] ?></p>
> </div>
> <fieldset>
> <legend><?php echo $lang_register['Username legend'] ?></legend>
> <div class="infldset">
> <input type="hidden" name="form_sent" value="1" />
> <label><strong><?php echo $lang_common['Username'] ?></strong><br /><input type="text" name="req_username" size="25" maxlength="25" /><br /></label>
> </div>
> </fieldset>
> </div>
> <?php if ($pun_config['o_regs_verify'] == '0'): ?> <div class="inform">
> <fieldset>
> <legend><?php echo $lang_register['Pass legend 1'] ?></legend>
> <div class="infldset">
> <label class="conl"><strong><?php echo $lang_common['Password'] ?></strong><br /><input type="password" name="req_password1" size="16" maxlength="16" /><br /></label>
> <label class="conl"><strong><?php echo $lang_prof_reg['Confirm pass'] ?></strong><br /><input type="password" name="req_password2" size="16" maxlength="16" /><br /></label>
> <p class="clearb"><?php echo $lang_register['Pass info'] ?></p>
> </div>
> </fieldset>
> </div>
> <?php endif; ?> <div class="inform">
> <fieldset>
> <legend><?php echo ($pun_config['o_regs_verify'] == '1') ? $lang_prof_reg['E-mail legend 2'] : $lang_prof_reg['E-mail legend'] ?></legend>
> <div class="infldset">
> <?php if ($pun_config['o_regs_verify'] == '1'): ?> <p><?php echo $lang_register['E-mail info'] ?></p>
> <?php endif; ?> <label><strong><?php echo $lang_common['E-mail'] ?></strong><br />
> <input type="text" name="req_email1" size="50" maxlength="50" /><br /></label>
> <?php if ($pun_config['o_regs_verify'] == '1'): ?> <label><strong><?php echo $lang_register['Confirm e-mail'] ?></strong><br />
> <input type="text" name="req_email2" size="50" maxlength="50" /><br /></label>
> <?php endif; ?> </div>
> </fieldset>
> </div>
>
> <div class="inform">
> <fieldset>
> <legend><?php echo $lang_prof_reg['Localisation legend'] ?></legend>
> <div class="infldset">
> <label><?php echo $lang_prof_reg['Timezone'] ?>: <?php echo $lang_prof_reg['Timezone info'] ?>
> <br /><select id="time_zone" name="timezone">
> <option value="-12"<?php if ($pun_config['o_server_timezone'] == -12 ) echo ' selected="selected"' ?>>-12</option>
> [snip les différentes options ]
> <option value="14"<?php if ($pun_config['o_server_timezone'] == 14 ) echo ' selected="selected"' ?>>+14</option>
> </select>
> <br /></label>
> <?php
>
> $languages = array();
> $d = dir(PUN_ROOT.'lang');
> while (($entry = $d->read()) !== false)
> {
> if ($entry != '.' && $entry != '..' && is_dir(PUN_ROOT.'lang/'.$entry) && file_exists(PUN_ROOT.'lang/'.$entry.'/common.php'))
> $languages[] = $entry;
> }
> $d->close();
>
> // Only display the language selection box if there's more than one language available
> if (count($languages) > 1)
> {
>
> ?>
> <label><?php echo $lang_prof_reg['Language'] ?>: <?php echo $lang_prof_reg['Language info'] ?>
> <br /><select name="language">
> <?php
>
> while (list(, $temp) = @each($languages))
> {
> if ($pun_config['o_default_lang'] == $temp)
> echo "\t\t\t\t\t\t\t\t".'<option value="'.$temp.'" selected="selected">'.$temp.'</option>'."";
> else
> echo "\t\t\t\t\t\t\t\t".'<option value="'.$temp.'">'.$temp.'</option>'."";
> }
>
> ?>
> </select>
> <br /></label>
> <?php
>
> }
> ?>
> </div>
> </fieldset>
> </div>
> <div class="inform">
> <fieldset>
> <legend><?php echo $lang_prof_reg['Privacy options legend'] ?></legend>
> <div class="infldset">
> <p><?php echo $lang_prof_reg['E-mail setting info'] ?></p>
> <div class="rbox">
> <label><input type="radio" name="email_setting" value="0" /><?php echo $lang_prof_reg['E-mail setting 1'] ?><br /></label>
> <label><input type="radio" name="email_setting" value="1" checked="checked" /><?php echo $lang_prof_reg['E-mail setting 2'] ?><br /></label>
> <label><input type="radio" name="email_setting" value="2" /><?php echo $lang_prof_reg['E-mail setting 3'] ?><br /></label>
> </div>
> <p><?php echo $lang_prof_reg['Save user/pass info'] ?></p>
> <div class="rbox">
> <label><input type="checkbox" name="save_pass" value="1" checked="checked" /><?php echo $lang_prof_reg['Save user/pass'] ?><br /></label>
> </div>
> </div>
> </fieldset>
> </div>
>
>
> <?php if ( isset($passed) ) : if ( TRUE $passed ) : ?>
> <p><strong>Bravo</strong>, vous avez trouvé la bonne réponse ! <a href="<?php echo $_SERVER['PHP_SELF']; ?>">Recommencer</a>.</p>
> <?php else : ?>
> <p><strong>Désolé</strong>, ce n'est pas la bonne réponse !</p>
> <?php endif; endif; ?>
> <?php if ( !isset($passed) || !$passed ) : ?>
>
> <div class="inform">
> <fieldset>
> <legend>Test de captcha</legend>
> <p style="font-weight:bold">
> <?php echo $question; ?>
> <input type="text" name="captcha" size="1" maxlength="1" value="<?php echo $captcha; ?>" />
> <input type="submit" value="Valider" />
> </p>
> </fieldset>
> </div>
>
> <?php endif; ?>
>
> <p><input type="submit" name="register" value="<?php echo $lang_register['Register'] ?>" /></p>
> </form>
> </div>
> </div>
> <?php
>
> require PUN_ROOT.'footer.php';
</copie register.php>
Il existe donc 2 "submit" dans ce formulaire : l'un pour vérifier si la
réponse au captcha est bonne et l'autre pour l'enregistrement de
l'inscription.
Le problème est que le "submit" du captcha, même si la réponse est
fausse, enregistre l'inscription, et si on l'ignore (puisqu'il n'y a pas
de condition obligatoire passque je sais pas faire :-( ), le
"submit" d'enregistrement accepte celui-ci sans broncher.
Il faudrait donc que le contrôle soit effectif (c'est évidemment le but
de l'insertion de ce captcha) et que le "submit" d'enregistrement ne
puisse être validé tant que ce contrôle n'est pas fait.
Je précise que le fichier texte comportant les mots et le fichier
nel.php ont été installés dans le même dossier que le formulaire dont le
nom est "register.php".
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/
problème se situe au niveau de l'insertion de son captcha dans un
formulaire existant.
J'en restranscris ici l'essentiel pour une meilleure compréhension :
<copie register.php>
> <?php
>
> define('PUN_ROOT', './');
> require PUN_ROOT.'include/common.php';
>
>
> // If we are logged in, we shouldn't be here
> if (!$pun_user['is_guest'])
> {
> header('Location: index.php');
> exit;
> }
>
> // Load the register.php language file
> require PUN_ROOT.'lang/'.$pun_user['language'].'/register.php';
>
> // Load the register.php/profile.php language file
> require PUN_ROOT.'lang/'.$pun_user['language'].'/prof_reg.php';
>
> if ($pun_config['o_regs_allow'] == '0')
> message($lang_register['No new regs']);
>
>
> // User pressed the cancel button
> if (isset($_GET['cancel']))
> redirect('index.php', $lang_register['Reg cancel redirect']);
>
>
> else if ($pun_config['o_rules'] == '1' && !isset($_GET['agree']) && !isset($_POST['form_sent']))
> {
> $page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_register['Register'];
> require PUN_ROOT.'header.php';
>
> ?>
> <div class="blockform">
> <h2><span><?php echo $lang_register['Forum rules'] ?></span></h2>
> <div class="box">
> <form method="get" action="register.php">
> <div class="inform">
> <fieldset>
> <legend><?php echo $lang_register['Rules legend'] ?></legend>
> <div class="infldset">
> <p><?php echo $pun_config['o_rules_message'] ?></p>
> </div>
> </fieldset>
> </div>
> <p><input type="submit" name="agree" value="<?php echo $lang_register['Agree'] ?>" /><input type="submit" name="cancel" value="<?php echo $lang_register['Cancel'] ?>" /></p>
> </form>
> </div>
> </div>
> <?php
>
> require PUN_ROOT.'footer.php';
> }
>
>
> else if (isset($_POST['form_sent']))
> {
> // Check that someone from this IP didn't register a user within the last hour (DoS prevention)
> $result = $db->query('SELECT 1 FROM '.$db->prefix.'users WHERE registration_ip=\''.get_remote_address().'\' AND registered>'.(time() - 3600)) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
>
> if ($db->num_rows($result))
> message($lang_register['User same IP']);
>
> $username = pun_trim($_POST['req_username']);
> $email1 = strtolower(trim($_POST['req_email1']));
>
> if ($pun_config['o_regs_verify'] == '1')
> {
> $email2 = strtolower(trim($_POST['req_email2']));
>
> $password1 = random_pass(8);
> $password2 = $password1;
> }
> else
> {
> $password1 = trim($_POST['req_password1']);
> $password2 = trim($_POST['req_password2']);
> }
>
> [snip les différents autres contrôles ]
>
>
> // Insert the new user into the database. We do this now to get the last inserted id for later use.
> $now = time();
>
> $intial_group_id = ($pun_config['o_regs_verify'] == '0') ? $pun_config['o_default_user_group'] : PUN_UNVERIFIED;
> $password_hash = pun_hash($password1);
>
> // Add the user
> $db->query('INSERT INTO '.$db->prefix.'users (username, group_id, password, email, email_setting, save_pass, timezone, language, style, registered, registration_ip, last_visit) VALUES(\''.$db->escape($username).'\', '.$intial_group_id.', \''.$password_hash.'\', \''.$email1.'\', '.$email_setting.', '.$save_pass.', '.$timezone.' , \''.$db->escape($language).'\', \''.$pun_config['o_default_style'].'\', '.$now.', \''.get_remote_address().'\', '.$now.')') or error('Unable to create user', __FILE__, __LINE__, $db->error());
> $new_uid = $db->insert_id();
>
>
> [snip les différents contrôles ]
>
> // Must the user verify the registration or do we log him/her in right now?
> if ($pun_config['o_regs_verify'] == '1')
> {
> // Load the "welcome" template
> $mail_tpl = trim(file_get_contents(PUN_ROOT.'lang/'.$pun_user['language'].'/mail_templates/welcome.tpl'));
>
> // The first row contains the subject
> $first_crlf = strpos($mail_tpl, "");
> $mail_subject = trim(substr($mail_tpl, 8, $first_crlf-8));
> $mail_message = trim(substr($mail_tpl, $first_crlf));
>
> $mail_subject = str_replace('<board_title>', $pun_config['o_board_title'], $mail_subject);
> $mail_message = str_replace('<base_url>', $pun_config['o_base_url'].'/', $mail_message);
> $mail_message = str_replace('<username>', $username, $mail_message);
> $mail_message = str_replace('<password>', $password1, $mail_message);
> $mail_message = str_replace('<login_url>', $pun_config['o_base_url'].'/login.php', $mail_message);
> $mail_message = str_replace('<board_mailer>', $pun_config['o_board_title'].' '.$lang_common['Mailer'], $mail_message);
>
> pun_mail($email1, $mail_subject, $mail_message);
>
> message($lang_register['Reg e-mail'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.', true);
> }
>
> pun_setcookie($new_uid, $password_hash, ($save_pass != '0') ? $now + 31536000 : 0);
>
> redirect('index.php', $lang_register['Reg complete']);
> }
>
>
> $page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / '.$lang_register['Register'];
> $required_fields = array('req_username' => $lang_common['Username'], 'req_password1' => $lang_common['Password'], 'req_password2' => $lang_prof_reg['Confirm pass'], 'req_email1' => $lang_common['E-mail'], 'req_email2' => $lang_common['E-mail'].' 2');
> $focus_element = array('register', 'req_username');
> require PUN_ROOT.'header.php';
> ?>
>
> <?php
> session_start();
>
> // Si le formulaire est validé, on vérifie la réponse
> // avec les valeurs de référence stockées en session
> if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
>
> list($word, $index, $position, $question) = $_SESSION['captcha'];
> $answer = substr($word, $index - 1, 1);
> $passed = ( (string)$_POST['captcha'] (string)$answer );
>
> }
>
> // Sinon on génère un nouveau test en prenant un mot au
> // hasard ainsi qu'une position de lettre dans ce mot
> else {
>
> // Chargement de la liste des mots
> $words = file('words.txt');
>
> // Sélection d'un mot au hasard
> $word = trim($words[rand(0, count($words) - 1)]);
>
> // Génération de l'index de la lettre à saisir
> $index = rand(1, strlen($word));
>
> // Transformation de l'index en toutes lettres
> if ( $index == strlen($word) ) $position = 'dernière';
> elseif ( $index == strlen($word) - 1 ) $position = 'avant-dernière';
> else {
> require_once 'nel.php';
> $position = enlettres($index, NEL_NIEME);
> if ( $position == 'premier' ) $position = 'première';
> }
>
> // Construction de la question
> $question = 'Quelle est '.( substr($position, 0, 1) == 'a' ? 'l\'' : 'la ' ).preg_replace('/[\w]/e', '"&#".ord("$0").";"', $position).' lettre du mot « '.preg_replace('/[\w]/e', '"&#".ord("$0").";"', $word).' » ?';
>
> // Stockage de la valeur en session
> $_SESSION['captcha'] = array($word, $index, $position, $question);
>
> }
> // Extraction des infos depuis la session et le résultat du formulaire
> list($word, $index, $position, $question) = $_SESSION['captcha'];
> $captcha = ( isset($_POST['captcha']) ) ? $_POST['captcha'] : '';
> ?>
>
> <div class="blockform">
> <h2><span><?php echo $lang_register['Register'] ?></span></h2>
> <div class="box">
> <form id="register" method="post" action="register.php?action=register" onsubmit="this.register.disabled=true;if(process_form(this)){return true;}else{this.register.disabledúlse;return false;}">
> <div class="inform">
> <div class="forminfo">
> <h3><?php echo $lang_common['Important information'] ?></h3>
> <p><?php echo $lang_register['Desc 1'] ?></p>
> <p><?php echo $lang_register['Desc 2'] ?></p>
> </div>
> <fieldset>
> <legend><?php echo $lang_register['Username legend'] ?></legend>
> <div class="infldset">
> <input type="hidden" name="form_sent" value="1" />
> <label><strong><?php echo $lang_common['Username'] ?></strong><br /><input type="text" name="req_username" size="25" maxlength="25" /><br /></label>
> </div>
> </fieldset>
> </div>
> <?php if ($pun_config['o_regs_verify'] == '0'): ?> <div class="inform">
> <fieldset>
> <legend><?php echo $lang_register['Pass legend 1'] ?></legend>
> <div class="infldset">
> <label class="conl"><strong><?php echo $lang_common['Password'] ?></strong><br /><input type="password" name="req_password1" size="16" maxlength="16" /><br /></label>
> <label class="conl"><strong><?php echo $lang_prof_reg['Confirm pass'] ?></strong><br /><input type="password" name="req_password2" size="16" maxlength="16" /><br /></label>
> <p class="clearb"><?php echo $lang_register['Pass info'] ?></p>
> </div>
> </fieldset>
> </div>
> <?php endif; ?> <div class="inform">
> <fieldset>
> <legend><?php echo ($pun_config['o_regs_verify'] == '1') ? $lang_prof_reg['E-mail legend 2'] : $lang_prof_reg['E-mail legend'] ?></legend>
> <div class="infldset">
> <?php if ($pun_config['o_regs_verify'] == '1'): ?> <p><?php echo $lang_register['E-mail info'] ?></p>
> <?php endif; ?> <label><strong><?php echo $lang_common['E-mail'] ?></strong><br />
> <input type="text" name="req_email1" size="50" maxlength="50" /><br /></label>
> <?php if ($pun_config['o_regs_verify'] == '1'): ?> <label><strong><?php echo $lang_register['Confirm e-mail'] ?></strong><br />
> <input type="text" name="req_email2" size="50" maxlength="50" /><br /></label>
> <?php endif; ?> </div>
> </fieldset>
> </div>
>
> <div class="inform">
> <fieldset>
> <legend><?php echo $lang_prof_reg['Localisation legend'] ?></legend>
> <div class="infldset">
> <label><?php echo $lang_prof_reg['Timezone'] ?>: <?php echo $lang_prof_reg['Timezone info'] ?>
> <br /><select id="time_zone" name="timezone">
> <option value="-12"<?php if ($pun_config['o_server_timezone'] == -12 ) echo ' selected="selected"' ?>>-12</option>
> [snip les différentes options ]
> <option value="14"<?php if ($pun_config['o_server_timezone'] == 14 ) echo ' selected="selected"' ?>>+14</option>
> </select>
> <br /></label>
> <?php
>
> $languages = array();
> $d = dir(PUN_ROOT.'lang');
> while (($entry = $d->read()) !== false)
> {
> if ($entry != '.' && $entry != '..' && is_dir(PUN_ROOT.'lang/'.$entry) && file_exists(PUN_ROOT.'lang/'.$entry.'/common.php'))
> $languages[] = $entry;
> }
> $d->close();
>
> // Only display the language selection box if there's more than one language available
> if (count($languages) > 1)
> {
>
> ?>
> <label><?php echo $lang_prof_reg['Language'] ?>: <?php echo $lang_prof_reg['Language info'] ?>
> <br /><select name="language">
> <?php
>
> while (list(, $temp) = @each($languages))
> {
> if ($pun_config['o_default_lang'] == $temp)
> echo "\t\t\t\t\t\t\t\t".'<option value="'.$temp.'" selected="selected">'.$temp.'</option>'."";
> else
> echo "\t\t\t\t\t\t\t\t".'<option value="'.$temp.'">'.$temp.'</option>'."";
> }
>
> ?>
> </select>
> <br /></label>
> <?php
>
> }
> ?>
> </div>
> </fieldset>
> </div>
> <div class="inform">
> <fieldset>
> <legend><?php echo $lang_prof_reg['Privacy options legend'] ?></legend>
> <div class="infldset">
> <p><?php echo $lang_prof_reg['E-mail setting info'] ?></p>
> <div class="rbox">
> <label><input type="radio" name="email_setting" value="0" /><?php echo $lang_prof_reg['E-mail setting 1'] ?><br /></label>
> <label><input type="radio" name="email_setting" value="1" checked="checked" /><?php echo $lang_prof_reg['E-mail setting 2'] ?><br /></label>
> <label><input type="radio" name="email_setting" value="2" /><?php echo $lang_prof_reg['E-mail setting 3'] ?><br /></label>
> </div>
> <p><?php echo $lang_prof_reg['Save user/pass info'] ?></p>
> <div class="rbox">
> <label><input type="checkbox" name="save_pass" value="1" checked="checked" /><?php echo $lang_prof_reg['Save user/pass'] ?><br /></label>
> </div>
> </div>
> </fieldset>
> </div>
>
>
> <?php if ( isset($passed) ) : if ( TRUE $passed ) : ?>
> <p><strong>Bravo</strong>, vous avez trouvé la bonne réponse ! <a href="<?php echo $_SERVER['PHP_SELF']; ?>">Recommencer</a>.</p>
> <?php else : ?>
> <p><strong>Désolé</strong>, ce n'est pas la bonne réponse !</p>
> <?php endif; endif; ?>
> <?php if ( !isset($passed) || !$passed ) : ?>
>
> <div class="inform">
> <fieldset>
> <legend>Test de captcha</legend>
> <p style="font-weight:bold">
> <?php echo $question; ?>
> <input type="text" name="captcha" size="1" maxlength="1" value="<?php echo $captcha; ?>" />
> <input type="submit" value="Valider" />
> </p>
> </fieldset>
> </div>
>
> <?php endif; ?>
>
> <p><input type="submit" name="register" value="<?php echo $lang_register['Register'] ?>" /></p>
> </form>
> </div>
> </div>
> <?php
>
> require PUN_ROOT.'footer.php';
</copie register.php>
Il existe donc 2 "submit" dans ce formulaire : l'un pour vérifier si la
réponse au captcha est bonne et l'autre pour l'enregistrement de
l'inscription.
Le problème est que le "submit" du captcha, même si la réponse est
fausse, enregistre l'inscription, et si on l'ignore (puisqu'il n'y a pas
de condition obligatoire passque je sais pas faire :-( ), le
"submit" d'enregistrement accepte celui-ci sans broncher.
Il faudrait donc que le contrôle soit effectif (c'est évidemment le but
de l'insertion de ce captcha) et que le "submit" d'enregistrement ne
puisse être validé tant que ce contrôle n'est pas fait.
Je précise que le fichier texte comportant les mots et le fichier
nel.php ont été installés dans le même dossier que le formulaire dont le
nom est "register.php".
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/

Poser une question


Ah, je suppose que c'est moi, ça.
Aaaargh !
Tu voudrais vraiment me faire lire un tel code, avec des lignes de trois
kilomètres, inséré sous forme de citation avec des caractères « > » à
chaque ligne ??? Je vais plutôt lire la phrase qui suit.
Je crois que ton problème est là : pourquoi deux « submit » ? Il te
faut un seul bouton de submit, qui envoie l'ensemble des données du
formulaire, y compris le champ texte censé contenir « 4 » si la question
est « combien font 2 et 2 ». Lorsque le serveur reçoit la requête, il
commence par vérifier que cette valeur est bien mise à 4, et seulement
dans ce cas il traite le reste du formulaire.
C'est bien pour cela qu'il faut un seul submit.
Cordialement,
--
Olivier Miakinen
Olivier Miakinen ecrit ce qui suit en ce 12.11.2008 22:59 :
Ben voui, puisque c'est ton oeuvre que je tente d'insérer ;-)
C'était pour te permettre de suivre le cheminement du formulaire, au cas
où tu estimerais que le code supplémentaire aurait eu sa place ailleurs
qu'à l'endroit où je l'ai placé.
Parce que j'imagine (à tort, apparemment) que le premier doit d'abord
faire le test avant de permettre l'activation du second. J'avais essayé
avec le second seul : dans ce cas, le test captcha n'est apparemment pas
fait puisque quand la réponse est mauvaise, l'inscription est quand même
validée.
Apparemment non : j'ai fait plusieurs essais, sans succès, comme si ce
contrôle était totalement ignoré après l'envoi.
A toutes fins utiles, ce captcha est celui qui interroge sur la nature
et l'emplacement d'une lettre dans un mot dont la liste fait l'objet
d'un fichier texte.
Itou de même,
--
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/
Non ?
Bien déçu je suis !
J'aurais peut-être pu apprendre ce que ce triturage pourrait bien tenter
de réaliser ... ?!
Déjà là :
require PUN_ROOT.'include/common.php';
c'est quoi ce common.php ?
Ensuite tout un tas de bazars
(sans doute pour tenter de traiter du multilingue ?)
Malheureusement ... comment s'y retrouve t-on dans ce truc faisant appel
à des fonctions qui en ont absentes ?
et que le "capitaine chat" devrait se trouver ici,
juste avant l'insertion en BdD (et dont il doit en manquer le début, me
semble-ce : la condition finale pour pouvoir continuer je ne la vois pas)
// Insert the new user into the database. We do this now to get the
last inserted id for later use.
$now = time();
Bon ça aurait été plus simple sans une telle usine, et que le code eût
eu été produit (et donc compris) par son utilisateur.
N'y aurait-il pas moyen à moyenner de demander aimablement au créateur
du code qu'il intègre lui-même un captcha ?
--
sm
Désolé, c'est trop touffu pour moi.
Premièrement, mes éditeurs de texte sont en 80 colonnes, alors quand ça
dépasse je ne vois plus l'indentation. Deuxièmement, du texte cité dans
un article s'affiche chez moi en vert, ce qui me va bien quand ce sont
vraiment quelques lignes de citation, mais il ne faut pas dépasser plus
d'une dizaines de lignes d'affilée comme ça. Et surtout il serait plus
simple de commencer par fournir une URL où voir le code HTML généré, et
éventuellement un lien vers le code source complet.
Ben non. Lorsque tu fais la requête HTTP correspondant au second
formulaire, comment veux-tu qu'il sache qu'une requête a déjà été faite
par le même utilisateur pour le premier formulaire, et surtout que la
réponse était positive ? Il faut tout traiter en une seule fois.
Bon. Je suppose que tu as déjà fait le traitement correspondant à
req_username, req_password, req_email, et ainsi de suite, et que le code
PHP correspondant est du genre :
{
...
faire quelque chose avec $_REQUEST['req_username'] etc.
...
}
Eh bien avec le captcha, ton code sera tout simplement :
if ($_REQUEST['captcha'] == '4') {
...
faire quelque chose avec $_REQUEST['req_username'] etc.
...
} else {
... réponse indiquant que la captcha n'est pas bon...
}
Olivier Miakinen ecrit ce qui suit en ce 13.11.2008 00:36 :
Tu n'utilises pas un éditeur spécialisé ?
En libre, il y a DevPHP qui me paraît très bien. C'est avec lui que j'
*essaye* de comprendre le cheminement des scripts.
Le code généré est visible à partir de l'affichage du formulaire
d'inscription sur http://mycorance.free.fr/forum/index.php : suivre le
lien d'inscription puis valider la première page des règles à accepter.
Si tu préfères, je peux reproduire ici ce code.
http://mycorance.free.fr/forum/register.php
Heu ... perso, je n'ai rien fait : il s'agit toujours du code de Rickard
Andersson pour PunBB.
Ce n'est malheureusement pas aussi simple que ça :-(
Si ce l'était, je pourrais tenter de recopier servilement le code en
modifiant les variables pour le captcha. Ménon, il fait que m'énerver en
faisant appel à d'autres scripts sur d'autres pages PHP.
Et comment je n'entrave que dalle à PHP, il est évident que ça
m'embrouille encore davantage.
Si seulement ...
Ben là, tu vois, je suis déjà largué. Car "faire quelque chose ..." me
laisse déjà au bord du chemin, désolé.
(je l'savais qu'il aurait été plus simple de refuser toute inscription
avec une adresse Email terminée en .ru ou .uk :-( )
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/