Автор Тема: HTTP-аутентификации  (Прочитано 2526 раз)

0 Пользователей и 1 Гость смотрят эту тему.

Оффлайн kabancheg

  • Новичок
  • *
  • Сообщений: 47
  • карма: +0/-0
    • Просмотр профиля
HTTP-аутентификации
« : 04 Сентября 2009, 14:41:10 »
И снова здравствуйте веб программисты!

У меня на сайте есть админовская часть. доступ осуществляется
по логину и паролю через HTTP-аутентификации. вот php-код скрипта:

if (!isset($_SERVER['PHP_AUTH_USER']))

{
        Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
        Header ("HTTP/1.0 401 Unauthorized");
        exit();
}

else {
        if (!get_magic_quotes_gpc()) {
                $_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
                $_SERVER['PHP_AUTH_PW'] = mysql_escape_string($_SERVER['PHP_AUTH_PW']);
        }

        $query = "SELECT pass FROM userlist WHERE user='".$_SERVER['PHP_AUTH_USER']."'";
        $lst = @mysql_query($query);

        if (!$lst)
        {
            Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
        Header ("HTTP/1.0 401 Unauthorized");
        exit();
        }

        if (mysql_num_rows($lst) == 0)
        {
           Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
           Header ("HTTP/1.0 401 Unauthorized");
           exit();
        }

        $pass =  @mysql_fetch_array($lst);
        if ($_SERVER['PHP_AUTH_PW']!= $pass['pass'])
        {
            Header ("WWW-Authenticate: Basic realm=\"Admin Page\"");
           Header ("HTTP/1.0 401 Unauthorized");
           exit();
        }



на локальном сервере Apache все работало. при запросе страницы выходило окно
где спрашивался логин и пароль, я вводил и все работало:
 



проблема возникла когда закинул файлы на сервер idhost.
на idhost выходит такое окно:








Форма работает, ввожу логин и пароль, нажимаю отправить.
форма  повторно появляется уже пустая.
Думая переменные не передаются.
Я думаю что от сервера зависит.

В чём может быть причина??
« Последнее редактирование: 04 Сентября 2009, 14:45:53 от kabancheg »

Оффлайн Rex

  • Administrator
  • 7 уровень
  • *****
  • Сообщений: 1811
  • карма: +15/-0
  • Странник
    • Просмотр профиля
    • ВКГУ им. С. Аманжолова
Re: HTTP-аутентификации
« Ответ #1 : 04 Сентября 2009, 16:50:30 »
Я, так полагаю, что скрипт не весь. Тебе нужно ставить флаг, говорящий что ты зашел уже - либо в куки, либо в сессию, а можно и туда и туда. По нему уже ориентироваться.

А почему выбрана базовая авторизация?

Оффлайн kabancheg

  • Новичок
  • *
  • Сообщений: 47
  • карма: +0/-0
    • Просмотр профиля
Re: HTTP-аутентификации
« Ответ #2 : 04 Сентября 2009, 21:17:53 »
Вобщето это весь скрипт. Вначале нет только соединения с бд.

Я не сам писал скрипт этой авторизации. И я мало что в нем понимаю.
Я его скачал, применил на локальном, работает.


Мне кажется, что проблема связана с глобальным массивом:   $_SERVER['PHP_AUTH_USER']
Дело в том, что на локальном у меня сервер Apache и php4.
А на IDhost сервер IIS и Php5.

не передается логин и пароль.

Может быть кто знает, что изменить в скрипте, что б решить проблему?

Оффлайн Rex

  • Administrator
  • 7 уровень
  • *****
  • Сообщений: 1811
  • карма: +15/-0
  • Странник
    • Просмотр профиля
    • ВКГУ им. С. Аманжолова
Re: HTTP-аутентификации
« Ответ #3 : 07 Сентября 2009, 17:00:59 »
Вобщето это весь скрипт. Вначале нет только соединения с бд.

Я не сам писал скрипт этой авторизации. И я мало что в нем понимаю.
Я его скачал, применил на локальном, работает.


Мне кажется, что проблема связана с глобальным массивом:   $_SERVER['PHP_AUTH_USER']
Дело в том, что на локальном у меня сервер Apache и php4.
А на IDhost сервер IIS и Php5.

не передается логин и пароль.

Может быть кто знает, что изменить в скрипте, что б решить проблему?
Попробуй там проверить вот как:

if (count($_REQUEST)){
   exit(
"<pre>".print_r($_REQUESTtrue)."</pre>");
}


Это добавь в верх страницы.

Как это работает.

Когда ты отправишь страницу, то выведется дамп массива _REQUEST. Оттуда ты и поймешь, правильно ли ты обращаешься или нет.

Оффлайн kabancheg

  • Новичок
  • *
  • Сообщений: 47
  • карма: +0/-0
    • Просмотр профиля
Re: HTTP-аутентификации
« Ответ #4 : 07 Сентября 2009, 23:43:28 »
Рахмет, попробывал, но ничего не изменилось.


Оффлайн te$t

  • 2 уровень
  • **
  • Сообщений: 94
  • карма: +1/-0
  • Одиночка
    • Просмотр профиля
    • MegaPro
Re: HTTP-аутентификации
« Ответ #5 : 08 Сентября 2009, 00:49:45 »
А не проще через .htaccess настроить аутентификацию директории \Admin Page\ а скрипт админки оставить в покое? Судя по скрипту это почти одно и то-же. 

Оффлайн Rex

  • Administrator
  • 7 уровень
  • *****
  • Сообщений: 1811
  • карма: +15/-0
  • Странник
    • Просмотр профиля
    • ВКГУ им. С. Аманжолова
Re: HTTP-аутентификации
« Ответ #6 : 08 Сентября 2009, 10:09:55 »
Рахмет, попробывал, но ничего не изменилось.
Он хоть что-то выводил?! Должен был вывести дамп массива. Что ты делал конкретно.

Оффлайн shootnix

  • 2 уровень
  • **
  • Сообщений: 96
  • карма: +2/-0
    • Просмотр профиля
    • shootnix.есть
Re: HTTP-аутентификации
« Ответ #7 : 09 Сентября 2009, 00:43:09 »
.htapassw на месте? он сгенерин правильно? Там именно то, что нужно?

Оффлайн kabancheg

  • Новичок
  • *
  • Сообщений: 47
  • карма: +0/-0
    • Просмотр профиля
Re: HTTP-аутентификации
« Ответ #8 : 09 Сентября 2009, 21:24:34 »
У меня тут че то случилось, то ли комп погнал то ли на сервере неполадки.

For Rex: Вставил все как ты сказал,снова запросил логин и пароль, ввел  и форма появилась снова..

Удали скрипт проверки и все что с ним связано, но при входе в директорию все равно просит логин и пароль!

For Test: Может быть и проще, но я просто хорошо не знаком .htaccess.

Оффлайн Rex

  • Administrator
  • 7 уровень
  • *****
  • Сообщений: 1811
  • карма: +15/-0
  • Странник
    • Просмотр профиля
    • ВКГУ им. С. Аманжолова
Re: HTTP-аутентификации
« Ответ #9 : 10 Сентября 2009, 18:27:44 »
Хм. Что-то чем дальше тем страшнее. Вот что сделаем. Вот тебе скрипт. Только что написал, проверенный на Apache2  правда.

<?php
/**
 * $file : protect.php
 */
defined('DS') || define('DS',DIRECTORY_SEPARATOR);
if (!
session_id()){
	
session_start();
}
$accList = require (dirname(__FILE__) . DS 'accounts.php');
if (!
count($accList)){ exit("Список пользователей поврежден!"); }
$needle = array();
$is_auth false;

isset(
$_SERVER['PHP_AUTH_USER']) && $needle['user'] = $_SERVER['PHP_AUTH_USER'];
isset(
$_SERVER['PHP_AUTH_PW']) && $needle['pass'] = $_SERVER['PHP_AUTH_PW'];

/**
 * Наш ключ, по кторому мы проверяем, активна ли сессия.
 */
if (isset($_SESSION['is_auth'])){ $is_auth true; }
if (
count($needle) > && !$is_auth){
	
if (
in_array($needle,$accList)){
	
	
$_SESSION['is_auth'] = true;
	
	
$is_auth true;
	
}
}
if (!
$is_auth){
	
header("WWW-Authenticate: Basic realm=\"Protected Area\"");
	
header("HTTP/1.0 401 Unauthorized");
	
exit();
}
?>

и к нему еще один файл, с аккаунтами:

<?php
/**
 * $file: accounts.php
 */
return array(
	
array(
	
	
'user'=>'admin',
	
	
'pass'=>'123'
	
),
	
array(
	
	
'user'=>'Rex',
	
	
'pass'=>'321'
	
),
	
array(
	
	
'user'=>'User',
	
	
'pass'=>'qwerty'
	
)
 );
?>


Включай protect.php в начало каждого файла что следует защитить и все. Имей ввиду, оба файла лежат в одной и той же директории.

Оффлайн kabancheg

  • Новичок
  • *
  • Сообщений: 47
  • карма: +0/-0
    • Просмотр профиля
Re: HTTP-аутентификации
« Ответ #10 : 11 Сентября 2009, 12:15:46 »
Всё сделал как ты сказал, но результат тот же. пробывал как на старой
директории, так и создавал новую с новыми файлами. Выходит все тоже окно
и после ввода, выходит опять!



Рахмет за пмощь, за совет!

Оффлайн Rex

  • Administrator
  • 7 уровень
  • *****
  • Сообщений: 1811
  • карма: +15/-0
  • Странник
    • Просмотр профиля
    • ВКГУ им. С. Аманжолова
Re: HTTP-аутентификации
« Ответ #11 : 11 Сентября 2009, 16:16:21 »
Всё сделал как ты сказал, но результат тот же. пробывал как на старой
директории, так и создавал новую с новыми файлами. Выходит все тоже окно
и после ввода, выходит опять!

Рахмет за пмощь, за совет!

хм. сделай вот что. Возьми новый файл protect.php:

<?php
/**
 * $file : protect.php
 */
defined('DS') || define('DS',DIRECTORY_SEPARATOR);

function 
log_err($msg "UNKNOWN ERROR") {
	
$fp fopen dirname(__FILE__) . DS "system.err""a" );
	
fwrite $fpdate "d.m.y H:i" ) . "\t" $_SERVER ['QUERY_STRING'] . "\t{$msg}\n" );
	
fclose $fp );
}
defined('DS') || define('DS',DIRECTORY_SEPARATOR);
if (!
session_id()){
	
session_start();
}
$accList = require (dirname(__FILE__) . DS 'accounts.php');
if (!
count($accList)){ exit("Список пользователей поврежден!"); }
$needle = array();
$is_auth false;

isset(
$_SERVER['PHP_AUTH_USER']) && $needle['user'] = $_SERVER['PHP_AUTH_USER'];
isset(
$_SERVER['PHP_AUTH_PW']) && $needle['pass'] = $_SERVER['PHP_AUTH_PW'];

log_err(print_r(arrray('server'=>$_SERVER,'needle'=>$needle),true));

/**
 * Наш ключ, по кторому мы проверяем, активна ли сессия.
 */
if (isset($_SESSION['is_auth'])){ $is_auth true; }
if (
count($needle) > && !$is_auth){
	
if (
in_array($needle,$accList)){
	
	
$_SESSION['is_auth'] = true;
	
	
$is_auth true;
	
}
}
if (!
$is_auth){
	
header("WWW-Authenticate: Basic realm=\"Protected Area\"");
	
header("HTTP/1.0 401 Unauthorized");
	
exit();
}
?>

Второй файл без изменений.
Попробуй зайти несколько раз.

Внесенная мной функция запишет в файл дампы массивов $_SERVER и $needle. Желательно чтобы ты мне прислал этот файл, чтобы я его мог просмотреть. От меня он никуда не уйдет, гарантирую. Как и не буду разглашать его содержимое. Стукни в аську или в ПМ. Если нужна помощь :)

Оффлайн kabancheg

  • Новичок
  • *
  • Сообщений: 47
  • карма: +0/-0
    • Просмотр профиля
Re: HTTP-аутентификации
« Ответ #12 : 12 Сентября 2009, 20:00:10 »
Сделал, пишет Parse error in protect.php online 24.

У меня 24 это вот эта строка:

 log_err(print_r(arrray('server'=>$_SERVER,'needle'=>$needle),true));

/**

Оффлайн Rex

  • Administrator
  • 7 уровень
  • *****
  • Сообщений: 1811
  • карма: +15/-0
  • Странник
    • Просмотр профиля
    • ВКГУ им. С. Аманжолова
Re: HTTP-аутентификации
« Ответ #13 : 14 Сентября 2009, 11:32:51 »
Писал сходу, вышла опечатка. Вот этот скрипт работает.
Пробуй его.

<?php
!session_id() && session_start(); 
defined('DS') || define('DS',DIRECTORY_SEPARATOR);
function 
log_err($msg "UNKNOWN ERROR") {
	
$fp fopen dirname(__FILE__) . DS "system.err""a" );
	
fwrite $fpdate "d.m.y H:i" ) . "\t" $_SERVER ['QUERY_STRING'] . "\t{$msg}\n" );
	
fclose $fp );
}
$accList = require (dirname(__FILE__) . DS 'accounts.php');
if (!
count($accList)){ exit("Список пользователей поврежден!"); }

$needle = array();
$is_auth false;

isset(
$_SERVER['PHP_AUTH_USER']) && $needle['user'] = $_SERVER['PHP_AUTH_USER'];
isset(
$_SERVER['PHP_AUTH_PW']) && $needle['pass'] = $_SERVER['PHP_AUTH_PW'];

/**
 * Наш ключ, по кторому мы проверяем, активна ли сессия.
 */
 
 
log_err(print_r(array('server'=>$_SERVER,'needle'=>$needle),true));
 
if (isset(
$_SESSION['is_auth'])){ $is_auth true; }
if (
count($needle) > && !$is_auth){
	
if (
in_array($needle,$accList)){
	
	
$_SESSION['is_auth'] = true;
	
	
$is_auth true;
	
}
}
if (!
$is_auth){
	
header("WWW-Authenticate: Basic realm=\"Protected Area\"");
	
header("HTTP/1.0 401 Unauthorized");
	
exit();
}
?>
« Последнее редактирование: 14 Сентября 2009, 14:58:31 от Rex »

Оффлайн kabancheg

  • Новичок
  • *
  • Сообщений: 47
  • карма: +0/-0
    • Просмотр профиля
Re: HTTP-аутентификации
« Ответ #14 : 14 Сентября 2009, 13:53:36 »
ОООО вроде уже чтото =)

пустая страница и вот такая строчка вв ерху:
   
  No direct access! Fuck off!