您能告诉我为什么我的会话设置无法正常工作吗?我在 index.php 文件中有一个简单的表单:
<?php
session_start();
$_SESSION['uid'] = 'test';
?>
<!DOCTYPE HTML>
<html>
<body>
<form method="POST" action="validate.php">
Password: <input type="text" name="name" value="" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
我还有一个 validate.php 文件,如下所示:
<?php
session_start();
$err="You Have to Insert The Password to Get into Page";
if(($_POST['name']) == $_SESSION['uid']){
header ("Location: target.php");}
else{ echo $err; }
?>
最后 target.php 页面就像这样
<?php
session_start();
?>
<!DOCTYPE HTML>
<html>
<body>
<img src="session.jpg">
</body>
</html>
现在我的问题是,直接从浏览器地址栏运行validate.php或target.php URL,如(..localhost / PHP / Session_3 / validate.php)我仍然可以访问目标页面! 你能告诉我为什么会这样吗?以及如何设置更好的isset()函数来防止这种情况? 谢谢你的时间和评论
答案 0 :(得分:1)
($_POST['name'])
将返回一个布尔值,它是自己的if语句(因为你放置了(
和)
。它会给你一个真正的值,当它$_POST
可用。
所以你得到的是if ((True) == $_SESSION['uid'])
。因为代码看到了True值,所以它不会在它之后运行代码,因此它已经完全正确。
这就是为什么它始终是header
行
所以这应该可以解决你的问题(有更好的方法来做到这一点)
if($_POST['name'] == $_SESSION['uid']){
header ("Location: target.php");
}
else
{
echo $err;
}
答案 1 :(得分:1)
您必须在加载的每个页面上检查会话
添加
if(!isset($_SESSION['uid'])){
header ("Location: index.php");
}
可能对每个页面都有帮助。并且不要忘记在每次注销时删除会话。
//Four Steps to close a session
//i.e. logging out
//1. Find the Session
session_start();
//2. Unset all the session variables
$_SESSION=array();
//3. Destroy the session cookie
if(isset($_COOKIE[session_name()])){
setcookie(session_name(),'',time()-42000,'/');
}
//4. Destroy the session
session_destroy();
//redirect_to("index.php?logout=1");
答案 2 :(得分:1)
您有验证密码的代码,但这是您迄今为止所写的全部内容。您既不存储验证结果,也不阻止访问受保护页面。
存储验证结果:
if ($_POST['name']==$_SESSION['uid']) {
$_SESSION['validated'] = true;
}
保护页面:
if (!isset($_SESSION['validated'])) {
header('Location: http://example.com/');
exit;
}
答案 3 :(得分:0)
如果您关闭并重新打开浏览器,则可以访问target.php。因为在开始时会话和帖子中没有值
所以这一行,
if(($_POST['name']) == $_SESSION['uid'])
等于
if ( "" == "" ) //true
您应该使用isset(),
<?php
session_start();
$err="You Have to Insert The Password to Get into Page";
if (isset($_POST['name']) && isset($_SESSION['uid'])) {
if ($_POST['name'] == $_SESSION['uid']) {
$_SESSION["logged"] = "logged";
header ("Location: target.php");
} else {
echo $err;
}
} else {
header ("Location: index.php");
}
?>
如果你想在没有记录的情况下直接使target.php无法访问,那就是这样,
<?php
session_start();
if (!isset($_SESSION["logged"])) {
//No access directly if not logged
header ("Location: index.php");
}
?>
<!DOCTYPE HTML>
<html>
<body>
<img src="session.jpg">
</body>
</html>
答案 4 :(得分:0)
你差不多完成了。不需要validate.php。只需复制index.php中的代码,
<?php
session_start();
if(!empty($_POST['name']) and ($_POST['name']=='test') ){
$_SESSION['uid']='test';
header ("Location: target.php");
}
?>
并将表单操作更新为
<form method="POST" action="**index.php**">
并以index.php形式,使用下面的代码。
<?php
session_start();
if(empty($_SESSION['uid'])){
header ("Location: index.php");
}
?>