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'))
insendform.php
返回false
。然后我尝试禁用远程capctha验证,并在sendform.php
中禁用violasecurimage->check($\u POST['captcha'])
返回true
正如您在sendform.php
中所看到的,Iecho
中有一些值,结果是:
案例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,它们直接使用服务器。。。