从 sql 数据库设置会话 id 变量;这安全吗?

Posted

技术标签:

【中文标题】从 sql 数据库设置会话 id 变量;这安全吗?【英文标题】:setting session id variable from sql database; is this safe? 【发布时间】: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 是否安全,当我尝试这样做时,为什么它不起作用?

【问题讨论】:

【参考方案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。

以上是关于从 sql 数据库设置会话 id 变量;这安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以从 JDBC 连接为 Postgres 设置会话变量吗

会话存储可以安全吗?

会话 ID 轮换是不是增强了安全性?

django:我们可以通过邮递员中的cookie通过会话ID并登录吗

JPA:如何设置 MySQL 会话变量?

PHP 会话的安全性如何?