Печальное сравнение строк в PHP

Категория: / DEV Блог / PHP (LAMP)
Сравнение хэша пароля в пхп? Без проблем:

if (md5($password) == $hash) {
  print "OK!\n";
}


$hash = md5 существующего пароля.
$password = "ximaz" (для примера, MD5 этого пароля равен "61529519452809720693702583126814")

PHP при сравнении приведет аргументы, "похожие на числа" к типу INT.
Но, так как числовое значение хэша не помещается в 32 бита, интерпретатор приравняет его к 0 (нолю).
В итоге получается что сравниваться будет только первая половина хэшей!

#php -r 'var_dump("61529519452809720693702583126814" == "61529519452809720000000000000000");'
bool(true)


Приведение к типу INT выглядит так:

#внимание на последний символ
#php -r "var_dump(intval("6152951945280972061"), intval("6152951945280972062"));"
int(-897227776)
int(-897227776)
 
#php -r "var_dump(intval("61529519452809720629"), intval("61529519452809720629"));"
int(0)
int(0)


@see http://phpsadness.com/sad/47
@see https://bugs.php.net/bug.php?id=54547