Нажатие на кнопку выхода обновляет страницу в php

Я создал страницу как index.php и добавил код для входа. У меня он работает нормально, но когда я нажимаю кнопку выхода, он обновляет страницу, и если я ввожу URL-адрес напрямую, например, localhost/sample/testing.php, он открывается, если я также не вошел в систему. Пользователь не может получить доступ к какой-либо странице, пока он не войдет в систему. Вот код, который я написал. Я использовал статические данные для входа в систему, потому что базы данных нет.

Индекс.php

<?php
 session_start();
 $userinfo = array(
            'user1'=>'password1',
            'user2'=>'password2'
            );
if (isset($_GET['logout'])) {
  $_SESSION['username'] = '';
  header('Location:  ' . $_SERVER['PHP_SELF']);
}
if (isset($_POST['username'])) {
  if ($userinfo[$_POST['username']] == $_POST['password']) {
      $_SESSION['username'] = $_POST['username'];
      header("Location:  dashboard.php");
  }else {
     header("Location:  index.php");
  }
}
?>

Боковая панель.php

<?php if ($_SESSION['username']): ?>
<ul>
    <li class = "dropdown profile_details_drop">
        <a href = "#" class = "dropdown-toggle" data-toggle = "dropdown" aria-expanded = "false">
            <div class = "profile_img">
                <div class = "user-name">
                    <p><a href = "?logout=1">Logout</p>
                </div>
                <div class = "clearfix"></div>
            </div>
        </a>
    </li>
</ul>
<?php endif; ?>

Если какой-либо пользователь не вошел в систему, он также может видеть внутренние страницы. Они не могут видеть страницу, пока не войдут в систему.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
256
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы установили $_SERVER['PHP_SELF']. вот почему он перенаправляет на ту же страницу. вам нужно изменить это, например: login.php

if (isset($_GET['logout'])) {
  unset($_SESSION['username']);// do not set it as empty, unset it
  //header('Location:  ' . $_SERVER['PHP_SELF']);//change this line to
 header('Location:  login.php');
}

и еще одна ошибка в вашем другом состоянии, которое вы перенаправляете на index.php, поэтому не вошедший в систему пользователь может видеть индексную страницу.

else {
  //header("Location:  index.php");// change this to
  header('Location:  login.php');
}

NOTE: I have added login.php only for eg. redirect the non-logged in user to where you want.

сама моя индексная страница, где я добавил код функциональности входа в систему

tester 28.06.2019 13:01

Отмените переменную сеанса при выходе из системы:

unset($_SESSION['username']);

Вместо назначения пустой строке:

$_SESSION['username'] = '';

Прежде всего, ваш код должен быть украшен.

Во-вторых, вы забыли закрыть свой тег a href, поэтому ваше утверждение $_GET не является истинным. Поэтому, нажав на ссылку, страница снова проверяет if (isset($_POST['username'])), что является правдой, и вы перенаправляетесь из-за ваших заголовков.

Подумайте о создании logout.php, где вы используете session_destroy и session_unset и перенаправляете своих пользователей на login.php, например:

выход.php:

<?php
session_start();
session_unset($_SESSION['username']);
session_unset();
session_destroy();
header('Location: login.php');
?>

Наконец, подумайте о том, чтобы не использовать $_GET, а предпочесть переменные $_POST или $_SESSION только по той причине, что они не видны в URL-адресе.

но как я могу ограничить страницы для пользователей до тех пор, пока они не войдут в систему

tester 28.06.2019 13:11

Вам придется поиграть с переменными $_SESSION. Если вы сделаете это таким образом, вы также можете реализовать такие механизмы, как токены CSRF, для предотвращения других известных атак. Например, когда пользователь входит в систему, вам придется использовать regenerate_session_id(), который переопределит текущий идентификатор сеанса, полученный на странице входа. Таким образом, только тот, у кого есть этот идентификатор, сможет посетить ваш индексный файл. Кроме того, при выходе из системы вы отменяете сеанс и уничтожаете его, чтобы удалить этот идентификатор.

Alcaeus D 29.06.2019 16:28
Ответ принят как подходящий

Прежде всего, уничтожайте сеанс при выходе из системы. И перенаправить его на страницу входа. Предположим, что index.php — это страница входа.

 if (isset($_GET['logout'])) {
     session_start();
     session_destroy();
    header('Location: index.php');
 }

В sidebar.php проверьте, установлен сеанс или нет. Если сеанс не установлен, это означает, что пользователь не авторизовался. Вы можете запретить им доступ к странице, перенаправив их на страницу входа.

 <?php
 session_start();
 if (!isset($_SESSION["username"]))
{  
    header("location: index.php");
 } ?>

<ul>
   <li class = "dropdown profile_details_drop">
      <a href = "#" class = "dropdown-toggle" data-toggle = "dropdown" aria-expanded = "false">
         <div class = "profile_img">
            <div class = "user-name">
               <p>
      <a href = "?logout=1">Logout</p>                                                                       
      </div>                                  
      <div class = "clearfix"></div>    
      </div>  
      </a>                            
   </li>
</ul>

Другие вопросы по теме