我正在尝试创建一个非常简单的网站,您可以转到主页并登录,其代码在此处 example.org/login/index.php:
<?php
session_start();
$warning = $_GET['warning'];
$nolog = $_GET['nolog'];
$username = "Welcome, please log in";
if ($warning) {
$username = "Wrong Username/Password Combination";
}
if ($nolog) {
$username = "Page inaccessible: Login required";
}
if ($logout) {
$username = "Thank you for your session";
}
?>
<!DOCTYPE html>
<body>
<div class="center">
<span class="warning"><?= $username ?></span>
<form action="submit.php" method="post">
<span class="formField">Username:</span><br>
<input type="text" name="user" class="field">
<br>
<span class="formField">Password:</span><br>
<input type="password" name="password" class="field">
<br>
<br>
<input type="submit" name="submit" value="Submit" class="field">
</form>
</div>
</body>
</html>
提交页面看起来像这样(当我开始工作时,我不会像这样硬编码用户名和密码,现在只是为了简明扼要) example.org /login/submit.php:
<?php
session_start();
$username = $_POST['user'];
$password = $_POST['password'];
if ($username == "admin" && $password == "12345") {
$_SESSION['loggedin'] = TRUE;
header("Location: http://www.example.org/welcome/");
die();
}
else {
$_SESSION['loggedin'] = FALSE;
header("Location: http://www.example.org/login/index.php?warning=true");
die();
}
?>
欢迎页面如下所示 example.org/welcome/index.php :
<?php
session_start();
if(!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] == FALSE){
unset($_SESSION);
session_destroy();
header("Location: http://www.example.org/login/index.php?nolog=true");
}
?>
<!DOCTYPE html>
<body>
Hi
</body>
</html>
我知道这是很多代码,但是当我尝试运行它时第一次在欢迎页面周围返回一个错误,说它无法访问,并将我发送回登录页面,但第二次看起来似乎工作正常并让我登录。有人能理解为什么会这样吗?
修改
在详细了解之后,我发现问题仅存在于Google Chrome和Firefox中,但在其他浏览器(如Internet Explorer或Apple Safari)中不存在。现在进入浏览器的渲染引擎。有没有人知道我可以使用会话ID的另一种方式可能绕过所有浏览器的整个问题,或许是另一种验证用户的方式?
答案 0 :(得分:0)
尝试使用以下
define('BASE_URL', 'http://www.example.org/');
if ($username == "admin" && $password == "12345") {
$_SESSION['loggedin'] = TRUE;
header("Location:".BASE_URL."welcome.php");
exit();
} else {
header("Location:".BASE_URL."index.php");
exit();
}
在欢迎页面的开头添加以下内容
session_start();
if(!isset($_SESSION['loggedin'])){
header("Location:".BASE_URL."index.php");
exit();
}
答案 1 :(得分:0)
如果你注意我提到的文件的名称,我说我正在将我的浏览器导向example.org/login/submit.php,然后将其转发到www.example.org/welcome/index .PHP。
在Google Chrome和Mozilla Firefox中,他们关心的是在网站之前使用www之间的区别,而在Internet Explorer和Safari中他们并不关心差异。在我的服务器上,网站www.example.org和example.org是彼此的镜像(这是一个单独的安全问题),因此谷歌Chrome和Mozilla Firefox将以不同的方式对待它们,并为它们提供不同的$ _SERVER全局变量,而Internet Explorer和Safari不关心这种差异。