【问题标题】:Unable to protect pages/area with password无法使用密码保护页面/区域
【发布时间】:2019-01-18 21:07:35
【问题描述】:

我正在尝试创建网站的密码保护区域。 我想通过检查 MySql 表中的用户名和密码来允许访问,然后启动一个会话并允许在会话处于活动状态时访问多个页面。如果有人试图直接访问这些页面之一,我想将他们重定向到登录页面。

我的登录页面代码是:

     if (isset($_POST['submit']))
        {     
    include("config.php");
    session_start();
    $username=$_POST['username'];
    $password=$_POST['password'];
    $passwordc=md5($password);        

    $query = "SELECT username FROM admin WHERE username='$username' AND password='$passwordc'";
     $result2 = $conn->query($query);

    if ($result2->num_rows != 0) {          

    $_SESSION["username"] = $user;
      echo "<script language='javascript' type='text/javascript'> location.href='admin_view.php' </script>";   
    }else{
      echo "<script type='text/javascript'>alert('User Name Or Password Invalid!')</script>";
    }

    }

它似乎有效(如果用户名和密码匹配,则正确重定向,如果不匹配则显示警报)。 我没有做的,实际上是在会话未激活时保护我的页面不被显示。

   session_start();
if (!$_SESSION["username"]) {
    header("Location: login.php");
}

我不是程序员,也不是受过良好教育的网络开发人员。我知道 HTML 和 CSS,我几乎无法使用自述文件之后的现成 php 和 js 脚本。 任何帮助将不胜感激。

【问题讨论】:

  • MD5 不够好。在passwird_hash中使用构建
  • 您的代码易受 SQL 注入攻击。使用准备好的语句
  • 我想用密码保护的页面即使直接访问也会显示(无需先通过登录页面)
  • 请不要自己滚动密码散列,特别是不要使用 MD5() 或 SHA1()。 PHP 提供password_hash()password_verify() 请使用它们。这里有一些good ideas about passwords如果你使用的是5.5之前的PHP版本there is a compatibility pack available here
  • @Dharman:谢谢,但 atm 安全不是我的主要问题。一旦我能够在用户未登录的情况下真正阻止页面,我将努力提高安全性。

标签: php mysql session login


【解决方案1】:

修改你的登录代码为

 if (isset($_POST['submit']))
    {     
   include("config.php");
  $username= $crud->escape_string($_POST['username']);
  $password= $crud->escape_string($_POST['password']);
   $passwordc=md5($password); 
   $query = "SELECT username FROM admin WHERE username='$username' AND 
   password='$passwordc'";
   $result2 = $conn->query($query);
  if ($result2->num_rows != 0) { 
   session_start();         
  $_SESSION["username"] = $user;
  header("Location:admin_view.php");   
}else{
  $Message = urlencode("user name password invalid!");
                      header("Location:login.php?Message=".$Message);
}
   }

如果你的值成功存储在会话中,那么你可以像这样使用

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

在每一页的顶部 您必须将查询中的名称存储到会话中

【讨论】:

  • 始终在 header 之后退出,不要使用 MD5 进行哈希,并使用准备好的语句。
  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 2021-06-10
  • 2016-01-26
  • 2011-06-21
  • 2017-02-03
相关资源
最近更新 更多