2010-08-16 2 views
5

Я бы установил его там, где, если кто-то отправит запрос «Выход», он автоматически переведет их на страницу с сообщением «успешный выход из системы». Если клиент пытается нажать кнопку «Назад» или перейти в ограниченную зону, он снова запросит подтверждение HTTP.PHP: HTTP Basic - Выход из системы

То, что я до сих пор это:

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 если пример. com/limited/index.php? logout. Когда пользователь пытается вернуться, однако случайные вещи случаются, иногда он будет запрашивать HTTP-аутентификацию дважды (???), иногда он будет продолжать запрашивать аутентификацию в цикле (?), И иногда это позволит мне вернуться назад, как если бы Я никогда не выходил из системы.

Я новичок в том, как работают сессии, но я понимаю следующее: если/когда человек проверен, он хранит переменную в ее сеансе с именем login со значением true ... если каждый из них получает запрос GET с logout, он затем удалит эту переменную сеанса и вернется к logout.php ... Почему же тогда, когда я нажимаю на индекс, он вернет меня обратно без запроса аутентификации, когда сеанс [login] предположительно не установлен ,

Любое улучшение этого кода PHP оценивается. Я знаю, что я не должен использовать HTTP Basic и должен включать SQL, но meh. Это временное решение.

Редактировать: Я приму решение с MySQL, если приведен пример с инструкциями. У меня нет знания баз данных MySQL или PHP (пока)

+1

Без сеансов лучше всего изменить основную строку царства. – stillstanding

+0

Разве это не столько усилия для временного решения? –

+0

@ на самом деле главная проблема - КОГДА его отправить. Как отличить вызов от зарегистрированного пользователя и звонок от выбывшего из него: –

ответ

1

Грубой идеи начать Вас:

<?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 
+0

Как я могу проверить PHP_AUTH_USER и PHP_AUTH_PW без разбора и .htpass и т. Д.? – ParoX

+0

Если это временное решение, и вам нужен только один набор Username/Password, просто выполните что-то вроде 'if ($ _SERVER ['PHP_AUTH_USER']! = 'TheUsername' || $ _SERVER ['PHP_AUTH_PW']!= 'ThePassword') {/ * 401 Error & Exit * /} else {$ _SESSION ['login'] = true} ' Лично я раньше не использовал PHP_AUTH_USER/PHP_AUTH_PW, я имею тенденцию иметь только форму, которая передает мне их имя пользователя и пароль через $ _GET или $ _POST - намного проще. –

+0

@Brian сохранить вход и перейти в db? –

1

Я нашел способ обойти это.

У меня есть 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>'); 
} 

А вот мой "выход из системы .php 'Код:

session_start(); 
$_SESSION["loged"] = false; // We can't use unset($_SESSION) when using HTTP_AUTH. 
session_destroy(); 
0

Вы можете использовать метатег 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(); 
} 
Смежные вопросы