PHP添加csrf token的注意点

时间:2022-06-01 16:50:31

首先不建议使用rand(),unique()来生成,如

$token = md5(uniqid(rand(), TRUE));

这是因为rand()函数产生的随机字符串是可以预测的。runiqid()和md5()增加的复杂度不高。

产生token

PHP 7

session_start();
if (empty($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['token'];

PHP 5.3+

session_start();
if (empty($_SESSION['token'])) {
if (function_exists('mcrypt_create_iv')) {
$_SESSION['token'] = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
} else {
$_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32));
}
}
$token = $_SESSION['token'];

当没有找到mcryt_create_iv函数,可以使用openssl_random_pseudo_bytes。

验证token

if (!empty($_POST['token'])) {
if (hash_equals($_SESSION['token'], $_POST['token'])) {
// 验证成功,
} else {
// 验证失败
}
}

如果是PHP5.6以上的版本,比较token不建议使用==或者===,而是使用hash_equals()