首页 > 解决方案 > PHP:如果我将 $_SESSION['userid'] 作为标识符,这是一个安全问题吗?

问题描述

我有一个登录系统。当用户登录时,用户数据会存储在 $_SESSION 变量(id、用户名、...)中,如下所示(login.php):

$sql = 'SELECT * FROM users WHERE username = :username';
$statement = $con->prepare($sql);
$result = $statement->execute(array('username' => $username));
$userdata = $statement->fetch();
$hashedPassword = json_encode($userdata['password']);

//check password
if ($result && password_verify($password, $userdata['password'])) {
session_regenerate_id();
$_SESSION['loggedIn'] = true;
$_SESSION['username'] = $username;
$_SESSION['id'] = $userdata['id'];
echo $_SESSION['id'];
echo 'true';
} else {
exit('false');
}
}else{
    exit('false');
}

现在我的问题:这是一个安全问题,当我将这些数据用作可信赖的数据时,可能像:

INSERT INTO userRelatedTable (userId,data1,data2) VALUES ($_SESSION['userid'] (<= !!!) ,'data1','data2')

换句话说:当我说 session_start(); 时,php 是否处理安全部分?使用会话密钥,还是我必须自己生成密钥、存储并用作标识符?

问候

标签: phpsecuritysession

解决方案


客户端不能直接更改$_SESSION,因为它存储在服务器端。但是,实施可能会:

$_SESSION['username'] = $_POST['username']; // Now $_SESSION['username'] can be anything

$_SESSION['id']id如果是数据库中的整数字段,则无法进行 SQL 注入。但是为了一致性和安全起见,您可能还希望在此处使用准备好的语句。


推荐阅读