从 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 设置会话变量吗