Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么我们要读取数据库来验证会话是否存在并且有效_Php_Session - Fatal编程技术网

Php 为什么我们要读取数据库来验证会话是否存在并且有效

Php 为什么我们要读取数据库来验证会话是否存在并且有效,php,session,Php,Session,我将我的管理面板限制为仅在会话存在时接受访问 当用户成功登录时,我存储如下会话: ... $result = $readUser->fetch(PDO::FETCH_ASSOC); $_SESSION['result'] = $result; if(!$_SESSION['result']) { header('Location: index.php?restricted=true'); } else{ $userId = $_SESSION['

我将我的管理面板限制为仅在会话存在时接受访问

当用户成功登录时,我存储如下会话:

...
$result = $readUser->fetch(PDO::FETCH_ASSOC);
$_SESSION['result'] = $result;
if(!$_SESSION['result'])
    {
        header('Location: index.php?restricted=true');
    }

else{
    $userId = $_SESSION['result']['id'];
    $readUser = $pdo->prepare("SELECT * FROM admins where id = :userId"); 
    $readUser->bindValue(":userId", $userId);
    $readUser->execute();   
    if(!$readUser->rowCount() >=1){
        unset($_SESSION['userlogin']);
        header('Location: index.php?resctricted=true');
    }
}
然后在my dashboard.php中查看会话是否存在:

if(!$_SESSION['result'])
{
    header('Location: index.php?restricted=true');
}
如果不存在,我将用户发送到
index.php
,在那里我有我的登录表单

上面这个简单的代码还不够

但我现在读到这一点很重要,看看会话是否有效,如果会话存在,还要检查会话是否有效,因此我们必须读取数据库,以验证用户会话的信息与数据库中的信息相同

但是,我不明白,为什么和什么时候存在的会话可能无效,以及如果用户登录并使用其登录存储会话,那么用户会话的信息在数据库中如何不能不同

验证数据库的代码如下所示:

...
$result = $readUser->fetch(PDO::FETCH_ASSOC);
$_SESSION['result'] = $result;
if(!$_SESSION['result'])
    {
        header('Location: index.php?restricted=true');
    }

else{
    $userId = $_SESSION['result']['id'];
    $readUser = $pdo->prepare("SELECT * FROM admins where id = :userId"); 
    $readUser->bindValue(":userId", $userId);
    $readUser->execute();   
    if(!$readUser->rowCount() >=1){
        unset($_SESSION['userlogin']);
        header('Location: index.php?resctricted=true');
    }
}
我相信(如果我错了,请纠正我)您正在尝试实现一个简单的安全系统

您试图通过一个简单的会话变量(“result”)进行授权,该变量说明用户是否已通过身份验证

这个简单检查的问题是,您的会话可能被拦截,甚至被修改,因此您的系统可能很容易被愚弄。因此,一些人建议将会话变量和id存储在数据库中,并在客户端和服务器之间交换秘密值。但最后,保护客户机-服务器通信的最佳方法是使用SSL证书


尝试使用安全模块,如。我相信这会更简单,你会得到更好的保护,并有更多的功能可用于管理你应用程序中的安全性。

我认为建议来自偏执狂或不理解会话和cookie之间的区别的人。同意barmar的意见。研究劫持会话需要什么。此外,如果有人可以劫持会话,他们可以将
$\u session['result']['id']
更改为包含管理员id。此外,你需要问自己:这个系统是什么?入侵的影响是什么?你愿意冒这个险吗?你能很快恢复吗?基本上,如果我们谈论的是个人投资组合网站,那么老实说,谁在乎呢。使用你觉得舒服的东西。但是,如果你正在建设一个电子商务网站,你最好把所有的基础都覆盖起来,因为如果你被黑客攻击,你缺乏勤奋会让你痛苦不堪。谢谢你的帮助!它不是一个投资组合,但安全性不是很重要,它不是一个在线商店,信任是至关重要的。但如果有优势,即使很少,为什么不把查询验证到数据库中呢?