【发布时间】:2013-09-18 06:29:04
【问题描述】:
CakePHP 2.4
添加新用户时,我必须先对密码进行哈希处理,然后才能将其存储到数据库中。为此,我做了:
//UsersController
public $helpers = array('Html', 'Form');
public $components = array(
'Session',
'Auth' => array(
'loginRedirect' => array('controller' => 'users', 'action' => 'home', 'home'),
'logoutRedirect' => array('controller' => 'users', 'action' => 'logout')
)
);
public function add(){
if($this->request->is('post')){
$this->User->create();
if($this->User->save($this->request->data)){
$this->Session->setFlash('Saved!');
}
}
}
//UserModel
public function beforeSave(){
if(isset($this->data[$this->alias]['password']))
$this->data[$this->alias]['password'] = md5($this->data[$this->alias]['password']);
return true;
}
//add.ctp
echo $this->Form->create();
echo $this->Form->input('text', array('label'=>'Username', 'name'=>'username'));
echo $this->Form->input('text', array('label'=>'Full name', 'name'=>'fullname'));
echo $this->Form->input('password', array('label'=>'Password', 'name'=>'password'));
echo $this->Form->input('text', array('label'=>'Password hint', 'name'=>'pass_hint'));
echo $this->Form->input('text', array('label'=>'Email', 'name'=>'email'));
echo $this->Form->input('text', array('label'=>'Contact', 'name'=>'cell'));
echo $this->Form->end('Create account');
但问题是密码在没有经过哈希处理的情况下被存储!
提前谢谢...
更新:将视图代码更改为
echo $this->Form->create('User');
echo $this->Form->input('username', array('label'=>'Username'));
echo $this->Form->input('fullname', array('label'=>'Full name'));
echo $this->Form->input('pwd', array('label'=>'Password', 'type'=>'password'));
echo $this->Form->input('pass_hint', array('label'=>'Password hint'));
echo $this->Form->input('email', array('label'=>'Email'));
echo $this->Form->input('cell', array('label'=>'Contact'));
echo $this->Form->end('Create account');
【问题讨论】:
-
你没有加密它,你正在散列它。这是不同的 :) 提示:请参阅 dereuromark.de/2011/08/25/working-with-passwords-in-cakephp
-
好文章。但是这个时间表在密码字段中什么也没有。 beforeSave() 是
if (!empty($this->data[$this->alias]['pwd'])) { $this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['pwd']); } -
为什么要使用 md5?您至少应该使用 sha1 - 甚至像河豚这样的新标准之一可能会更好。如果您想这样做,您还需要命名您的字段 pwd(您不能/不应该仍然将其命名为密码)。如果您无法使其正常工作,请使用我的行为来获得更干净、更安全的方法。
-
是的,我也重命名了我的视图。我尝试了你的方式,但仍然没有运气。我认为我的 beforeSave() 没有被执行。那可能吗?我检查了 pr($this->data) 和 debug($this->data) 但没有打印,我的调试级别是 2。
-
我想提一提的是
AuthComponent::password()已被弃用,你应该在 cake 2.4 中使用Security::hash()
标签: cakephp encryption cakephp-2.4