【问题标题】:CakePHP fills in the password field on create new user failureCakePHP 在创建新用户失败时填写密码字段
【发布时间】:2010-01-25 04:19:46
【问题描述】:

我在注册新用户表单中使用 CakePHP 时出现了一些有趣的行为。这是一个非常基本的用户名、电子邮件和密码表单。

当用户输入不完整的表单时,它看起来像这样:

当然,新用户的创建会失败,因为密码和电子邮件字段为空。当显示表单错误时,它看起来像这样:

我不确定为什么密码字段会神奇地填满文字。不应该是空的吗?

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

    只是不要在视图中将输入字段命名为“密码”,而是命名为“新密码”。这使您有机会对未散列的密码(长度、强度、..)进行验证,然后使用回调 beforeSave() 手动对其进行散列:

    function beforeSave() {
        parent::beforeSave();
        if (isset($this->data[$this->name]['newPassword']) && !empty($this->data[$this->name]['newPassword']))
            $this->data[$this->name]['password'] = Security::hash($this->data[$this->name]['newPassword'], 'sha256', true);
        return true;
    }
    

    【讨论】:

      【解决方案2】:

      看起来它正在填充密码的哈希值。

      您的问题与 Auth 处理 $this->data 对象内的自动密码哈希的方式有关。我相信它是默认启用的,它可能是一个 hack,我通过在相关操作结束时将 $this->data['User']['password'] 设置为空字符串来解决这个问题。

      【讨论】:

        【解决方案3】:

        似乎密码字段已预先填充了sha1($_POST['password']),当然$_POST['password'] 不包含任何内容,这与sha1('') 相同。

        我不熟悉 CakePHP,但如果可以的话,您应该禁用 password 字段的前缀。

        【讨论】:

          【解决方案4】:

          您可以通过告诉 AuthComponent 使用您的用户模型来获取诸如哈希之类的方法来禁用密码哈希:

          $this->Auth->authenticate = $this->User;
          

          然后您可以覆盖导致问题的方法,并使用它来代替:

          function hashPasswords($data) {
              // do nothing
              return $data;
          }
          

          显然,以上将完全禁用密码散列,但如果您在此示例中应用正确的条件,您可以仅在需要时阻止散列。

          这里有完整的细节:http://teknoid.wordpress.com/2008/10/08/demystifying-auth-features-in-cakephp-12/

          【讨论】:

            【解决方案5】:

            甚至比这里的任何解决方案都更好(除了关于验证未链接到 Auth 组件的字段然后手动将散列数据移动到正确索引的信息 - 这是一个很好的建议)是让 View层处理这个。

            由于您无论如何都无法读取该字段,并且良好的做法是不记住或自动填充 *** 屏蔽字段(在这种情况下为密码),您应该在视图中手动将字段值设置为空。

            IE:

            <?php
                ...
                echo $form->input( 'User.password', array(
                    'type' => 'password',
                    'value' => ''
                ));
                ...
            ?>
            

            这将确保即使数据数组中的值经过哈希处理,该哈希值也不会显示在您的字段中。

            【讨论】:

              猜你喜欢
              • 2010-11-22
              • 1970-01-01
              • 1970-01-01
              • 2012-09-28
              • 2018-01-05
              • 2014-07-22
              • 2022-01-17
              • 1970-01-01
              • 2017-05-01
              相关资源
              最近更新 更多