【发布时间】:2014-09-25 19:48:56
【问题描述】:
因此,会话中有很多帖子,但是,如果用户已注销并尝试访问仅限成员的页面,则它们都不够清楚地将用户重定向到另一个页面。我正在寻找一旦登出就无法返回的会话。可以理解,这将需要 java 脚本,相反,我希望禁用将网址直接复制和粘贴到浏览器中,如果他们这样做并且他们没有登录,他们应该被重定向到登录页面。这是代码...
**所有会员页面都以此开头:
if( !isset( $_SESSION ) ){
session_start();
}else{
header("Location:login.php");
}
include("connection.php");
**连接页面只是连接到数据库,简单的名称和密码或死亡。
**su.php。此页面是在登录或注册时开始会话的内容。记录我们实际上将它们注销,问题是任何人都可以输入 profile.php 的地址并将其拉出来。
if( !isset( $_SESSION ) ){
session_start();
}
if($_GET["logout"]==1 AND $_SESSION['id']) { session_destroy();
header("Location:logout.php");
}
include("connection.php");
if ($_POST['submit']=="Sign Up") {
if (!$_POST['email']) $error.="<br />Please enter your email";
else if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) $error.="<br />Please enter a valid email address";
if (!$_POST['password']) $error.="<br />Please enter your password";
else {
if (strlen($_POST['password'])<8) $error.="<br />Please enter a password with at least 8 characters";
if (!preg_match('`[A-Z]`', $_POST['password'])) $error.="<br />Please enter at least 1 capital letter";
}
if ($error) $error = "There were error(s) in your signup details:".$error;
else {
$query = "SELECT * FROM `users` WHERE email='".mysqli_real_escape_string($link, $_POST['email'])."'";
$result = mysqli_query($link, $query);
$results = mysqli_num_rows($result);
if ($results) $error = "That email address is already registered";
else {
$query="INSERT INTO `users` (`email`, `password`) VALUES('".mysqli_real_escape_string($link, $_POST['email'])."', '".md5(md5($_POST['email']).$_POST['password'])."')";
mysqli_query($link, $query);
$message = "You've been signed up!";
$_SESSION['id']=mysqli_insert_id($link);
header("Location:registration.php");
}
}
}
if ($_POST['submit']=="Log In") {
$query="SELECT * FROM `users` WHERE email='".mysqli_real_escape_string($link, $_POST['loginemail'])."' AND password='".md5(md5($_POST['loginemail']).$_POST['loginpassword'])."' LIMIT 1";
$result = mysqli_query($link, $query);
$row = mysqli_fetch_array($result);
if ($row) {
$_SESSION['id']=$row['id'];
header("Location:dashboard.php");
} else {
$loginerror = "We could not find a user with that email and password. Please try again.";
}
}
【问题讨论】:
-
在每个页面的开头包含一个会话检查并相应地重定向。我们通常会创建一个包含在每个页面顶部的文件,用于测试某些会话变量。如果这些不存在,我们将重定向。
-
如果用户可以简单地返回并访问其浏览器中的任何缓存页面,则不会帮助在 PHP 中进行检查。如果要强制执行“注销”状态,则必须使所有页面的 html 不可缓存,从而强制用户的浏览器在每次加载页面时获取新副本。
-
使用
mysqli时,您应该使用参数化查询和bind_param将用户数据添加到您的查询中。 请勿使用手动转义和字符串连接来完成此操作,因为您会犯错误并创建严重的SQL injection bugs。 -
那么代码将如何查找这个?