龙哥网

龙哥网

php添加token防止csrf攻击的方法代码(token防止csrf原理)
2021-12-17

出于安全考虑,不要以$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

免责声明
本站部分资源来源于互联网 如有侵权 请联系站长删除
龙哥网是优质的互联网科技创业资源_行业项目分享_网络知识引流变现方法的平台为广大网友提供学习互联网相关知识_内容变现的方法。