Php jQuery验证&x2B;安全图像问题

Php jQuery验证&x2B;安全图像问题,php,validation,jquery,captcha,Php,Validation,Jquery,Captcha,我在使用插件时遇到了一些奇怪的问题。首先是我的代码: formvalid.js var v = jQuery("#sendform").validate({ rules: { /* some other rules */ captcha: { required: true, remote: "securimage/process.php" }

我在使用插件时遇到了一些奇怪的问题。首先是我的代码:

formvalid.js

var v = jQuery("#sendform").validate({
        rules: {
            /* some other rules */
            captcha: {
                required: true,
                remote: "securimage/process.php"
            }
        },            
        messages: {
            /* some other messages */
            captcha: {
        required:"Security code is required",
        remote:"Security code is incorrect!"
        }
        }
    });
process.php

<?php
/* I tried with and without session_start(). 
Both ways works with same probelm (read next)*/
//session_start();
include_once '../securimage/securimage.php';

$securimage = new Securimage();

if ($securimage->check($_GET['captcha']) == false) 
    echo "false";

else
    echo "true";
?>
<?php
include_once 'securimage/securimage.php';

//echo $_POST['captcha'];

$securimage = new Securimage();
//echo "<br/>".$securimage->getCode();

if($_POST['captcha'] && $securimage->check($_POST['captcha']))
{
    //do sending
}
?>
所以,问题是当我用AJAX请求检查
安全代码时,AJAX工作正常,但当我发送表单时,
$securimage->check($\u POST['captcha'))
in
sendform.php
返回
false
。然后我尝试禁用远程capctha验证,并在
sendform.php
中禁用viola
securimage->check($\u POST['captcha'])
返回
true

正如您在
sendform.php
中所看到的,I
echo
中有一些值,结果是:

案例1:启用AJAX验证码验证。 结果:

echo $_POST['captcha'];               // User_input_value;
echo $securimage->getCode();          // nothing
$securimage->check($_POST['captcha']) // false
echo $_POST['captcha'];               // User_input_value;
echo $securimage->getCode();          // code from image
$securimage->check($_POST['captcha']) // true (if equals)
案例2:禁用AJAX验证码验证。 结果:

echo $_POST['captcha'];               // User_input_value;
echo $securimage->getCode();          // nothing
$securimage->check($_POST['captcha']) // false
echo $_POST['captcha'];               // User_input_value;
echo $securimage->getCode();          // code from image
$securimage->check($_POST['captcha']) // true (if equals)
有人知道怎么做吗

谢谢你的建议。

不久前也问过同样的问题,每次检查后验证码都会重置

我的建议是在会话中设置一个标志,在
进程.php中设置为
TRUE
,然后在有效的验证码之后检查它,而不是在
sendform.php中设置
$securimage->check($\u POST['captcha'))

if ($securimage->check($_GET['captcha']) == false) {
    $_SESSION['valid'] = FALSE;
    echo "false";
} else {
    $_SESSION['valid'] = TRUE;
    echo "true";
}
以及:

if($_POST['captcha'] && isset($_SESSION['valid']) && $_SESSION['valid']) // set it back to false inside this!
现在有两个注意事项:

  • 由于您有两个单独的呼叫,因此仍有人可以在两个呼叫之间更改验证码
  • 因为这只是一个验证码,你很可能是在用它来防止垃圾邮件,我不会费心使用我上面发布的技术!事实上,我甚至不会在
    sendform.php
当然有人可能会向你发送垃圾邮件,但是如果你真的需要使用Ajax,那么你必须停止处理jQuery插件中的验证码,并在提交表单时验证验证码,就像最初的方法一样。

不久前问到的几乎一样,每次检查后验证码似乎都会重置

我的建议是在会话中设置一个标志,在
进程.php中设置为
TRUE
,然后在有效的验证码之后检查它,而不是在
sendform.php中设置
$securimage->check($\u POST['captcha'))

if ($securimage->check($_GET['captcha']) == false) {
    $_SESSION['valid'] = FALSE;
    echo "false";
} else {
    $_SESSION['valid'] = TRUE;
    echo "true";
}
以及:

if($_POST['captcha'] && isset($_SESSION['valid']) && $_SESSION['valid']) // set it back to false inside this!
现在有两个注意事项:

  • 由于您有两个单独的呼叫,因此仍有人可以在两个呼叫之间更改验证码
  • 因为这只是一个验证码,你很可能是在用它来防止垃圾邮件,我不会费心使用我上面发布的技术!事实上,我甚至不会在
    sendform.php

当然有人会向你发送垃圾邮件,但是如果你真的需要使用Ajax,那么你必须停止在jQuery插件中处理验证码,并在提交表单时验证它,就像最初的方法一样。

为了防止重置验证码,你应该在不调用check()的情况下验证自己php中的函数,如下代码所示

<?php
include_once 'securimage.php';
if(!isset($_GET['txtcaptcha']))
    return 'false';


$securimage = new Securimage();
$securecode = $securimage->getCode();

if (strtolower($securecode) != strtolower($_GET['txtcaptcha'])) 
    echo "false";

else
    echo "true";
?>

为了防止重置captch,您应该验证自己,而不必调用process.php中的check()函数,如下面的代码所示

<?php
include_once 'securimage.php';
if(!isset($_GET['txtcaptcha']))
    return 'false';


$securimage = new Securimage();
$securecode = $securimage->getCode();

if (strtolower($securecode) != strtolower($_GET['txtcaptcha'])) 
    echo "false";

else
    echo "true";
?>


谢谢您的建议!有趣的是,当jQ调用
process.php
(无论调用多少次)时,它都不会重置captcha!但当我在提交表单后检查验证码时,它不会返回任何内容。。。我已经在你的第二张纸条上写过了。要点是:为了防止垃圾邮件,你必须做服务器端验证,因为垃圾邮件机器人不使用任何JS,他们直接使用服务器…谢谢你的建议!有趣的是,当jQ调用
process.php
(无论调用多少次)时,它都不会重置captcha!但当我在提交表单后检查验证码时,它不会返回任何内容。。。我已经在你的第二张纸条上写过了。要点是:为了防止垃圾邮件,你必须进行服务器端验证,因为垃圾邮件机器人不使用任何JS,它们直接使用服务器。。。