这是我的登录表单。又名index.php
<form class="form-3" action="login.php?log=ok" method="post" >
<input type="text" name="username" id="login" placeholder="Username">
<input type="password" name="password" id="password" placeholder="Password">
<input type="submit" name="submit" value="Submit">
</form>
这是我的登录检查器。又名login.php
<?php
require_once 'classes/Personel.php';
$personel = new Personel();
$personel->setUsername($_POST['username']);
$personel->setPassword($_POST['password']);
$personel->login();
header("Location: index.php");
// REDIRECT
session_start();
if (strcasecmp($personel->getRole(), "LTO") == 0 ) {
$_SESSION['role'] = "LTO";
$_SESSION['personel'] = $personel;
header("Location: LTO");
}else if(strcasecmp($personel->getRole(), "LTFRB") == 0){
$_SESSION['role'] = "LTFRB";
$_SESSION['personel'] = $personel;
header("Location: LTFRB");
}else if(strcasecmp($personel->getRole(), "LGU") == 0){
$_SESSION['role'] = "LGU";
$_SESSION['personel'] = $personel;
header("Location: LGU");
}else if(strcasecmp($personel->getRole(), "ADMIN") == 0){
$_SESSION['role'] = "ADMIN";
$_SESSION['personel'] = $personel;
header("Location: admin");
}
?>
现在,当我尝试从他们访问任何帐户时,我可以轻松打开其index page
和其他页面,即使我没有登录。我怎么能禁止这个?我怎样才能避免网址重写?
例如。 admin的索引页面
尝试打开我的link正确的帐户是admin-admin也试错了..
提前致谢。
答案 0 :(得分:1)
首先,您需要在适当的位置将重定向设置为index.php,但有一些条件。
我遇到了您的问题,但您是否正在检查每个页面上的会话?
您需要在每个页面的开头执行检查,确认会话是否正确设置。否则重定向回index.php。
您需要在每个页面之前实现此代码:
session_start();
if(isset($_SESSION['role'])){
if($_SESSION['role'] != "ADMIN") { //change the "ADMIN" to your unique role per page
echo "Access denied";
exit();
}
else {
header("Location: index.php");
}
答案 1 :(得分:0)
您正在调用标题(“Location:index.php”)而没有任何条件。 这意味着您始终重定向到index.php。
对login.php的任何调用都将导致自动重定向到index.php。
我不知道$ personel-&gt; login()究竟是什么,但你的代码看起来应该是这样的:
$authorized = $personel->login();
if (!$authorized) {
header("Location: index.php");
exit();
}
此外 - session_start()应位于代码的顶部。
希望这有帮助!
答案 2 :(得分:0)
您可以在每个页面的顶部进行检查,如果用户未登录,则将其重定向到适当的页面,例如登录页面。
这是实现这一目标的一种方法。
登录时,设置$ _SESSION变量(类似user_id
),如下所示:
//If successful login:
$_SESSION['user_id'] = $userid_from_the_db;
请注意,在使用会话时,您必须将session_start();
放在每个页面的最顶层。
然后,您可以在显示任何页面数据之前检查用户是否已登录。
类似的东西:
<?php
protect_page();
保护页面可以如下所示:
if (isset($_SESSION['user_id'])===false) {
echo '<p>Please log in first</p>';
echo '<meta HTTP-EQUIV="REFRESH" content="5; url=login.php">';
}
考虑从phpAcademy查看这个(免费)教程:
Registration and Login - Procedural version
Registration and Login - OOP version
注意:
您可以使用以下任一方法重定向页面:
header("Location: pagename.php");
这是首选方法,但在使用此命令之前无法输出任何其他标头,否则它将失败。
<meta HTTP-EQUIV="REFRESH" content="5; url=pagename.php">
作为解决方法,您可以使用此方法重定向页面,并且奖励是它会在执行此操作之前等待指定的秒数(在这种情况下为5,如果您选择则为零)。