【发布时间】:2010-01-25 04:19:46
【问题描述】:
我在注册新用户表单中使用 CakePHP 时出现了一些有趣的行为。这是一个非常基本的用户名、电子邮件和密码表单。
当用户输入不完整的表单时,它看起来像这样:
当然,新用户的创建会失败,因为密码和电子邮件字段为空。当显示表单错误时,它看起来像这样:
我不确定为什么密码字段会神奇地填满文字。不应该是空的吗?
【问题讨论】:
我在注册新用户表单中使用 CakePHP 时出现了一些有趣的行为。这是一个非常基本的用户名、电子邮件和密码表单。
当用户输入不完整的表单时,它看起来像这样:
当然,新用户的创建会失败,因为密码和电子邮件字段为空。当显示表单错误时,它看起来像这样:
我不确定为什么密码字段会神奇地填满文字。不应该是空的吗?
【问题讨论】:
只是不要在视图中将输入字段命名为“密码”,而是命名为“新密码”。这使您有机会对未散列的密码(长度、强度、..)进行验证,然后使用回调 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;
}
【讨论】:
看起来它正在填充密码的哈希值。
您的问题与 Auth 处理 $this->data 对象内的自动密码哈希的方式有关。我相信它是默认启用的,它可能是一个 hack,我通过在相关操作结束时将 $this->data['User']['password'] 设置为空字符串来解决这个问题。
【讨论】:
似乎密码字段已预先填充了sha1($_POST['password']),当然$_POST['password'] 不包含任何内容,这与sha1('') 相同。
我不熟悉 CakePHP,但如果可以的话,您应该禁用 password 字段的前缀。
【讨论】:
您可以通过告诉 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/
【讨论】:
甚至比这里的任何解决方案都更好(除了关于验证未链接到 Auth 组件的字段然后手动将散列数据移动到正确索引的信息 - 这是一个很好的建议)是让 View层处理这个。
由于您无论如何都无法读取该字段,并且良好的做法是不记住或自动填充 *** 屏蔽字段(在这种情况下为密码),您应该在视图中手动将字段值设置为空。
IE:
<?php
...
echo $form->input( 'User.password', array(
'type' => 'password',
'value' => ''
));
...
?>
这将确保即使数据数组中的值经过哈希处理,该哈希值也不会显示在您的字段中。
【讨论】: