Печальное сравнение строк в PHP
Категория: / DEV Блог
/ PHP (LAMP)
Сравнение хэша пароля в пхп? Без проблем:
$hash = md5 существующего пароля.
$password = "ximaz" (для примера, MD5 этого пароля равен "61529519452809720693702583126814")
PHP при сравнении приведет аргументы, "похожие на числа" к типу INT.
Но, так как числовое значение хэша не помещается в 32 бита, интерпретатор приравняет его к 0 (нолю).
В итоге получается что сравниваться будет только первая половина хэшей!
Приведение к типу INT выглядит так:
@see http://phpsadness.com/sad/47
@see https://bugs.php.net/bug.php?id=54547
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
var_dump(61529519452809720693702583126814 === 61529519452809720000000000000000);