如果对这些问题有一个问题和答案,请道歉,但我已经搜索了大约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的伪代码可能已经过时了。任何帮助将不胜感激!
答案 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'