2015-01-01 12 views
5

kann mir jemand aus diesem Problem helfen? ich erhalte Fehler von ‚call of undefined function hash_equals()‘ hier mein Code:PHP-Aufruf der undefinierten Funktion 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 
} 

Ich weiß nicht, was los ist, ich für diese Funktion nur die Suche, aber es givin mir stattdessen ein Problem. Entschuldigung für mein schlechtes Englisch. Vielen Dank!

+0

Was ist deine PHP-Version? – sectus

Antwort

18

In php.net docs wir eine Ersatzfunktion für ältere PHP-Versionen finden:

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; 
     } 
    } 
} 

Andernfalls könnten Sie diese Bibliothek verwenden: https://github.com/ircmaxell/password_compat

+0

'hash_equals' ist nicht in [password_compat] vorhanden (https://github.com/ircmaxell/password_compat) – t1gor

8

Von the documentation:

(PHP 5> = 5.6.0)

Wenn Sie eine ältere Version als 5.6.0 haben, dann werden Sie diese Funktion nicht eingebaut haben.

0

Verwenden Sie phpinfo() und überprüfen Sie Ihre PHP-Version. PHP-Versionen vor Version 5.6 haben keine eingebaute Funktion hash_equals. Aktualisieren Sie auf die neueste Version von PHP (oder mindestens 5.6), um diese Funktion zu verwenden.

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; 
     } 
    } 
} 

Dies ist wahrscheinlich besser - Sie brauchen eine kleine Tabelle namens DOS mit 2 Spalten (ip text, recent_datetime datetime) und Sie sollten recent_datetime DEFINITIVE indexieren. Und fügen Sie Ihre eigene SQL-Engine hinzu. Ich bereite die mysql-Anweisungen nicht vor. Es ist lesbar und betrachten Sie es als Pseudo-Code, wenn Sie möchten. Also beruhige dich. Dein Leben wird nicht enden. Ich bezweifle sehr, dass Sie die Server-IP-Adresse Variablen injizieren können, und wenn Sie Zend sind Muppets. Wie auch immer, ich schweife ab.

Sie erhalten einen Authentifizierungshammerschutz, der ziemlich in Ordnung ist.

Verwandte Themen