【问题标题】:SESSION Check - in user pages会话签入 - 用户页面
【发布时间】: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
  • 那么代码将如何查找这个?

标签: php mysql session mysqli


【解决方案1】:
<?php
session_start();
if(isset($_SESSION['id']))
{
?>

会员页面内容

<?php
}
else
{
 header("Location:login.php");
}
?>

说明:
最初您应该启动会话,然后您应该检查您传递的会话变量是否存在于该成员页面。

或者你可以简单地拥有

<?php
session_start();
if(!isset($_SESSION['id']))
{
 header("Location:login.php");
}
?>

在页面顶部

【讨论】:

  • 你应该解释为什么这会有所帮助。
  • 感谢@Felix 的提问,但 Anthony 只在最后的评论中询问了代码。
  • Stack Overflow 是一个问答网站,一个 public 网站。您的回答不仅针对原始海报,还针对互联网用户。因此,永远不要假设您的答案不需要解释,因为操作人员理解。我将标记缺少上下文的答案,而这些答案在这里没有得到高度重视。您现在的答案,即使缺少一些格式,也可能比最初出现的几行更有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多