Yii captcha客户端验证工作原理


How Yii captcha client side validation work?

我禁用了ajax验证,但表单中有'enableClientValidation'=>true。会话保存在数据库中。那么Yii如何在聚焦另一个字段时检查Captcha字段?我看不到net->allfirebug选项卡有任何变化。

客户端验证将JavaScript代码放在验证数据的页面底部,而不是使用Ajax。如果不在客户端存储答案,就无法使用JavaScript验证Captcha,除非使用Ajax,否则这是不可能的。但是Yii提供的内置Captcha只在表单提交时进行验证,即使启用了Ajax验证。

http://www.yiiframework.com/doc/api/1.1/CActiveForm它指出。。。

CActiveForm在AJAX方面存在一些限制验证支持。首先,它不通过文件上传进行验证字段。其次,它不应用于执行可能导致服务器端状态更改。例如,不适合执行CCaptchActions完成的CAPTCHA验证,因为每个验证请求将使测试数量增加一个。第三目前,它并不是为处理表格数据输入而设计的。

因此,如果你想在客户端验证Captcha,你必须使用Ajax,并且你必须自己编程,因为Yii默认情况下没有提供这个功能。

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

如果您想使用ajax验证或客户端验证,请务必调用。。

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

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

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

我们大多认为客户端的captcha验证是不可能的,但它是可能的。

是的,yii可以使用一个简单的哈希(单侧加密)公式在客户端进行captcha验证。由于这个原因,没有ajax请求,并且"我们看不到net->allfirebug选项卡有任何变化。"(Shayan说)

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

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.");
}

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

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

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

yii句子中的第二个注释意味着,当您使用ajax验证时,服务器端ajax验证会导致服务器端会话存储库中的captcha图像代码被刷新(我几天前遇到的问题),因为在ajax验证过程中,整个表单将被轴向提交给服务器,只验证一个字段。Yii为CCaptchaAction提供了一个默认值为3的testTime属性,以便在上次验证成功的情况下重用验证码。但这并没有用,因为如果在注册表单大规模检查用户名时,您的captcha字段为空,那么captcha验证将失败(而不是成功)。然而,对于我们来说,在CCaptchaValidator中的ajax验证中排除captcha验证是非常容易的。