首先不建议使用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()。