PHP添加csrf token的注意点

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

版权声明:著作权归作者所有。

相关推荐

JavaScript里null与undefined的区别与相似点

初次看,null和undefined看似是一样的,但远非如此。 本文将探讨JavaScript中null和undefined的区别和相似之处。null是什么?有两个你应该理解的null特性:null是空的或不存在的值。null必须显式赋值。将null的值赋给a示例:let a = null; console.log(a); // 输出null un

PHP递归删除多级目录

php删除文件夹需要结合三个函数:glob:用于遍历文件unlink:删除文件rmdir:删除空文件夹<?php  public static function recursiveDelete($dir) {      $dir = rtrim($dir,'/');