php添加token防止csrf攻击的方法代码
出于安全考虑,不要以$token = md5(uniqid(rand(), TRUE));
方式生成tokens,因为:
-
rand()
是可预测的 -
uniqid()
只能添加多达29位的熵 -
md5()
不添加熵,它只是确定性地混合它
PS:(以上内容基于Google翻译)
推荐以下代码:
1、生成CSRF令牌
php 7
session_start(); if (empty($_SESSION['token'])) { $_SESSION['token'] = bin2hex(random_bytes(32)); } $token = $_SESSION['token'];
PS:客户的一个开源项目是将random_bytes()
和random_int()
反向移植到PHP 5项目中的一项举措。 这是麻省理工学院的许可,可以在Github和Composer上以paragonie/random_compat的形式获得。
PHP 5.3+ (or with ext-mcrypt)
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'];
2、验证CSRF令牌
不要只使用==或甚至===,使用hash_equals()
(仅限PHP 5.6+,但可以使用hash-compat库的早期版本)。
if (!empty($_POST['token'])) { if (hash_equals($_SESSION['token'], $_POST['token'])) { // Proceed to process the form data } else { // Log this as a warning and keep an eye on these attempts } }
地址:http://stackoverflow.com/questions/6287903/how-to-properly-add-csrf-token-using-php