【发布时间】:2015-12-31 16:55:42
【问题描述】:
升级到 php7 后,BCryptPasswordEncoder 会抛出以下错误,例如关于使用 FOSUserBundle 标准注册页面时的注册:
“在 C:\xampp\htdocs\ascentary 中不推荐使用密码哈希的 'salt' 选项 \vendor\symfony\symfony\src\Symfony\Component\Security\Core\Encoder\BCryptPasswordEncoder.php 第 81 行 " 在 C:\xampp\htdocs\testproject\vendor\behat\behat\src\Behat\Testwork\Call\Handler\RuntimeCallHandler。"
我已经找到了这个问题,问题是 FOS UserManager 类,它调用:
/**
* {@inheritDoc}
*/
public function updatePassword(UserInterface $user)
{
if (0 !== strlen($password = $user->getPlainPassword())) {
$encoder = $this->getEncoder($user);
$user->setPassword($encoder->encodePassword($password, $user->getSalt()));
$user->eraseCredentials();
}
}
在此处传递 $user->getSalt() 会引发错误,因为在 php7 中,您不再允许将自定义盐传递给 bcrypt encoding / password_hash 函数。另外,我在基础 fos 用户实体中看到了一个问题,因为在它的构造函数中,salt 设置为:
$this->salt = base_convert(sha1(uniqid(mt_rand(), true)), 16, 36);
问题:
(1) 我上面贴的错误怎么解决?可能覆盖了UserManager,或者fos有没有提供的解决方案?
(2) 如何妥善保护自动生成的盐?
(3) 是否需要任何其他更新,例如更新 ircmaxell 库?
【问题讨论】:
标签: php symfony fosuserbundle bcrypt password-hash