Securimage验证码 - 多种形式随机验证

时间:2017-12-12 13:39:43

标签: php captcha multiple-forms

我在页面上有多个表单,似乎有些奇怪或随机地验证。

  1. 如果我正确输入第一个代码,则每次都会正确验证相同的表单,直到错误输入代码为止。在此验证之后总是失败,直到我点击图像重新加载它,然后一切正常。
  2. 无论处理第一个表单,在单击图像重新加载之前,任何其他表单都无法通过验证。然后它开始传递,如第1点所示。但所有其他形式都将失败。
  3. 命名空间似乎没有帮助。

    这是view.php:

    $captcha->setNamespace($bUID);
    $captcha->display();
    echo $form->text('code'.$bUID, $code);
    

    这是controller.php:

    $captcha->setNamespace($_POST['buid']);
    if (!$captcha->check('code')) {
        array_push($this->form_errors, $this->error_code);
    }
    

    $ bUID是一个唯一的表单块编号,即每个表单字段都是唯一的。

    看起来即使每个表单都是唯一的,Securimage图像也是为所有表单创建的,而不是每个表单都创建一个。命名空间由于某种原因没有帮助。

    有没有办法为每个独特的表单创建一个具有唯一代码和路径的验证码图像?或者我没有正确使用命名空间?

    谢谢。

1 个答案:

答案 0 :(得分:0)

除了image_id之外,请尝试使用namespace选项。

此处代码,我用于多重目的:

require_once 'inc/securimage/securimage.php';

define('SECURIMAGE_OPTIONS', array(
    'securimage_path' => 'inc/securimage',
    'input_text' => 'Введите проверочный код',
    'show_audio_button' => false
));

function display_captcha($identity){
    echo Securimage::getCaptchaHtml(
        array_merge(
            SECURIMAGE_OPTIONS,
            array("image_id"=>$identity,
                "namespace"=>$identity,
            )
        )
    );

    $input_attrs = array();
    $input_attrs['type'] = 'hidden';
    $input_attrs['name'] = 'namespace';
    $input_attrs['id']   = 'namespace';
    $input_attrs['value'] = $identity;
    //with captcha component I add tag <input type="hidden" name="namespace"  ... /> for using in validation script 
    $input_attr = '';
    foreach($input_attrs as $name => $val) {
        $input_attr .= sprintf('%s="%s" ', $name, htmlspecialchars($val));
    }
    echo(sprintf('<input %s/>', $input_attr));
}

/*
 * Now you can use multiple captchas in forms:  with names: captcha1
 * <?php display_captcha("captcha1"); ?>
 *
 * And valudation code:
 * $image = new Securimage();
 * if(isset($_POST['namespace'])){
 *   $namespace = $_POST['namespace'];
 *   $image->setNamespace($namespace);
 * }
 * if (!$image->check($_POST['captcha_code'])) {
 *  ....
 * }
 * */