Я хотел бы настроить его там, где, если кто-то отправит запрос «выйти», он автоматически перенесет их на страницу с сообщением «успешный выход из системы». Если клиент пытается нажать кнопку «Назад» или перейти в ограниченную зону, он снова запросит подтверждение HTTP.
До сих пор я так:
example.com/restricted/index.php:
<?php session_start(); if(isset($_GET['logout'])) { unset($_SESSION["login"]); header("location: ../logout.php"); exit; } if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || !isset($_SESSION["login"])) { header("HTTP/1.0 401 Unauthorized"); header("WWW-authenticate: Basic realm=\"Tets\""); header("Content-type: text/html"); $_SESSION["login"] = true; // Print HTML that a password is required exit; } ?> // The rest of the page is then displayed like normal
Успешно посещает пользователь example.com/logout.php, если доступен example.com/restricted/index.php?logout . Когда пользователь пытается вернуться, однако случайные вещи случаются, иногда он будет запрашивать HTTP-аутентификацию дважды (???), иногда он будет продолжать запрашивать аутентификацию в цикле (?), И иногда это позволит мне вернуться назад, как если бы Я никогда не выходил из системы.
Я новичок в работе сессий, но я понимаю следующее: если / когда человек проверен, он хранит переменную в своем сеансе с именем login со значением true … если каждый из них получает запрос GET с выходом из системы, он будет затем удалите эту переменную сеанса и вернитесь к logout.php … Почему же тогда, когда я нажимаю на индекс, он вернет меня, не запрашивая аутентификацию, когда сеанс [login] предположительно не установлен.
Любое улучшение этого кода PHP оценивается. Я знаю, что я не должен использовать HTTP Basic и должен включать SQL, но meh. Это временное решение.
Изменить: я приму решение с MySQL, если приведен пример с инструкциями. У меня нет знаний базы данных MySQL или PHP (пока)
Грубая идея начать вас:
<?php session_start(); if( isset( $_GET['logout'] ) ) { session_destroy(); header('Location: ../logout.php'); exit; } if( !isset( $_SESSION['login'] ) ) { if( !isset( $_SERVER['PHP_AUTH_USER'] ) || !isset( $_SERVER['PHP_AUTH_PW'] ) ) { header("HTTP/1.0 401 Unauthorized"); header("WWW-authenticate: Basic realm=\"Tets\""); header("Content-type: text/html"); // Print HTML that a password is required exit; } else { // Validate the $_SERVER['PHP_AUTH_USER'] & $_SERVER['PHP_AUTH_PW'] if( $_SERVER['PHP_AUTH_USER']!='TheUsername' || $_SERVER['PHP_AUTH_PW']!='ThePassword' ) { // Invalid: 401 Error & Exit header("HTTP/1.0 401 Unauthorized"); header("WWW-authenticate: Basic realm=\"Tets\""); header("Content-type: text/html"); // Print HTML that a username or password is not valid exit; } else { // Valid $_SESSION['login']=true; } } } ?> // The rest of the page is then displayed like normal
Я нашел способ обойти это.
У меня есть 2 файла: index.php и logout.php
Вот мой код index.php :
# CHECK LOGIN. if (!isset($_SESSION["loged"])) { $_SESSION["loged"] = false; } else { if (isset( $_SERVER['PHP_AUTH_USER'] ) && isset($_SERVER['PHP_AUTH_PW'])) { if (($_SERVER['PHP_AUTH_USER'] == L_USER) && (md5($_SERVER['PHP_AUTH_PW']) == L_PASS)) { $_SESSION["loged"] = true; } } } if ($_SESSION["loged"] === false) { header('WWW-Authenticate: Basic realm="Need authorization"'); header('HTTP/1.0 401 Unauthorized'); die('<br /><br /> <div style="text-align:center;"> <h1 style="color:gray; margin-top:-30px;">Need authorization</h1> </div>'); }
И вот мой код logout.php :
session_start(); $_SESSION["loged"] = false; // We can't use unset($_SESSION) when using HTTP_AUTH. session_destroy();
Вы можете использовать метатег http-equiv="refresh"
с очень коротким временем отклика (например, content="1"
). Это обновление очистит любой $_POST
.
if ( !isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER']!='myusername' || $_SERVER['PHP_AUTH_PW']!='mypassword' || isset($_POST['logout']) ) { header('WWW-Authenticate: Basic realm="My protected area"'); header('HTTP/1.0 401 Unauthorized'); echo '<html><head><title>401 Unauthorized</title><meta http-equiv="refresh" content="1"></head><body><h1>401 Unauthorized</h1><p>You are not allowed to see this page. Reload the page to try again.</p></body></html>'; exit(); }