PHP проверка сеанса, проверка нескольких переменных, чтобы разрешить доступ к определенным страницам

0

Извините, если есть вопрос и ответ для них, но я искал около 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();
?>

Мне кажется, что я, вероятно, что-то пропустил, и понимаю, что мой псевдокод для проверки конкретных уникальных идентификаторов, вероятно, далеко. Любая помощь будет оценена!

  • 0
    Сообщение «Заголовки уже отправлены» обычно появляется, когда уже был вывод (например, с использованием echo), а затем заголовок http изменяется. Но с первым выводом заголовки отправляются клиенту и, следовательно, больше не могут быть изменены. Я предполагаю, что ваш код включен в другой файл, где происходит какой-то вывод.
  • 0
    Это полный раздел <!-- <?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 :).
Теги:
session
variables

1 ответ

0

Причиной сообщения об ошибке является то, что перед изменением информации заголовка был выход. Результат происходит здесь:

<!-- <?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'
  • 0
    Оценил, я не понял, что использовал неправильные теги комментариев. У текстового редактора, который я использую, есть ярлык для него, и я предположил, что он автоматически выбрал правильный метод комментирования на основе кода, который был выбран, как и другие редакторы, которые я использовал в прошлом. Тем не менее, по-прежнему ищет ограничение конкретных страниц для конкретных идентификаторов;)
  • 0
    Я сделал обновление, касающееся конкретных идентификаторов, надеюсь, это поможет
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню