Извините, если есть вопрос и ответ для них, но я искал около 30 минут, и я продолжаю получать хиты при создании сеансов, которые мне не нужно знать, как это сделать.
Мой вопрос довольно прост, у меня есть база данных с таблицей входных данных для пользователей. Каждый пользователь имеет уникальный идентификатор, и каждая страница на сайте проверяет сеанс для того, чтобы кто-то просто вошел в систему. Если пользователь не вошел в систему и не создал сеанс, он возвращает вас обратно на экран входа в систему с помощью заголовка (Location:). В таблице хранится уникальный идентификатор, имя пользователя, пароль и столбец "переадресация", поэтому, когда пользователь входит в систему, они перенаправляются на страницу, которую они должны видеть. На веб-сайте нет другой навигации, поэтому просмотр страниц, на которых они не должны подвергаться минимальному риску, видят, что они должны знать точный URL-адрес, чтобы попасть на страницу. Однако для обеспечения безопасности я хочу, чтобы функция проверочного сеанса проверяла, что пользователь вошел в систему, а также проверяет, соответствует ли уникальный идентификатор уникальному идентификатору, разрешенному для просмотра этой страницы.
Это код, который я пробовал (просто посмотреть, могу ли я ограничивать уникальные идентификаторы), и он дает мне предупреждение заголовка php о том, что он не может быть изменен, поскольку он уже отправлен.
<?PHP
session_start();
if (!(isset($_SESSION['unique_id']) && $_SESSION['unique_id'] != '1, 2, 3')) {
header ("Location: /dampers/main_login.php");
}
?>
Я прочитал это как "Если сеанс не установлен, а уникальный идентификатор не равен 1, 2 или 3, вернитесь на страницу входа".
Я установил уникальный идентификатор так же, как и имя пользователя и пароль были установлены в 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();
?>
Мне кажется, что я, вероятно, что-то пропустил, и понимаю, что мой псевдокод для проверки конкретных уникальных идентификаторов, вероятно, далеко. Любая помощь будет оценена!
Причиной сообщения об ошибке является то, что перед изменением информации заголовка был выход. Результат происходит здесь:
<!-- <?php include('../../inc/check_session.php'); ?> -->
Прежде чем открыть <?php
, появится тег комментария html <!--
. Тег комментария html является выходным и отправляется клиенту, и, кстати, не влияет на ваш PHP-код, поскольку он обрабатывается только в браузере. Если вы хотите прокомментировать что-то в php use /*.. */
. Это в вашем случае:
<?php
/* include('../../inc/check_session.php'); */
session_start();
/* ... */
Убедитесь, что перед открытием <?php
нет ничего, кроме пробела.
Кроме того, я полагаю, что с $_SESSION['unique_id'] != '1, 2, 3'
вы хотите проверить, равна ли переменная сеанса "1" или "2" или "3". Но это не работает так, попробуйте следующее:
if (!isset($_SESSION['unique_id']) || !in_array($_SESSION['unique_id'], array('1', '2', '3'))) {
header ("Location: /dampers/main_login.php");
}
Редактирование: Хорошо, похоже, это пробная версия и ошибка. Но если я правильно понял, уникальный идентификатор хранится в пользовательской таблице
$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'
<!-- <?php include('../../inc/check_session.php'); ?> --> <?PHP session_start(); if (!(isset($_SESSION['unique_id']) && $_SESSION['unique_id'] != '1, 2, 3')) { header ("Location: /dampers/main_login.php"); } ?> <?php include('../../inc/head.php'); ?>
Есть включение check_session, но я его закомментировал. в голове только один заголовок (Location :).