Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Авторизация, оценка 
:(
    Опции темы
Gold Dragon
  Дата 28.9.2006, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Прошу вас оценить надёжность данного способа авторизации. И укажите возможные способы взлома.
И желательно всё таки обойтись без общих фраз, а указать на конкретику.

страница с формой для ввода логина и пароля
Код

<?php

if(isset($_POST['ok'])){
// полечение данных из формы
    $log = (isset($_POST['log'])) ? md5($_POST['log']) : '';
    $pas = (isset($_POST['pas'])) ? md5($_POST['pas']) : '';

    // получение пароля и логина из базы
    $z = "SELECT `log_md`,`pas_md`,`id`* FROM `admin` WHERE `log_md`='".$log."' AND `pas_md`='".$pas."'";
    $r = mysql_query($z);

    // если пароль и логин верны и существуют в базе то..
    if (mysql_num_rows($r)>0){
        $f = mysql_fetch_array($r);
        $vr = 60*5; // время жизни кука
        setcookie ("aut", '1', time()+$vr);
        setcookie ("log", $f['log_md'], time()+$vr);
        setcookie ("pas", $f['pas_md'], time()+$vr);
        setcookie ("id", $f['id'], time()+$vr);
        // переход на страницу администрирования
        header("Location: http://".$_SERVER['HTTP_HOST']."/index.php?pages=admin");
        exit;
    // если такого нет, то переход на страницу ошибки
    }else{
        header("Location: http://".$_SERVER['HTTP_HOST']."/index.php?pages=message&id_m=4");
        exit;
    }
// если данных их формы нет,выводформы
}else{
    $content = s_restorat_content();
    echo $content;
}

function s_restorat_content(){
return <<<EOF
<div>
<table width="100%" align="center" border="0">
    <tr class="txt8">
        <td class="btr">
<p align="center"><form name="ok" action="" method="post">
<b>Вход</b><br>имя: <input name="log" type="text" value=""> пароль: <input name="pas" type="text" value="">
<input type="submit" value="OK" name="ok">
</form>
</div>
EOF;
}
?>


сраница администрирования куда осуществляется переход
Код

<?php
$vr = 60*5; // время жизни кука

if (isset($_COOKIE['aut'])) {
    // проверка кука и базы
    $id = (isset($_COOKIE['log'])) ? ($_COOKIE['id']) : '';
    $log = (isset($_COOKIE['log'])) ? ($_COOKIE['log']) : '';
    $pas = (isset($_COOKIE['pas'])) ? ($_COOKIE['pas']) : '';
    $z = "SELECT * FROM `admin` WHERE `log_md`='".$log."' AND `pas_md`='".$pas."' AND `id`='".$id."'";
    $r = mysql_query($z);
    // если всё совпадает
    if (mysql_num_rows($r)>0){
        //********************************************************************
        // начало основного поля администрирования
        setcookie ("aut", '1', time()+$vr);
        setcookie ("log", $log, time()+$vr);
        setcookie ("pas", $pas, time()+$vr);
        setcookie ("id_kabak",$id, time()+$vr);

                // необходимый код
                $content = "всё ОК";

        // конец основного поля администрирования
        //********************************************************************

    // если что-то не совпадает, то удаляем куки
    }else{
        setcookie ("aut", '', time()-60);
        setcookie ("log", '', time()-60);
        setcookie ("pas", '', time()-60);
        setcookie ("id", '', time()-60);
        // и переходим на страницу ошибки (несанкционированный доступ)
        header("Location: http://".$_SERVER['HTTP_HOST']."/index.php?pages=message&id_m=5");
        exit;
    }
// если кук умер или его нет
}else {
        header("Location: http://".$_SERVER['HTTP_HOST']."/index.php?pages=restorat");
        exit;
}

echo $content;
?>



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
ZlojEzh
Дата 28.9.2006, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 10
Всего: 15



используй вместо кукисов сессии
иначе злобный хацкер может похитить кукисы у пользователя, установить их себе и поставить неограниченное время жизни.
время жизни сессии ты по крайнер мере контролируешь сам: посему похищение идентификатора сессии даст хакеру намного меньше.
а если добавить еще скытую проверку версий браузера и ос, то все вообще будет отлично
PM MAIL ICQ   Вверх
Garret
Дата 28.9.2006, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 16.9.2006
Где: Киев

Репутация: нет
Всего: 2



Зачем логин хранить захэшеным? smile 

Тут у тебя sql-inj на лицо.
PM MAIL WWW ICQ   Вверх
-=Ustas=-
Дата 28.9.2006, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Gold Dragon, единственное, что мне пришло в голову, так это то, что после авторизации я могу провести тебе SQL-инъекцию, т.е. тут:
Код

// проверка кука и базы
    $id = (isset($_COOKIE['log'])) ? ($_COOKIE['id']) : '';
    $log = (isset($_COOKIE['log'])) ? ($_COOKIE['log']) : '';
    $pas = (isset($_COOKIE['pas'])) ? ($_COOKIE['pas']) : '';
    $z = "SELECT * FROM `admin` WHERE `log_md`='".$log."' AND `pas_md`='".$pas."' AND `id`='".$id."'";


Не забываем эскейпить входные данные!

Добавлено @ 09:25 
И еще:
Код

$id = (isset($_COOKIE['log'])) ? ($_COOKIE['id']) : '';

Ничего не напутал smile


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
Gold Dragon
Дата 28.9.2006, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



ZlojEzh, не люблю я что-то сессии smile да и такая серьёзная защита мне не нужна

Цитата(Garret @  28.9.2006,  09:22 Найти цитируемый пост)
Зачем логин хранить захэшеным?
А фиг его знает  smile 

Цитата(-=Ustas=- @  28.9.2006,  09:24 Найти цитируемый пост)
после авторизации я могу провести тебе SQL-инъекцию,
это как? поясни

Цитата(-=Ustas=- @  28.9.2006,  09:24 Найти цитируемый пост)
Не забываем эскейпить входные данные!
то есть?


PS
-=Ustas=-, да, действительно в одном месте лажа  smile 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
-=Ustas=-
Дата 28.9.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Цитата(Gold Dragon @  28.9.2006,  16:31 Найти цитируемый пост)
это как? поясни

Да как, открываем файл куков, и дописываем туды sql-запрос, через ' smile


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
sOckets
Дата 28.9.2006, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЖгуПоПонедельникам
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 24.8.2006
Где: ws2.lib

Репутация: нет
Всего: 2



Я всегда говорю что нельзя доверять юзерам , ты должен проверять всё что они отправляют. И потом зачем ты отдельно ставишь в куки : логин , пароль , id и тд , помоему "лутше" будет использовать 2 элемента куки , это ID и md5(login+pass) потом когда нужно проверить куки , ты берёшь ID и зашированный login и pass и сверяешь с теми же зашифрованными login и пассом..
Ещё раз говорю , парсь всё что вводит юзер ($_GET,$_POST,Cookie,ну и всякие системные переменные типо браузера и тд (если ты их юзаешь))...

Это сообщение отредактировал(а) sOckets - 28.9.2006, 19:43


--------------------
Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту.
PM   Вверх
Gold Dragon
Дата 28.9.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



-=Ustas=-, если честно, то не понимаю smile хочешь сказать что какой-то запрос может выполниться? Приведи пример кода...


sOckets, я всё полностью проверяю что вводит юзер  smile  просто я из примера кода убрал всё лишнее, чтоб не захломлять


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Vaulter
Дата 28.9.2006, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: 6
Всего: 22




Gold Dragon
Код

$user_id =  preg_replace('[^0-9]','',$_COOKIE['user_id']);

 smile 
пароль не храни в куке!!!!  smile  smile 


--------------------
PM MAIL WWW ICQ   Вверх
Gold Dragon
Дата 29.9.2006, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Наконец-то я понял что такое SQL-инъекция  smile 
но кстати, это хорошо говорить, когда структуру кода знаешь, а так замучаешься делать


Цитата(Vaulter @  28.9.2006,  22:23 Найти цитируемый пост)
пароль не храни в куке!!!!  
Да хватит тебе... smile сколько нужно времени что бы подобрать шести значный цифро-буквенный пароль? 

Да если уж на это пошло, то пароль можно подглядеть или подслущать smile



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
sOckets
Дата 29.9.2006, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


ЖгуПоПонедельникам
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 24.8.2006
Где: ws2.lib

Репутация: нет
Всего: 2



Gold Dragon, тогда можно уверенно говорить что абсолютную защиту к сайту написать не возможно , поэтому можно и без пароля пускать в cpanel сайта , всё равно пароль подлядеть можно smile
Цитата

-=Ustas=-, если честно, то не понимаю  хочешь сказать что какой-то запрос может выполниться? Приведи пример кода...

Например в куках ID пишем (Опера просто создана для работы с куками ;)) наш ID и SQL Запрос , например 99+or+1=1/* , и если авторизация нормально прошла то можно сказать что SQL иньекция есть , затем просто делаем запросы...ну это вопрос времени , да я ещё и не проснулся с утра smile блин какой же я бред написал %)


--------------------
Я Будущий сотрудник Google Inc. Юзаем Google Code Search для поиска исходников. Юзаем GMail как почту.
PM   Вверх
Kefir
Дата 29.9.2006, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 13
Всего: 87



Gold Dragon, короче mysql_real_escape_string тебе в помощь!

Это сообщение отредактировал(а) Kefir - 29.9.2006, 08:57
PM MAIL WWW Skype   Вверх
-=Ustas=-
Дата 29.9.2006, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ustix IT Group
****


Профиль
Группа: Участник Клуба
Сообщений: 2222
Регистрация: 21.1.2005
Где: Краснодар

Репутация: 32
Всего: 69



Цитата(Gold Dragon @  29.9.2006,  06:54 Найти цитируемый пост)
но кстати, это хорошо говорить, когда структуру кода знаешь, а так замучаешься делать

Ну зачем же так smile код совсем не обязательно вообще видеть. Просто цепляем к значению переменной куки апостроф или еще какой-нить служебный символ, и если ошибка вылетела или как-то некорректно отработал скрипт, то можно смело цеплять в этой переменной еще какой-нить дополнительный запрос, например через UNION и анализировать ошибки и тем самым подбираться к структуре таблички smile А если еще у пользователя базы данных (по которому коннектиться скрипт) есть права просмотра системных таблиц - то тогда вообще можно рутовый аккаунт получить smile так что не забывай про это, злодеи не дремлют smile)))
Цитата(Vaulter @  28.9.2006,  22:23 Найти цитируемый пост)
$user_id =  preg_replace('[^0-9]','',$_COOKIE['user_id']);

Это к чему такие извращения? В этой ситуации можно (даже нужно! ) обойтись банальным intval-ом.

Это сообщение отредактировал(а) -=Ustas=- - 29.9.2006, 10:23


--------------------
В искаженном мире все догмы одинаково произвольны, включая догму о произвольности догм.
-----
PM WWW ICQ Skype   Вверх
G0rinich
Дата 29.9.2006, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 21.8.2006

Репутация: 1
Всего: 1



Цитата(Gold Dragon @  29.9.2006,  06:54 Найти цитируемый пост)
Да хватит тебе...  сколько нужно времени что бы подобрать шести значный цифро-буквенный пароль? 

5 символов расшифровываются хорошей программой секунд за 10, на 6 символов уходит до 15 минут, так что не проблема )))

В моем варианте так. Пользователю при авторизации выделяется уникальный идентификатор, при каждой авторизации он разный. В куке хранится только он. Т.е. при всем желании по куке ничего не узнаешь. Не активная сессия удаляется через 15 минут, или блокируется, если пользователь выбрал опцию "запомнить меня". Таким образом если вы зайдете с другого компьютера, то будет заведена новая сессия и ваша старая кука автоматически станет не действительной.

функция login
Код

    if($f=sqlselectone('select * from portal_users where user_login=\''.$_POST['login'].'\' and user_password=\''.md5($_POST['password']).'\'')) {
        ///setcookie('LAST_VISIT', $f['user_lastdate']);
        KillSession($_COOKIE['SESSION']);
        startsession($f['user_id'], @$_POST['remember']);
    }else{
        Pr('Login Error');
    }



Процедура авторизации (выполняется при каждой загрузке)
Код

$SESSION=@$_COOKIE['SESSION'];

$USER=array(
    'user_id'=>0,
    'user_level'=>0,
    'user_groups'=>array(1),
    'user_rights'=>array(),
    'user_design'=>$CONFIG['default_design'],
);

//print_r($USER);
if ($SESSION && ($USER=GetSession($SESSION))) {
    if ($USER['user_id']>0) {
        if ($USER['session_active']==0 || !get_cookie('LAST_VISIT')) set_cookie('LAST_VISIT', $USER['user_lastdate']);
        PrTo('java', 'function ping(){setTimeout("ping()",60000);document.pinger.navigate("'.BASE_URI."ping\");}\n");
        PrTo('javaonload', 'setTimeout(\'ping()\',5000);');
    }
    UpdateSession($SESSION, $USER['user_id']);
}else{
    unset($SESSION);
    setcookie('SESSION', '', time()-60);
    StartGuestSession();
    $USER=array(
        'user_id'=>0,
        'user_level'=>0,
        'user_groups'=>array(1),
        'user_rights'=>array(),
        'user_design'=>$CONFIG['default_design'],
    );
}
//print_r($USER);

KillExpiredSessions($CONFIG['drop_user_interval']);


Модуль управления сессиями
Код

<?php

////////////////////////////////////////////
//    Name:        Модуль управления сессиями
//    Version:    1.00
//    Author:        Gorinich
//    Date start:    
//    Date last:    01.02.2006 16:00:15
////////////////////////////////////////////

function KillSession($sid)
{
    sql("delete from portal_sessions where session_id='$sid'");
    setcookie('SESSION', '', time()-1);
}

function KillSessionByUID($uid)
{
    sql("delete from portal_sessions where session_user_id='$uid'");
    setcookie('SESSION', '', time()-1);
}

function StartSession($uid, $remember=false)
{
    KillSessionByUID($uid);
    $session=ChrRandomStr(); // Генерим номер сессии
    $remember?setcookie('SESSION', $session, time()+60*60*24*7):setcookie('SESSION', $session);
    $remember?$remember=1:$remember=0;
    ///echo 111;
    sql("insert into portal_sessions (session_id, session_user_id, session_page, session_start, session_time, session_active, session_saved) values('$session', '$uid', '', now(), now(), 1, '$remember')");
    sql('update portal_users set user_ip=\''.$_SERVER['REMOTE_ADDR']."' where user_id=$uid");
    echo '<META HTTP-EQUIV=\'Refresh\' CONTENT=\'0; URL='.BASE_URI.'\'>';
    exit;
}

function StartGuestSession()
{
    $session=ChrRandomStr(); // Генерим номер сессии
    setcookie('SESSION', $session);
    sql("insert into portal_sessions (session_id, session_user_id, session_page, session_start, session_time, session_active) values('$session', 0, '', now(), now(), 1)");
}

function GetSession($sid)
{
    global $USER;
    if (empty($sid)) return false;
    $f=sqlselectone("select a.*, b.* from portal_sessions as a left join portal_users as b on a.session_user_id=b.user_id where a.session_id='$sid'", MYSQL_ASSOC);
    if (!$f) return false;
    if($f['session_user_id']==0) { // Если анонимная сессия, то дальше не идем.
        LoadCookies(0, $sid);
        //echo 'anon';
        return array_merge($f, $USER);
    }
    LoadCookies($f['user_id']);
    $ff=sqlfields('select * from portal_user_group where user_id='.$f['user_id']);
    $f['user_groups']=$ff['group_id'];
    $f['user_rights']=GetRights($f['session_user_id'], $f['user_groups']);
    //print_r($f['forums_reads']);
    return $f;
}

function UpdateSession($id, $uid)
{
    sql("update portal_sessions set session_time=now(), session_active=1 where session_id='$id'");
    sql("update portal_users set user_lastdate=now() where user_id='$uid'");
    GrowStatistic('user', $uid);
}

function KillExpiredSessions($dui)
{
    sql("delete from portal_sessions where session_saved=0 and (NOW()>session_time + interval $dui minute)");
    sql("update portal_sessions set session_active=0 where session_saved=1 and (NOW()>session_time + interval $dui minute)");
}

?>


функция ChrRandomStr()
Код

function ChrRandomStr($len=20) // Строит произвольную строку указанной длины из символов (a-z,0-9)
{
    $res='';
    for ($i=0; $i<$len; $i++) $res.=mt_rand(0,3)==3?mt_rand(0, 9):chr(mt_rand(97, 122));
    return $res;
}


Ну и на всякий случай защищаемся от врагов )))
Код

function SecureArray(&$arr) // делает addslashes() для всех элементов массива любой сложности. Портит исходный массив.
{
    foreach ($arr as $k=>$v) if (is_array($v)) SecureArray($v); else $arr[$k]=addslashes($v);
    //return $arr;
}

function SecureInData($ws='gpc') // делает addslashes() для всех входящих данных
{
    // g - GET
    // p - POST
    // c - COOKIE
    if (get_magic_quotes_gpc()) return;
    if (strpos($ws,'g')) SecureArray($_GET);
    if (strpos($ws,'p')) SecureArray($_POST);
    if (strpos($ws,'c')) SecureArray($_COOKIE);
}

PM MAIL   Вверх
Gold Dragon
Дата 29.9.2006, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



народ, спасибо за свои варианты, но мне хотелось узнать уязвимость своего smile

в общем, из всего сказанного я понял, что нужно проверять ещё дополнительно входящие данные... я это делаю, но про  mysql_real_escape_string не знал, спасибо...

На сессиях пока не хочу делать.. так как свободный доступ к компьютеру не очень реально получить по крайней мере в течение 10-15 минут после выхода человека, а куки удаляться через 5 минут. Это просто такие условия в данной ситуации

Добавлено @ 11:46 
G0rinich, извини, но я что-то не пойму никак где основное поле, когда всё верно?

ЗЫ
наверное пятница сказывается smile


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0922 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.