PHP检查会话,检查多个变量以允许访问特定页面

时间:2015-01-29 20:45:20

标签: php variables session

如果对这些问题有一个问题和答案,请道歉,但我已经搜索了大约30分钟,而且我一直在创建一些我不需要知道如何做的会话。

我的问题非常简单,我有一个数据库,其中包含用户登录信息表。每个用户都有一个唯一的ID,站点上的每个页面都会检查会话中是否有人登录。如果用户未登录并创建了会话,则会通过使用Header将其踢回登录屏幕(位置: )。在表格中,它存储了唯一的ID,用户名,密码和"重定向"列,以便当用户登录时,它们被重定向到他们应该看到的页面。网站上没有其他导航,因此看到他们不应该处于最低风险的网页,因为他们必须知道到达网页的确切网址。但是,为了进一步提高安全性,我希望检查会话功能检查用户是否已登录,以及检查唯一ID是否与允许查看该页面的唯一ID匹配。

这是我尝试的代码(只是为了查看我是否可以限制唯一ID),它给了我Header php警告,它不能被修改,因为它已经被发送了。

<?PHP
session_start();
if (!(isset($_SESSION['unique_id']) && $_SESSION['unique_id'] != '1, 2, 3')) {
header ("Location: /dampers/main_login.php");
}
?>

我读到&#34;如果未设置会话,并且唯一ID不等于1,2或3,则返回登录页面&#34;。

我设置唯一ID的方式与在check login php中设置用户名和密码的方式相同。

    mysql_connect("$host", "$username", "$password")or die("cannot connect"); 
mysql_select_db("$db_name")or die("cannot select DB");

$username=$_POST['username']; 
$password=$_POST['password'];
$unique_id=$_POST['unique_id'];


$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
$sql="SELECT * FROM $tbl_name WHERE username='$username' and password='$password'";
$result=mysql_query($sql);


$count=mysql_num_rows($result);


if($count==1){


session_start();
$_SESSION["username"] = $username;
$_SESSION["password"] = $password;
$_SESSION["unique_id"] = $unique_id;

$result = mysql_query("SELECT redirect FROM damper_members WHERE username = '".$_SESSION['username']."'");

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
   header("Location:" . $row['redirect']);
}

// header("Location: /dampers/index.php");
exit;
}
else {
$errorMessage = "Wrong Username or Password";
header("Location: main_login.php");
}

ob_end_flush();
?>

我觉得好像我可能遗漏了一些东西,并且我意识到我检查特定唯一ID的伪代码可能已经过时了。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

错误消息的原因是在修改标头信息之前有输出。输出发生在这里:

<!-- <?php include('../../inc/check_session.php'); ?> -->

在您打开<?php标记之前,有一个html评论标记<!--。 html注释标记是一个输出并发送到客户端,顺便说一下,你的php代码没有任何影响,因为它只在浏览器中处理。如果你想在php中评论一些东西,请使用/* .. */。那是你的情况:

<?php 
  /* include('../../inc/check_session.php');  */ 
  session_start();
  /* ... */

确保在开场<?php之前没有任何内容,甚至没有空格。

此外,我想假设$_SESSION['unique_id'] != '1, 2, 3'你想要检查会话变量是否等于&#39; 1&#39;或者&#39; 2&#39;或者&#39; 3&#39;。但那并不是什么?以这种方式工作,试试这个:

if (!isset($_SESSION['unique_id']) || !in_array($_SESSION['unique_id'], array('1', '2', '3'))) {
  header ("Location: /dampers/main_login.php");
}

编辑:好的,这似乎成了一个反复试验的事情。但如果我理解你,那么唯一的id就存储在用户表中

$sql="SELECT * FROM $tbl_name WHERE username='$username' and password='$password'";
$result=mysql_query($sql);

$count=mysql_num_rows($result);

if($count==1){
 $userRow = mysql_fetch_array($result, MYSQL_ASSOC);

 session_start();
 $_SESSION["username"] = $username;
 $_SESSION["password"] = $password;
 $_SESSION["unique_id"] = $userRow['uniuque_id']; // assuming the corresponding table row name is 'unique_id'