0

我刚刚安装了 php 7.4 并尝试使用我的帐户访问,但出现错误。任何想法 ?

Notice: Core\Hash::needsRehash() Algorithm "" not supported. 

我也试过不工作

$algo = 'bcrypt';
$algo = 'argon2id';

功能

public static function needsRehash($hash, $algo = null)
{
  if (!isset($algo) || $algo == 'default') {
    $algo = PASSWORD_DEFAULT;
  } elseif ($algo == 'bcrypt') {
    $algo = PASSWORD_BCRYPT;
  } elseif ($algo == 'argon2id') {
    $algo = PASSWORD_ARGON2ID;
  }

  if (!is_int($algo)) {
    trigger_error('Core\Hash::needsRehash() Algorithm "' . $algo . '" not supported.');
  }
4

2 回答 2

3

您检查!isset($algo),这意味着如果您传入一个空字符串,验证将失败。在这种情况下,我认为 using!isset()是不合适的,因为它始终设置为(除非它为 null - 但您可以改为显式测试)。

您可以检查 empty($algo), 或参数是否等于 null。检查empty()将不仅仅检查空字符串和空值(见下文)。

if (empty($algo) || $algo == 'default') {
// or
if ($algo === null || $algo == 'default') {

isset()

确定变量是否被视为已设置,这意味着变量是否已声明并且不同于 NULL。

empty()

确定一个变量是否被认为是空的。如果变量不存在或其值等于 FALSE,则认为该变量为空。如果变量不存在,empty() 不会生成警告。

于 2019-12-04T15:27:25.323 回答
3

您正在检查是否$algo为整数,但在 PHP 7.4 中,这些常量不再是整数;它们是可为空的字符串。

PHP 7.4 向后不兼容的更改

密码散列算法标识符现在是可为空的字符串,而不是整数。

  • PASSWORD_DEFAULT 为整数 1;现在是 NULL
  • PASSWORD_BCRYPT 是整数 1;现在是字符串'2y'
  • PASSWORD_ARGON2I 是 int 2;现在是字符串 'argon2i'
  • PASSWORD_ARGON2ID 为整数 3;现在是字符串 'argon2id'

正确使用常量 PASSWORD_DEFAULT、PASSWORD_BCRYPT、PASSWORD_ARGON2I 和 PASSWORD_ARGON2ID 的应用程序将继续正常运行。

您的代码没有正确使用它们。您假设它们是整数,并且您明确检查它们的值,但实际上您不需要。在 PHP7.4 中,您可以使用password_algos()该算法检查您的 PHP 安装中是否存在该算法。在以前的 PHP 版本中,您可以检查defined(PASSWORD_ARGON2I)算法是否已定义。

为了向后兼容,旧的整数值也被接受,但不应使用。只要坚持常数。

于 2019-12-04T16:05:48.793 回答