我正在用PHP创建一个安全的登录系统。
在管理区域的每个页面上,我要确保用户已正确登录,他的帐户仍处于启用状态,该用户及其登录详细信息已连接一次(当用户首次登录时,active_user状态设置为1)。
function isCookieValid() {
global $pdo;
$isValid = false;
if(isset($_COOKIE["rememberUser"])) {
$decryptCookie = base64_decode($_COOKIE["rememberUser"]);
$user_id = explode("mMUa26yB943jRaJl755OM18jgR", $decryptCookie);
$user_id = $user_id[1];
$sqlQuery = "SELECT * FROM users WHERE id_user = :id";
$stmt = $pdo->prepare($sqlQuery);
$stmt->execute(array(":id" => $user_id));
if ($row = $stmt->fetch()) {
if($row["enabled_user"] === 1 && $row["active_user"] === 0) {
unset($row["password"], $row["salt"]);
$_SESSION["current_user"] = $row;
$isValid = true;
} else {
logout();
}
} else {
logout();
}
}
return $isValid;
}
我要求每个用户的每一页上的数据库检查存储在计算机中的cookie(我会自动激活cookie,因为对于我的应用程序,它需要让所有用户长时间登录)是否对应数据库中的ID用户。 如果是这样,我将创建一个存储用户详细信息的变量。 然后,为了保护我的页面,我使用了功能 isLoggedin():
function isLoggedin() {
if(isCookieValid()){
if(isset($_SESSION["current_user"])) {
return true;
}
}
return false;
}
该系统不是很重吗?因为我检查每个用户的每一页上的数据库。 预先感谢
答案 0 :(得分:0)
您的系统不重,也不安全。请不要使用Cookie来验证用户,请始终使用会话。
function isLoggedin() {
if(isset($_SESSION["current_user"])) {
return true;
} else {
// here redirect to login page to verify the user id and password..
}
}
答案 1 :(得分:0)
也许您可以做这样的事情。希望能对您有所帮助。
<?php
// Initialize the session
session_start();
// Check if the user is logged in, if not then redirect him to login page
if(!isset($_SESSION["current_user"]) || $_SESSION["current_user"] !== true){
header("location: login.php");
exit;
}
?>
答案 2 :(得分:0)
就像已经说过的那样,使用会话进行登录处理。
还有一个一般性提示:混淆职责将导致您现在遇到的问题。
例如,指标是您的函数名称isCookieValid()
和此函数中的调用logout()
isCookieValid()
调用应该执行它应该做的事情-检查cookie是否有效,仅此而已。
在此之后,您会更灵活地执行诸如以下条件操作
if(!isCookieValid()) {
logout();
}
没有像现在一样运行隐式不需要的东西。
答案 3 :(得分:0)
对于问题“该系统不是太重吗?因为我检查了每个用户的每个页面上的数据库。” 我只是说“取决于”。如果您的系统速度太慢,那就太重了。如果没有,..我不在乎。我的意思是,……如果有什么可行的,它的完成方式并不重要。
后经文。当您关心系统的繁重工作时,..您就没有在关注安全性了。您只是共享了登录系统的方式。例如,创建一个编码如下的字符串:
$_COOKIE['rememberUser'] = base64_encode(
'mMUa26yB943jRaJl755OM18jgR42'
);
不要共享敏感数据... 在这个答案中,我不会谈论安全性,但是我建议您寻找jwt解决方案。 JWT(Javascript Web令牌)是事实上的标准,可以在您的用例中为您提供帮助:已经实现了许多解决方案。您在这里正在重新发明轮子。但是
我刚刚重构了您的isCookieValid方法:
function isCookieValid() {
global $pdo;
$isValid = false;
if(isset($_COOKIE["rememberUser"])) {
$decryptCookie = base64_decode($_COOKIE["rememberUser"]);
$user_id = explode("mMUa26yB943jRaJl755OM18jgR", $decryptCookie);
$user_id = $user_id[1];
$sqlQuery = "SELECT * FROM users WHERE id_user = :id";
$stmt = $pdo->prepare($sqlQuery);
$stmt->execute(array(":id" => $user_id));
if ($row = $stmt->fetch()) {
if($row["enabled_user"] === 1 && $row["active_user"] === 0) {
unset($row["password"], $row["salt"]);
$_SESSION["current_user"] = $row;
return true;
}
}
}
return false;
}
然后您可以使用:
function isLoggedin() {
if (isCookieValid()) {
logout();
}
}