会话登录成功后如何插入表

Posted

技术标签:

【中文标题】会话登录成功后如何插入表【英文标题】:How to insert into a table after a successful session login 【发布时间】:2019-05-31 10:34:20 【问题描述】:

我正在使用 Facebook 等简单的会话管理功能制作登录脚本

首先我创建了一个名为"users_sessions"的表

这是代码:

$database->query("
    CREATE TABLE `users_sessions` (
        `session_id` int(10) UNSIGNED NOT NULL,
        `session_date` datetime NOT NULL,
        `user_id` int(10) UNSIGNED NOT NULL,
        `user_browser` varchar(64) COLLATE utf8mb4_bin NOT NULL,
        `user_os` varchar(64) COLLATE utf8mb4_bin NOT NULL,
        `user_ip` varchar(64) COLLATE utf8mb4_bin NOT NULL,
         PRIMARY KEY (`session_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
");

所以我想做的是当用户自动填写正确的用户名和密码时,脚本会自动将成功用户日志的正确信息插入到这个表中。

这是 index.php

 $_POST['password'] = User::hash_password($_POST['password']);
if(!empty($_POST) && empty($_SESSION['error'])) 
    /* If remember me is checked, log the user with cookies for 30 days else, remember just with a session */
    if(isset($_POST['rememberme'])) 
        setcookie('username', $_POST['username'], time()+60*60*24*30);
        setcookie('password', $_POST['password'], time()+60*60*24*30);
        setcookie('user_id', User::login($_POST['username'], $_POST['password']), time()+60*60*24*30);


     else 
        $_SESSION['user_id'] = User::login($_POST['username'], $_POST['password']);
    
    redirect();

这是我的数据库配置:

<?php

/* CONNECTION */
$database_connection = new StdClass();
$database_connection->server = 'localhost';
$database_connection->username = 'root';
$database_connection->password = '';
$database_connection->name = 'wearesocio';
$database = new mysqli($database_connection->server, $database_connection->username, $database_connection->password, $database_connection->name);
if($database->connect_error) 

    header('Location: '.$_SERVER['PHP_URL']."install");


/* DB CLASS */
Database::$database = $database;
/* DEBUGGING */
define('DEBUGGING', true);

?>

【问题讨论】:

不要将密码存储在 cookie 中!您可以使用有效会话的存在作为身份验证的证明。 @AlexHowansky 别担心我会删除记住我的,那么我应该在哪里添加插入表单以及正确的插入表单是什么? 见this和this。 另请注意,INT 类型列对于会话 ID 字段是不够的。你会想要一个字符串。 (不知道 PHP 的默认会话 id 长度是多少,但安全起见,至少说 64 个字符。) @MohcineMimoudi 请edit 您的问题包含您的问题的minimal reproducible example,其他人可以对其进行测试,这表明您如何尝试在数据库/表中创建新行。目前您没有显示发送INSERT INTO SQL 查询的代码。 【参考方案1】:

这是我的解决方案

我已经创建了一些函数来获取用户浏览器或用户 ip 等 然后在下面创建这个函数在$_SESSION['user_id']之后添加它

    function insert_into_users_sessions($user_id)
    // here add your database class name
    global $database;

    $user = $_SESSION['user_id'];
    $date = new DateTime();
    $date = $date->format('Y-m-d H:i:s');
    $user_browser = get_user_browser();
    $user_ip = get_user_ip();
    $user_os = get_user_os();

    @$database->query("INSERT INTO `user_sessions` (`user_id`, `session_ip`, `session_os`, `session_browser`, `session_date`) VALUES ('$user', '$user_ip', '$user_os', '$user_browser', '$date')");


【讨论】:

【参考方案2】:
if(isset($_POST['rememberme'])) 
    setcookie('username', $_POST['username'], time()+60*60*24*30);
    setcookie('password', $_POST['password'], time()+60*60*24*30);
    setcookie('user_id', User::login($_POST['username'], $_POST['password']), time()+60*60*24*30);
    insert_into_db($params);
 else 
    $_SESSION['user_id'] = User::login($_POST['username'], $_POST['password']);
    insert_into_db($params);


function insert_into_db($params)
    // write insert query

在理想情况下,我会在插入函数中使用带有绑定参数的 PDO,让每个表都设置了 PRIMARY_KEYs,并清理用户输入。当然,根据How to use password_hash

存储之前的哈希密码

更新

if(!empty($_POST) && empty($_SESSION['error'])) 
    $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
    $password_raw = $_POST['password'];

    // Get these data
    $session_params = array();
    $session_id = 1;
    $session_date = time();
    $user_id = User::login($username, $password_raw);
    $user_browser = '';
    $user_os = '';
    $user_ip = '';
    array_push($session_params, $session_id, $session_date, $user_id, $user_browser, $user_os, $user_ip);

    if(isset($_POST['rememberme'])) 
        setcookie('username', $username, time()+60*60*24*30);
        //setcookie('password', $_POST['password'], time()+60*60*24*30);
        setcookie('user_id', $user_id, time()+60*60*24*30);
        insert_session_into_db($session_params);
     else 
        $_SESSION['user_id'] = $user_id;
        insert_session_into_db($session_params);
    
    redirect();


function insert_session_into_db($session_params)

    // include database config file, or instantiate your Database class here

    extract($session_params);

    $sql = "INSERT INTO users_sessions (session_id, session_date, user_id, user_browser, user_os, user_ip)
            VALUES ('".$session_id."', '".$session_date."', '".$user_id."', '".user_os."', '".$user_ip."')";
    $res = $database->query($sql);
    if ($res === true) 
        echo "New record created successfully";
     else 
        echo "Error: " . $sql . "<br>" . $database->error;
    
    $database->close();

【讨论】:

以上是关于会话登录成功后如何插入表的主要内容,如果未能解决你的问题,请参考以下文章

PHP 登录和处理会话安全

PHP 会话变量的安全性如何?

Laravel 5.3 登录成功后声明全局会话变量

如何在会话过期时断开套接字

如何使用本机反应创建登录以及如何验证会话

如何存储用户的会话数据