Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Авторизация для себя в скрипте


Автор: Elfet 7.4.2006, 18:50
Как можно просто реализовать простую афторизацию на своём сайте? Пишу тобишь сайт для себя и лень делать сложную авторизацию. Может есть простой способ?

Автор: Elfet 7.4.2006, 19:41
Вот так можно?
Код

$myPas = "001d7f516a39bed8ac1f74de1286da52";

if( isset($_GET['login']) )
{
 if( isset($_POST['password']) )
 {
  if( md5($_POST['password']) == $myPas )
  {
   setcookie("admin", md5($_POST['password']), time()+3600 );
   print $kernel->html->login(1);
   exit;
  }
 }
 else
 {
  print $kernel->html->login(0);
  exit;
 }
}
else if(isset($_GET['logout']))
{
 setcookie("admin", 0, 0 );
 print $kernel->html->login(2);
 exit;
}
if( isset($_COOKIE['admin']) && $_COOKIE['admin'] == $myPas )
{
 print "Admin";
}

Автор: Wolf1994 7.4.2006, 19:45
1) Поставить куки админа.
2) Скрипт ставящий куки удалить.
3) Распознавать админа по кукам и продлевать срок их действия.

Автор: ZlojEzh 7.4.2006, 23:19
если доступ надо полностью ограничить на некий скрипт или папку - юзай авторизацию через .htaccess
если возможен доступ к одному скрипту пользователей с разным уровнем доступа, тогда неплохой вариант - использование PEAR (Auth_HTTP) - понадобится всего несколько строчек кода
правда Auth_HTTP работает только если php наcтроен модулем апача

иначе - сессии


Цитата(Wolf1994 @ 7.4.2006, 19:45 Найти цитируемый пост)
1) Поставить куки админа.
2) Скрипт ставящий куки удалить.
3) Распознавать админа по кукам и продлевать срок их действия.

ИМХО, не лучший вариант в плане безопасности
зато, признаю, самый простой (если не считать .htaccess)

Автор: Elfet 8.4.2006, 12:21
А может кто-нибудь про Auth_HTTP расказать?

Автор: ZlojEzh 8.4.2006, 12:34
да там, в принципе, все в мануале есть

экзампл из мана:
Код

require_once("Auth/HTTP.php");

// setting the database connection options
$AuthOptions = array(
'dsn'=>"pgsql://test:test@localhost/testdb",
'table'=>"testable",                            // your table name 
'usernamecol'=>"username",            // the table username column
'passwordcol'=>"password",            // the table password column
'cryptType'=>"none",                // password encryption type in your db
);


$a = new Auth_HTTP("DB", $AuthOptions);

$a->setRealm('yourrealm');            // realm name
$a->setCancelText('<h2>Error 401</h2>');        // error message if authentication fails
$a->start();                    // starting the authentication process


if($a->getAuth())                // checking for autenticated user 
{
    echo "Hello $a->username welcome to my secret page";
    
};



как видишь - все предельно просто
создаешь в БД таблицу вида login-password (если нету БД можно использовать файлы или что-нить другое - контейнеров для паролей там много)
вписываешь в этот кусок кода данные по БД и вставляешь в начало своего скрипта
и все, собсна

про dsn можно почитать в мане по PEAR:DB

хотя я предпочитаю .htacess ))

Автор: IvanB 8.4.2006, 12:35
Имхо, Google может....smile
http://dmitry.ints.net/library/prog/link/PHP/PEAR/packages.auth.auth_http.html

Опоздал...)

Автор: Elfet 8.4.2006, 12:54
Ок спасибо! smile Не хотелось использовать базу.
А вот так вот безопасно будет?
Код

$myPas = "001d7f516a39bed8ac1f74de1286da52";
$myPas_date = date("HdmY");

if( isset($_GET['login']) )
{
 if( isset($_POST['password']) )
 {
  if( md5(md5($_POST['password']).$myPas_date) == md5($myPas.$myPas_date) )
  {
   setcookie("admin", md5(md5($_POST['password']).$myPas_date), time()+3600 );
   print $kernel->html->login(1);
   exit;
  }
 }
 else
 {
  print $kernel->html->login(0);
  exit;
 }
}
else if(isset($_GET['logout']))
{
 setcookie("admin", 0, 0 );
 print $kernel->html->login(2);
 exit;
}
if( isset($_COOKIE['admin']) && $_COOKIE['admin'] == md5($myPas.$myPas_date) )
{
  $kernel->is_admin = 1;
  //Ура мы админ!
}

$kernel->html->login(0); - форма ввода пароля
$kernel->html->login(1); - Говория что удачно вошли
$kernel->html->login(2); - Говорим что удачно вышли

Такая авторизация по md5 на одни час (md5($myPas.$myPas_date)) из хеш пароля. С солью smile

Автор: IvanB 8.4.2006, 13:11
? А зачем два раза md5 применять?
Вроде одного хватать должно....)
Хотя генерация хеша - исключительно дело вкуса....)

Автор: ZlojEzh 8.4.2006, 13:13
вот кто-то удивится, когда после трех суток работы md5_inside получит еще один хеш и строчку с временем...

Автор: Wolf1994 8.4.2006, 15:16
Просветите ламера в этом деле. Хэш на куки ставится - чтобы уберечь куки от CSS-атаки (или как ещё их можно узнать)?

Автор: Elfet 9.4.2006, 14:03
md5($myPas.$myPas_date) - это что бы хэш которые записываеться в куки работал только один час smile

Автор: AztEK 9.4.2006, 14:12
Может я щас бред скажу, но может просто создать файл с названием типа vjshfhsduihiuvhsd.php
Прописать в нём админку без всяких сессий и кук. Фик туда кто попадёт - название то...

Автор: Elfet 9.4.2006, 16:21
Можно, но мне нужно лазить по самому сайту как админ.

Автор: Wolf1994 9.4.2006, 16:45
Цитата(Elfet @ 9.4.2006, 14:03 Найти цитируемый пост)
md5($myPas.$myPas_date) - это что бы хэш которые записываеться в куки работал только один час 

Задним умом догнал smile но я думал, что хэши ещё используются для "дополнительной" защиты. Зачем, например, хранить пароли форумов в хэше, ведь там он временно-независимый? Или я что-то путаю и хэши используются только с модификаторами, чтобы из двух ключей сделать один?

Автор: Elfet 9.4.2006, 17:18
Wolf1994,
Чёт я не понял о чём ты smile Хэши нужны для авторизации юзеров. Что бы каждый раз не вводить пароль повторно smile

Так как насчёт моего кода? smile Кто-нибудь может сказать безопасен ли он? smile

Автор: Wolf1994 9.4.2006, 19:37
Цитата(Elfet @ 9.4.2006, 17:18 Найти цитируемый пост)
Wolf1994,
Чёт я не понял о чём ты  Хэши нужны для авторизации юзеров. Что бы каждый раз не вводить пароль повторно

Я всё никак не могу понять - зачем использовать эти хэши. Чем отличается хранение пароля в хэше и в простом, незакодированном, виде?

То есть, я так понимаю, при добавлении в хэш времени, придаётся дополнительная защита. А если использовать всего один параметр - сам пароль - зачем хэш?

Автор: ZlojEzh 9.4.2006, 19:56
Цитата(AztEK @ 9.4.2006, 14:12 Найти цитируемый пост)
Может я щас бред скажу, но может просто создать файл с названием типа vjshfhsduihiuvhsd.php
Прописать в нём админку без всяких сессий и кук. Фик туда кто попадёт - название то...

найдут запросто
более того, этот файл еще и поисковики, скорее всего, проиндексируют (даже если автолистинг папок отключен)


Цитата(Wolf1994 @ 9.4.2006, 19:37 Найти цитируемый пост)
Я всё никак не могу понять - зачем использовать эти хэши. Чем отличается хранение пароля в хэше и в простом, незакодированном, виде?

хеши используются для кодирования паролей
даже если ты знаешь хеш пароля, восставновление по нему самого пароля займет очень много времени
например, на сайте есть дыра под sql-injection позволяющая вывести на экран некую таблицу с хешами паролей
даже если злобный хакер ) эту дыру найдет, получить пароль админа он все равно не сможет

Автор: Wolf1994 9.4.2006, 22:33
Цитата(ZlojEzh @ 9.4.2006, 19:56 Найти цитируемый пост)
хеши используются для кодирования паролей
даже если ты знаешь хеш пароля, восставновление по нему самого пароля займет очень много времени
например, на сайте есть дыра под sql-injection позволяющая вывести на экран некую таблицу с хешами паролей
даже если злобный хакер ) эту дыру найдет, получить пароль админа он все равно не сможет

А что мешает этому хакеру установить соответсвующий кук с полученным хэшем? Ведь проверка идёт по кукам?

Автор: Ciber SLasH 9.4.2006, 22:41
Цитата(Wolf1994 @ 9.4.2006, 23:33 Найти цитируемый пост)
А что мешает этому хакеру установить соответсвующий кук с полученным хэшем? Ведь проверка идёт по кукам?

Да вобщем ничего не мешает. В куки записывать конфединциальную информацию нельзя.

Автор: ZlojEzh 9.4.2006, 22:48
абсолютно ничто
поэтому куки лучше всего использовать (при создании системы авторизации) только для хранения идентификатора сессии
а на сами сессии ставить ограниченный срок существования


Цитата(Elfet @ 9.4.2006, 17:18 Найти цитируемый пост)
Так как насчёт моего кода?

все бы хорошо, но раз в час пользователю придется вводить пароль по-новой

я бы все же использовал сессии...
а еще лучше - .htaccess

Автор: Wolf1994 9.4.2006, 23:41
А чем безвременные куки хуже сессий? Если вывод информации фильтруется (htmlspecialchars ()) и они не лежат в MySQL-базе, то ведь их нет возможности узнать?

Автор: Ciber SLasH 9.4.2006, 23:55
Цитата(Wolf1994 @ 10.4.2006, 00:41 Найти цитируемый пост)
А чем безвременные куки хуже сессий?

Куки можно перехватить, а сессия хранится на сервере.

Автор: Elfet 10.4.2006, 13:18
Цитата(ZlojEzh @ 9.4.2006, 23:48)
абсолютно ничто
поэтому куки лучше всего использовать (при создании системы авторизации) только для хранения идентификатора сессии
а на сами сессии ставить ограниченный срок существования


Цитата(Elfet @  9.4.2006,  17:18 Найти цитируемый пост)
Так как насчёт моего кода?

все бы хорошо, но раз в час пользователю придется вводить пароль по-новой

я бы все же использовал сессии...
а еще лучше - .htaccess

В том и заключаеться защита, что бы куки никто не воровал. Мой код имитирует сессии smile Очень простенько smile

А то что каждый раз вводить новые - это да, но ведь я же хочу это для себя еделать только.
Кстати такие штуки и в больших скриптах авторизации есть, например на masterhostе при входе в СР указываешь сколько будет длиться сессия smile

Автор: paraZite 10.4.2006, 22:06
Цитата
Может я щас бред скажу, но может просто создать файл с названием типа vjshfhsduihiuvhsd.php
Прописать в нём админку без всяких сессий и кук. Фик туда кто попадёт - название то...
Любой человек, имеющий доступ к аццесс логу апача увидит полный путь к твоей админке...

Цитата
что бы куки никто не воровал
Чтобы их никто не воровал, необходимо, как минимум, привязать к идентификатору сессии, передающемуся с помощью cookies, IP.

Мой пример:
Код
<?php
error_reporting(0);

$AUTH = NULL;
$ip = $_SERVER['REMOTE_ADDR'];
$script = $_SERVER['PHP_SELF'];
if(empty($_COOKIE['sid'])){
    if(empty($_POST['login']) || empty($_POST['password'])){
//ЗДЕСЬ ВЫВОДИМ ФОРМУ ДЛЯ ВВОДА ЛОГИНА/ПАССА
        die;
    } else {
        $login = $_POST['login'];
        $password = $_POST['password'];
        $hash = sha1($password.$login);
        $query = "SELECT uid FROM users WHERE hash='$hash'";
        $res = mysql_query($query, $con);
        $AUTH = mysql_num_rows($res);
        if ($AUTH === 1){
            srand((double)microtime()*1000000);
            $sid = sha1($hash.uniqid(rand()));
            setcookie('sid', $sid, time()+2592000);
            $query = "UPDATE users SET sid = '$sid', ip = '$ip' WHERE hash = '$hash'";
            mysql_query($query, $con);
        }
    header('Location: '.$script);
    }
} else {
    $sid = $_COOKIE['sid'];
    if(!ereg("^[0-9,a-f]{40}$",$sid)) die;
    $query = "SELECT * FROM users WHERE sid= '$sid' AND ip= '$ip'";
    $res = mysql_query($query, $con);
    $AUTH = mysql_num_rows($res);
    if(!($AUTH === 1)){
        setcookie('sid', '');
        header('Location: '.$script);
    }
    $my = mysql_fetch_assoc($res);
    foreach($my as $k => $v){
        $k = 'my_'.$k;
        $$k = $v;
    }
}
?>

Автор: Ciber SLasH 10.4.2006, 22:23
paraZite, твой скрипт зациклится, т.к. ты при всех условиях перенаправляешь на этот же скрипт.

Автор: paraZite 10.4.2006, 22:37
хз... если логин и пасс не введены, а кукисы невалидны идёт вызов die();
если введены логин и пассс и они валидны, выставляются куки и скрипт редиректит пользователя сам на себя, а так как кукисы уже не пусты, скрипт завершает свою работу, опознав пользователя...

Ща протестю ещё раз на всякий случай...
У меня ничего не циклится.

Автор: IvanB 11.4.2006, 09:07
Имхо, для улучшения безопасности содержимое кукиса желательно завязывать на IP пользователя и ID сессии (или что там у вас)...smile
Извините, если не то.....)

Автор: Elfet 11.4.2006, 11:11
Это все понятно smile А попробуйте сделать тоже самое без базы, как можно проще ;)

Автор: IvanB 11.4.2006, 12:22
Через файлы, чтоли? smile

Автор: Elfet 11.4.2006, 12:34
Нет, воотбе без использования бд smile Нужен был простой, самый простой способ авторизации smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)