【问题标题】:How Yii captcha client side validation work?Yii 验证码客户端验证如何工作?
【发布时间】:2012-08-27 17:14:50
【问题描述】:

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

【问题讨论】:

    标签: php yii


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      如果不调用 @987654321@,Ajax/客户端验证将无法工作。

      如果你想使用ajax验证或者客户端验证,一定要调用..

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

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

      希望它能解决你的问题。

      【讨论】:

        【解决方案3】:

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

        是的,yii 可以使用简单的哈希(一侧加密)公式在客户端进行验证码验证。并且由于这个原因没有ajax请求并且“我们看不到net->all 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 为 CCaptchaAction 提供了一个默认值为 3 的 testTime 属性,以便在之前的验证码验证成功时重用验证码。但这没有用,因为如果您的验证码字段在注册表单检查用户名时为空,则验证码验证将失败(不成功)。然而,对于我们来说,在 CCaptchaValidator 的 ajax 验证中排除验证码验证非常简单。

        【讨论】:

          猜你喜欢
          • 2014-09-29
          • 2015-03-06
          • 1970-01-01
          • 2014-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多