php - 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 是否处理安全部分?使用会话密钥,还是我必须自己生成密钥、存储并用作标识符?
问候
解决方案
客户端不能直接更改$_SESSION
,因为它存储在服务器端。但是,实施可能会:
$_SESSION['username'] = $_POST['username']; // Now $_SESSION['username'] can be anything
$_SESSION['id']
id
如果是数据库中的整数字段,则无法进行 SQL 注入。但是为了一致性和安全起见,您可能还希望在此处使用准备好的语句。
推荐阅读
- amazon-web-services - AWS EC2 实例 IP 未由 Route53 指向的域解析
- java - itext7 - 不剪裁内容的最大字体大小
- sql - 检查前一天是否存在现有记录
- control-flow - repl.it 控制流编码中的“lovesPizza”问题给我带来了麻烦
- rest - 是否可以有多个具有 clientIds 和 secrets 的受众?
- html - 屏幕调整大小移动svg?
- c# - Integrated security= true 时,数据库所有者 SID 记录错误;
- python - 如何将 lineEdit 与定义变量的函数连接起来?
- python - “其他”声明没有响应
- java - 在共享库中为 JPA Entity(域类型对象)创建基类的缺点