Yii验证码客户端验证如何工作?

时间:2012-08-27 17:14:51

标签: php yii

我已禁用ajax验证,但我的表单中有'enableClientValidation'=>true。 会话保存在数据库中。 然后如何Yii检查Captcha字段聚焦另一个字段?我无法看到net->所有firebug标签的任何变化。

3 个答案:

答案 0 :(得分:0)

客户端验证将JavaScript代码放在页面底部,用于验证数据而不是使用Ajax。由于没有使用JavaScript来验证Captcha而不在客户端存储答案,除非你使用Ajax,否则这是不可能的。但Yii提供的内置Captcha仅在表单提交时验证,即使启用了Ajax验证。

http://www.yiiframework.com/doc/api/1.1/CActiveForm它声明......

  

CActiveForm对其AJAX有一些限制   验证支持。首先,它不验证文件上传   fields.Second,它不应该用于执行可能的验证   导致服务器端状态改变。例如,它不适合   执行由CCaptchAction完成的CAPTCHA验证,因为每个   验证请求会将测试数量增加一个。第三,   它目前不适用于表格数据输入。

因此,如果您希望在客户端进行Captcha验证,则必须使用Ajax并且必须自己编程,因为Yii默认情况下不提供此功能。

答案 1 :(得分:0)

如果不调用$form->error(),Ajax /客户端验证将无法工作。

如果您想使用ajax验证或客户端验证,请务必致电..

$form->error($model, 'field')

..在每个需要实时验证的字段的视图文件中。

我希望它能解决你的问题。

答案 2 :(得分:0)

我们主要认为客户端的验证码验证是不可能的,但这是可能的。

是的,yii可以使用简单的哈希(单边加密)公式在客户端进行验证码验证。由于这个原因,没有ajax请求,“我们看不到net->所有firebug标签的任何变化。”(Shayan说)

有时我们可能会认为使用开源代码(如javascript)生成单边哈希是不可能的,但如果您根据自身加密句子或单词,则可能。因此,源和解密密钥都不存在(类似于php的crypt函数)。 php md5函数自动执行此操作。

var hash = jQuery('body').data('captcha.hash'); //hash in the jQuery data storage of body
if (hash == null)
    hash = 563;//this simple hash is generated by server and will be different for different captcha images
else
    hash = hash[1];
for(var i=value.length-1, h=0; i >= 0; --i) h+=value.toLowerCase().charCodeAt(i);
if(h != hash) {
    messages.push("The verification code is incorrect.");
}

因此,使用客户端验证器,验证码将在客户端和服务器中验证两次。

另一个注意事项:来自yii doc的正确句子是:

  

基于AJAX的验证有一些限制。首先,它不适用于文件上载字段。其次,它不应该用于执行可能导致服务器端状态更改的验证。第三,它目前不适用于表格数据输入。

yii句子中的第二个注释表示当您使用ajax验证时,服务器端ajax验证会导致服务器端会话存储库中的验证码图像代码被刷新(我几天前遇到的问题),因为在ajax中验证过程将整个表单提交给服务器以仅验证一个字段。 如果先前的验证码验证成功,Yii为testapt属性提供默认值3的CCaptchaAction以重用验证码。但它没有用,因为如果你的验证码字段是空的,当寄存器表格在ajaxically检查用户名时,它将是验证码验证的失败(不成功)。然而,解决方案就像馅饼或蛋糕一样简单,我们可以在CCaptchaValidator中的ajax验证中排除验证码验证。