PHP-вызов неопределенной функции hash_equals ()

любой может помочь мне решить эту проблему? я получаю ошибку ' call of undefined function hash_equals()' вот мой код:

$username = 'Admin';
$password = 'sample1Pasword';

$dbh = new PDO('mysql:host=localhost;dbname=test', $USER, $PASSWORD);

$sth = $dbh->prepare('
  SELECT
    hash
  FROM users
  WHERE
    username = :username
  LIMIT 1
  ');

$sth->bindParam(':username', $username);

$sth->execute();

$user = $sth->fetch(PDO::FETCH_OBJ);

// Hashing the password with its hash as the salt returns the same hash
if ( hash_equals($user->hash, crypt($password, $user->hash)) ) {
  // Ok!
}else{
  //user not found
}

Я не знаю, что происходит, я просто ищу эту функцию, но вместо этого мне нужна проблема. Извините за мой плохой английский. Спасибо!

php,mysql,

5

Ответов: 5


21 принят

В документах php.net мы можем найти функцию замены для старых версий php:

if(!function_exists('hash_equals'))
{
    function hash_equals($str1, $str2)
    {
        if(strlen($str1) != strlen($str2))
        {
            return false;
        }
        else
        {
            $res = $str1 ^ $str2;
            $ret = 0;
            for($i = strlen($res) - 1; $i >= 0; $i--)
            {
                $ret |= ord($res[$i]);
            }
            return !$ret;
        }
    }
}

В противном случае вы можете использовать эту библиотеку: https://github.com/ircmaxell/password_compat


Из документации :

(PHP 5> = 5.6.0)

Если у вас версия старше 5.6.0, то у вас не будет встроенной функции.


0

Используйте phpinfo()и проверьте свою версию PHP. Версии PHP до 5.6 не имеют hash_equalsвстроенной функции. Для использования этой функции перейдите на последнюю версию PHP (или, по крайней мере, до 5.6).


0
if(!function_exists('hash_equals'))
{
    function hash_equals($a,$b){
        /***
        * special delay incrementing dos robust comparator
        */  
        $ip_one = $_SERVER['HTTP_X_FORWARDED_FOR'];
        $ip_two = $_SERVER['REMOTE_ADDR'];
        $db = new SQLdb();
        $counter = $db->quickquery("SELECT count(*) FROM dos WHERE (ip='".$ip_one."' OR ip='".$ip_two."') AND  recent_datetime >= DATE_SUB(NOW(), INTERVAL 1 HOUR)");
        if ($counter > 5) {
            sleep($counter *2);
        }
        if ($a!=b){
            $db->quickquery("INSERT INTO dos (ip, recent_datetime) VALUES ('".$ip_one."', now())");
            $db->quickquery("INSERT INTO dos (ip, recent_datetime) VALUES ('".$ip_two."', now())");
            return false;
        }
        else{
            return true;
        }
    }
}

Это, вероятно, лучше - вам нужна небольшая таблица с именем dos с 2 столбцами ( ip text, recent_datetime datetime), и вы должны ОПРЕДЕЛЕННО индексировать recent_datetime. И добавьте свой собственный движок sql. Я не предварительно подготовил операторы mysql. Это разборчиво и, если хотите, считайте его псевдокодом. Так успокойся. Вы не закончите жизнь. Я очень сомневаюсь, что вы можете вводить переменные IP-адреса сервера, и если вы можете Zend - это muppets. В любом случае я отвлекаюсь.

Вы получите защиту от перехвата подлинности от этого, что довольно хорошо.


0

Решение взято из Facebook sdk: https://github.com/facebook/php-graph-sdk/blob/5.x/src/Facebook/polyfills.php

/**
 * Copyright 2017 Facebook, Inc.
 *
 * You are hereby granted a non-exclusive, worldwide, royalty-free license to
 * use, copy, modify, and distribute this software in source code or binary
 * form for use in connection with the web services and APIs provided by
 * Facebook.
 *
 * As with any software that integrates with the Facebook platform, your use
 * of this software is subject to the Facebook Developer Principles and
 * Policies [http://developers.facebook.com/policy/]. This copyright notice
 * shall be included in all copies or substantial portions of the software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 */
/**
 * @see https://github.com/sarciszewski/php-future/blob/master/src/Security.php#L37-L51
 */
if (!function_exists('hash_equals')) {
    function hash_equals($knownString, $userString)
    {
        if (function_exists('mb_strlen')) {
            $kLen = mb_strlen($knownString, '8bit');
            $uLen = mb_strlen($userString, '8bit');
        } else {
            $kLen = strlen($knownString);
            $uLen = strlen($userString);
        }
        if ($kLen !== $uLen) {
            return false;
        }
        $result = 0;
        for ($i = 0; $i < $kLen; $i++) {
            $result |= (ord($knownString[$i]) ^ ord($userString[$i]));
        }
        // They are only identical strings if $result is exactly 0...
        return 0 === $result;
    }
}
PHP, MySQL,
Похожие вопросы