【发布时间】:2018-12-12 23:02:01
【问题描述】:
index.php:
if(isset($_SESSION['user_id'])){
$user_id = $_SESSION['user_id'];
}
###$_SESSION['user_id'] is = to $user['user_id'] that i get from database in a select query on login.php
正如您在上面看到的,我仅在用户登录时设置变量$user_id。我使用if(empty($user_id)){} 来设置一些条件并且它运行良好,但我很好奇,因为如果用户不是登录$user_id 将是一个未定义的变量,我是 php 新手,所以我想知道我是否正确执行。
在用户不应该查看的页面上,除非他已登录,否则我添加了以下代码:
if(empty($user_id)) {
$_SESSION['message'] = "You need to loge in to view this page";
header("location: verify/error.php");
exit;
}
为了显示一些与用户相关的内容,我使用以下代码:
if(!empty($user_id)){
echo 'content related to the user, divs...etc';
}
我有两个问题:
1 - 我做得对吗?
2 - 我应该将代码更改为:
if(isset($_SESSION['user_id'])){
$user_id = $_SESSION['user_id'];
}else{
$user_id = '';
}
【问题讨论】:
-
是的,你可以。来自the docs:“如果变量不存在或......”。我个人会设置一个额外的布尔标志,例如
isLoggedin,只是为了提高可读性 -
“正确”是非常主观的,但出于所有意图和目的,您应该始终验证
$_SESSION、$_COOKIE、$_POST、$_GET、@ 987654336@、$_ENV、$_FILES和$_SERVER超全局数据。你永远不应该假设它将是预期的数据类型,并使用array_key_exists或isset以及filter_var或在适用时进行类型转换,以防止你的应用程序受到损害。例如3v4l.org/WBIPe 请记住,数组数据是通过复制而不是通过引用传递的。因此,如果$_SESSION['xyz']更改,您分配的变量将不会更改。 -
@fyrye
array_key_exists是 mysql 函数对吗?我不确定,因为我还没有使用它。在我的整个项目中,我只使用了 PDO,不会有冲突吗? -
@user236945896
array_key_exists是所有数组的全局函数 -
@fyrye 我在下面的回答中看到可以伪造 ID,我实际上已经考虑过这一点,但是...
$_SESSION['user_id'] = $user['user_id']用户 ID 在我的桌子上,我使用 POST 方法。我知道没有什么是 100% 安全的,但是这个条件就足够了吗?if (\array_key_exists('user_id', $_SESSION) && $user_id = \filter_var($_SESSION['user_id'], \FILTER_VALIDATE_INT)) {如果没有,我需要做什么? PS:我担心我的数据库,因为注册用户的个人资料中不会有任何私人信息,除非电子邮件和密码。
标签: php variables session isset