【问题标题】:PHP sessions (user/admin) user levelsPHP 会话(用户/管理员)用户级别
【发布时间】:2017-07-17 12:46:18
【问题描述】:

我只是 php 的新手,几个星期自学并制作各种项目来学习如何做事......

我目前正在制作一个基本项目,其中包括... 索引(登录页面) 登记 家庭(用户级别) 管理员(管理员级别) 登出 数据库连接

我的数据库中有一个名为 userlevel 的列,默认为 0,对于管理员帐户,我将更改为 1....

目前任何登录的用户都可以访问 home.php 页面,因为会话变量是“用户”,所以只要任何用户登录,他们就会转到 home.php,如果没有登录,则返回索引有效....就像我说的我对 php 很陌生,今天才开始学习会话,所以它有点压倒性...基本上我只是将同一页面从主页粘贴到管理员开始编辑会话详细信息,以便它将只允许用户级别为 1 的用户访问管理员,否则返回索引......我的相关页面代码如下......

index.php(登录页面)

<?php
	ob_start();
	session_start();

	require_once 'dbconnect.php';


	
	// it will never let you open index(login) page if session is set
	if ( isset($_SESSION['user'])!="" ) {
		header("Location: home.php");
		exit;
	}
	
	$error = false;
	
	if( isset($_POST['btn-login']) ) {	
		
		// prevent sql injections/ clear user invalid inputs
		$email = trim($_POST['email']);
		$email = strip_tags($email);
		$email = htmlspecialchars($email);
		
		$pass = trim($_POST['pass']);
		$pass = strip_tags($pass);
		$pass = htmlspecialchars($pass);
		// prevent sql injections / clear user invalid inputs
		
		if(empty($email)){
			$error = true;
			$emailError = "Please enter your email address.";
		} else if ( !filter_var($email,FILTER_VALIDATE_EMAIL) ) {
			$error = true;
			$emailError = "Please enter valid email address.";
		}
		
		if(empty($pass)){
			$error = true;
			$passError = "Please enter your password.";
		}
		
		// if there's no error, continue to login
		if (!$error) {
			
			$password = hash('sha256', $pass); // password hashing using SHA256
		
			$res=mysql_query("SELECT id, fname, pass FROM project WHERE email='$email'");
			$row=mysql_fetch_array($res);
			$count = mysql_num_rows($res); // if uname/pass correct it returns must be 1 row
			
			if( $count == 1 && $row['pass']==$password ) {
				$_SESSION['user'] = $row['id'];	
				header("Location: home.php");
			} else {
				$errMSG = "Incorrect Credentials, Try again...";
			}

				
		}
		
	}
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Sign In</title>
</head>
<body>


<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" autocomplete="off">


<input type="email" name="email" placeholder="Enter Your Email" value="<?php echo $email; ?>" maxlength="40" />
<?php echo $emailError; ?><br>

<br>

<input type="password" name="pass" placeholder="Enter Your Password" maxlength="15" />
<?php echo $passError; ?><br>

<br>

<button type="submit" name="btn-login">Sign In</button><br>


<br>
<br>
<a href="register.php">Register</a> <a href="index.php">Sign in</a> <a href="admin.php">Admin</a>
<br>
<?php
if ( isset($errMSG) ) {

?>
 <?php echo $errMSG; ?>

<?php
}
?>


</body>
</html>
<?php ob_end_flush(); ?>

home.php

<?php
	ob_start();
	session_start();
	require_once 'dbconnect.php';

	
	// if session is not set this will redirect to login page
	if( !isset($_SESSION['user']) ) {
		header("Location: index.php");
		exit;
	}
	// select loggedin users detail
	$res=mysql_query("SELECT * FROM project WHERE id=".$_SESSION['user']);
	$userRow=mysql_fetch_array($res);




	
?>




<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome - <?php echo $userRow['fname']; ?></title>
</head>
<body>

Hello <?php echo $userRow['fname']; ?> you are sucessfully logged in!

<br>Your last name is <?php echo $userRow['lname']; ?>
<br>Your email address is <?php echo $userRow['email']; ?>

<br><br><br><br><br><br><br><br><br><br>







<br><br><br><br><br><br><br><br><br><br>


<a href="logout.php?logout"></span>Sign Out</a></li>


<br>
<br>
<a href="register.php">Register</a> <a href="index.php">Sign in</a> <a href="admin.php">Admin</a>
             
</body>
</html>
<?php ob_end_flush(); ?>

admin.php

<?php
	ob_start();
	session_start();

	require_once 'dbconnect.php';

	
	
	// if session is not set this will redirect to login page
	if( !isset($_SESSION['user']) ) {
		header("Location: index.php");
		exit;
	}

	// select loggedin users detail
	$res=mysql_query("SELECT * FROM project WHERE id=".$_SESSION['user']);
	$userRow=mysql_fetch_array($res);




	
?>




<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Welcome - <?php echo $userRow['fname']; ?></title>
</head>
<body>


Hello <?php echo $userRow['fname']; ?> you are sucessfully logged in!

<br>Your last name is <?php echo $userRow['lname']; ?>
<br>Your email address is <?php echo $userRow['email']; ?>

<br><br><br><br><br><br><br><br><br><br>


<h1><?php echo $userRow['userlevel']; ?></h1>





<br><br><br><br><br><br><br><br><br><br>


<a href="logout.php?logout"></span>Sign Out</a></li>

<br>
<br>
<a href="register.php">Register</a> <a href="index.php">Sign in</a> <a href="admin.php">Admin</a>
             
</body>
</html>
<?php ob_end_flush(); ?>

如果有人可以告诉我如何让会话查看数据库中的用户级别行以提取存储的信息(用户或管理员为 0 或 1)以及如何相应地更改 index.php(登录)页面,以及如何编辑 admin.php 以只允许用户级别为 1 的登录用户查看页面?

对不起,如果这含糊不清或到处都是,我仍然每天都在发现新东西

谢谢

【问题讨论】:

  • 如果您将用户 ID 保存在 cookie 中,如果 ID 是可预测的,那么只需更改我的 cookie,我就可以成为任何用户。出于这个原因,您通常不会存储用户 ID,而是存储一些大的随机会话 ID。
  • 旁注,您将希望停止使用 mysql_* 库。它已从 PHP 7 中删除,并被某些版本的 PHP5 弃用(虽然我不记得 PHP5 的哪个版本,这无关紧要)。查看使用绑定参数切换到mysqli_*PDO 以避免数据库操作/破坏。

标签: php mysql session


【解决方案1】:

如果您将 is_admin 字段添加到您的项目表(我假设是您的用户表),那么您可以使用以下内容测试用户是否为管理员:

$sql = "SELECT * FROM project WHERE id='" . mysql_real_escape_string($id) . "'";
$res = mysql_query($sql);
$row = mysql_fetch_array($result, MYSQL_ASSOC);
if (!$row || !$row['is_admin']) {
    die();
} 

(我没有使用PHP,也没有测试过这段代码,所以认为它是伪代码)

【讨论】:

    【解决方案2】:

    警告

    你不应该再在 PHP 中使用 mysql_* 函数,因为它们已经从 php7 中删除,并且不会从我的理解中返回。

    请改用 mysqli_* 或 pdo*。

    话说回来……


    至于将数据库信息存储到用户会话中的解决方案,您可以使用我为此编写的几个函数。

    注意:这些使用不受支持的 mysql_* 函数,并且不应在未更新到受支持的替代方案(如 mysqli_*)的情况下复制/粘贴。


    连接到 MySQL 数据库

    function SQL_LOGIN() {
        $servername = "localhost";
        $username = "myusername";
        $password = "XXXXXXXXXX";
    
        // Create connection
        $conn = mysql_connect($servername, $username, $password);
    
        // Check connection
        if (!$conn) {
            die("Connection failed: " . mysqli_connect_error());
        }   
        return $conn;
    }
    

    -

    执行 MySql 查找

    function SQL_SELECT($inputDB, $inputTable, $inputColumns, $inputParams, $inputConnection) {
        $query = "SELECT ".mysql_real_escape_string($inputColumns)." from ".$inputDB.".".mysql_real_escape_string($inputTable)." ".$inputParams."";
        $result = mysql_query($query, $inputConnection);
        return $result;
    }
    

    -

    将 SQL 查询结果转换为数组

    function SQL_RESULT_TO_ARRAY($result) {
        $endArray = array();
        if (mysql_num_rows($result) > 0) {
            while($row = mysql_fetch_assoc($result)) {
                $endArray[] = $row;
            }
        } else {
            /* blank result */
        }    
        return $endArray;
    }
    

    -

    如果用户是管理员,则将会话变量 is_admin 设置为 true

           $inputEmail = ""; /* put in your code to get the user's email or whatever */
    
            session_start();
            $conn = SQL_LOGIN();
    
            $result = SQL_SELECT("users", "ID,EMAIL,IS_ADMIN", "where EMAIL like '".$inputEmail."'", $conn);
            $resultArray = SQL_RESULT_TO_ARRAY($result);
            foreach ($resultArray as $idx=>$childArray) {
               if ($childArray["IS_ADMIN"] == 1) { 
                   $_SESSION["IS_ADMIN"] = true; 
               }
            }
    

    编辑

    一旦您将像$_SESSION["IS_ADMIN"] 这样的会话变量设置为true,那么它将一直保留到:

    • 你打电话给session_destroy()
    • 用户从浏览器中删除 cookie
    • 会话根据 php.ini 中定义的会话到期时间到期
    • 访问了一个新页面,但未调用session_start() 命令(一旦调用session_start(),则会话将恢复,并带有任何$_SESSION[] 变量)

    注意所提供的代码旨在指导正确的方向,而不是安全的解决方案。部分代码可能允许攻击者侵入您的 SQL 数据库、PHP 甚至您的服务器。

    不要直接复制/粘贴到生产环境中

    【讨论】:

      猜你喜欢
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-09
      • 2015-09-30
      • 2012-05-21
      • 1970-01-01
      • 2019-05-25
      相关资源
      最近更新 更多