【问题标题】:setting session id variable from sql database; is this safe?从 sql 数据库设置会话 id 变量;这安全吗?
【发布时间】:2012-10-03 21:54:56
【问题描述】:

使用我的sql表中的user_id作为会话id是否不安全?这通常是 php 开发人员所做的吗?


(来源:sockface.com

我也无数次尝试将会话 ID 存储为用户 ID

include('profile/core/init_inc.php');    
$_SESSION['uid'] = $user_id;
header("Location: profile/edit_profile.php");

在我的 init_inc 中

function fetch_user_info($uid){
$uid = (int)$uid;

$sql = "SELECT
            `user_id` AS `id`,
            `username`,
            `user_firstname` AS `firstname`,
            `user_lastname` AS `lastname`,
            `user_about` AS `about`,
            `user_email` AS `email`
        FROM `users`
        WHERE `user_id` = {$uid}";

$result = mysql_query($sql);        
return mysql_fetch_assoc($result);

如果我有 $_SESSION['uid'] = 90;登录后会显示 test@test.ca info here

所以我的问题是,将会话 id 存储为 user_id 是否安全,当我尝试这样做时,为什么它不起作用?

【问题讨论】:

    标签: php sql session session-variables


    【解决方案1】:

    几件事:

    1.) 会话 ID 不应该是特定用户的常量值。那是违反安全规定的。会话 ID 应每隔一段时间更改一次。理想情况下,它应该是一个随机值。

    2.) 您似乎没有设置会话 ID。您正在设置名为“uid”的会话变量。

    3.) 你有没有打电话给session_start()


    尽管我真的不建议将会话 ID 设置为常量值,但您可以使用 session_id() function 设置会话 ID:

    $session_id = "some_random_value";
    session_id($session_id);
    

    但就像我说的,这不应该是用户的 ID。您可以将用户的 ID 存储为会话信息,并在用户加载页面时检查他们是否已登录。

    if (isset($_SESSION["user_id"]))
    {
        //user is logged in
        $user_id = $_SESSION["user_id"];
    }
    else
    {
        //make user log in
        $user_id = result_of_login();
        $_SESSION["user_id"] = $user_id;
    }
    

    session documentation 中有关 PHP 会话的更多信息。

    【讨论】:

    • 为什么会违反安全规定,我该怎么办?
    • 如果用户的会话 ID 始终相同,那么恶意用户就更容易劫持用户的会话。 PHP 会为您生成随机会话 ID,因此您无需执行任何操作。
    • 嗯,当我登录并尝试编辑配置文件时,它不知道我登录的用户是什么。
    • 您应该将用户的登录信息存储在会话数据中。但是,会话 ID 不应是用户的 ID。
    猜你喜欢
    • 2012-01-09
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多