我尝试编写自己的身份验证方法(学校项目),但我被卡住了。请告知如何解决安全身份验证:
有一个索引.php其中包含需要"保护"的所有内容。我将在此处复制代码的相关部分。
更新的索引.php
session_start();
function checkUserAuth(){
$authStatus = false;
if (isset($_SESSION['PHPSESSID'])){
if ($_SESSION['PHPSESSID'] == $_COOKIE['PHPSESSID']){
$authStatus = true;
}
}
return $authStatus;
}
if(!checkUserAuth()){
include_once(dirname(__DIR__).'/admin/authentication/login.php');
exit();
}
如果 checkUserAuth() 确定没有经过正确身份验证的用户,则将包括登录名.php并停止脚本的其余部分。
更新登录.php:
if(array_key_exists($username, $users) && password_verify($password, $users[$username])){
$_SESSION['PHPSESSID'] = $_COOKIE['PHPSESSID'];
$_SESSION['login_user'] = $_POST['user'];
我想可能会发生的事情是,如果登录详细信息正确,登录.php设置cookie并刷新页面。然后索引.php将检测cookie,并跳过登录部分。
登录名已经基本弄清楚了,多亏了Juned,我认为它现在可以工作了。但是我不知道这有多安全?
从1到非常,我错得有多离谱?
有很多方法可以做到这一点。下面的伪代码不是最有效的,但应该可以工作,我认为你上面所做的实际上不会起作用。
这有帮助吗?
登录.php伪代码
<?php
session_start(); // this function checks if there's a session ID already set, if not, sets one.
if(array_key_exists($username, $users) && password_verify($password, $users[$username])){
// do your login details checking here
// if login details correct
// set a flag in the $_SESSION superglobal and whatever else you want to store about the user like their username e.g.
$_SESSION["loggedIn"] = true;
$_SESSION["username"] = "$_POST['user']"; // better practice to fetch a clean version from your database
//else return user to login page
}
?>
索引.php伪代码
<?php
session_start(); // this will fetch the session ID and other variables that you might have set e.g. username, logged in status
function checkUserAuth(){
$authStatus = false;
if (isset($_SESSION['loggedIn']) && $_SESSION['loggedIn'] === true){
$authStatus = true;
}
return $authStatus;
}
if(!checkUserAuth()){
// redirect to login page. e.g.
header('Location: login.php');
exit;
}
?>