我有一个登录系统。当用户登录时,用户数据会被存储在$_SESSION变量中(id, username, ...),像这样(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')
换句话说: 当我用sessionkey说session_start();时,php是否处理了安全部分,还是我必须自己生成一个key,存储它并将其作为标识符?
问候
客户端不能直接修改 $_SESSION
因为它是存储在服务器端的。然而,实现可能会使其成为可能。
$_SESSION['username'] = $_POST['username']; // Now $_SESSION['username'] can be anything
$_SESSION['id']
不能SQL-inject,如果 id
是数据库中的一个整数字段。但是为了保持一致性和安全起见,你可能会希望在这里也使用准备好的语句。