URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 4287
[ Назад ]

Исходное сообщение
"Как ставить пароль"

Отправлено Akmal , 11-Авг-06 11:03 
Написал на php страничку, вход в которую возможен только после ввода пароля, кроме того имеются три пары логин/пароля от которого зависят содержимое странички.
Код такой:
<?
header("Expires: Sat, 01 Jan 2000 00:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: post-check=0, pre-check=0",false);
header("Pragma: no-cache");
session_cache_limiter("public, no-store");
session_start();

function http_auth()
{
   $_SESSION['AUTH'] = 1;
    header('HTTP/1.0 401 Unauthorized');
    header('WWW-Authenticate: Basic realm="Welcome to company"');
    // The actions to be done when the user clicks on 'cancel'
    echo "Unauthorized";
    exit();
}
          
if( !isset($_SERVER['PHP_AUTH_USER']) or @$_SESSION['AUTH'] != 1 )
{
    http_auth();
    exit();
}            

echo "<html>";
echo "<head>";
echo "<META http-equiv='content-type' content='text/html; charset=windows-1251'>";
echo "<link rel=stylesheet href=../set/bill.css type='text/css'>";

$login_pass_file = file("/usr/local/apache/secret/userpass");
foreach ($login_pass_file as $login_pass) {
    list($login,$pass) = explode(';',rtrim($login_pass));
}
if ($_SERVER['PHP_AUTH_USER']=="login1" && $_SERVER['PHP_AUTH_PW']=="pass1") {
    $ip=$login;
    $ip_pw=$pass;
    $adv_table=0;
} elseif ($_SERVER['PHP_AUTH_USER']=="login2" && $_SERVER['PHP_AUTH_PW']=="pass2") {
    $ip=$login;
    $ip_pw=$pass;
    $adv_table=1;
} else {
    exit();
}
...
echo "content_of_site";
?>

Сегодня обнаружил, что когда на диалоговом окне нажимаешь Отмена, затем из браузера Назад, а потом опять идешь по ссылке страница открывается без запроса пароля.
Как это запретить?????


Содержание

Сообщения в этом обсуждении
"Как ставить пароль"
Отправлено weris , 14-Авг-06 10:19 
>Как это запретить?????

ставить и проверять куки??


"Как ставить пароль"
Отправлено shep , 23-Авг-06 00:40 
>Написал на php страничку, вход в которую возможен только после ввода пароля,
>кроме того имеются три пары логин/пароля от которого зависят содержимое странички.
>
>Код такой:
>function http_auth()
>{
!2>   $_SESSION['AUTH'] = 1;
>    header('HTTP/1.0 401 Unauthorized');
!1>    header('WWW-Authenticate: Basic realm="Welcome to company"');
>    // The actions to be done when the
>user clicks on 'cancel'
>    echo "Unauthorized";
>    exit();
>}
(кут)
>
>Сегодня обнаружил, что когда на диалоговом окне нажимаешь Отмена, затем из браузера
>Назад, а потом опять идешь по ссылке страница открывается без запроса
>пароля.
>Как это запретить?????


Всё очень просто.
В месте !1 ты объявляешь заголовок аутентификации. Поэтому прошла она или нет, параметр PHP_AUTH_USER заполняется. И я так подозреваю что в случае "Отмена-Назад-Вперед" она заполняется пустой строкой. Но пустая строка это всё-таки isset($var). Поэтому ты по сути два раза (см. !2) делаешь одну и ту же проверку.

Можно проверку заменить. В голову приходит два варианта:
1. if( empty($_SERVER['PHP_AUTH_USER']) )
  здесь есть два ньюанса.
    - Во-первых в случае error_reporting(E_ALL & E_NOTICE) ты получишь замечание что индекс PHP_AUTH_USER не определен при первом заходе на страницу. Обходится так:
      if (!isset($_SERVER['PHP_AUTH_USER']) || empty($_SERVER['PHP_AUTH_USER']))...
    )
    - Во-вторых ... а кто его знает, мало ли - есть фича/бага прохождения аутентификации с пустым логином. Обходится проверкой логина.
      if ( !myCheckLogin($_SERVER['PHP_AUTH_USER']) )...,
      где myCheckLogin($str) это что-то вроде return in_array($str, $correctLogins);

2. таки использовать $_SESSION['AUTH']. Т.е.
if ($_SERVER['PHP_AUTH_USER']=="login1" && $_SERVER['PHP_AUTH_PW']=="pass1") {
    $ip=$login;
    $_SESSION['AUTH'] = 1;
    ...
,... для других паролей то же самое
    а в проверке:
    if ( !isset($_SESSION['AUTH']) || ( -1 != $_SESSION['AUTH'] ) )...отказ

Надеюсь что-то можно разобрать... может быть не очень понятно объяснил, могу показать на полном коде. l4igem(два)(кусака)list(тчк)ру