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


Автор: Elfet 25.2.2008, 15:11
Безопасен ли такой способ авторизации?
Код

<?php
define( 'ROOT_PATH'  , "../" );

include_once("../kernel/kernel.php"); 
include_once("moderatorclass.php"); // класс управленец
include_once("moderators.php"); // список модераторов

$kernel->db->connect();

$moderator = new moderatorclass($moderators);
$moderator->kernel = & $kernel;

session_name('moderator');
session_start();

Header('Content-Type: text/html; charset=utf-8');


// Выполняем вход.
if(isset($_POST['user']) && isset($_POST['password']))
{
    $_SESSION['moder'] = $_POST['user'];
        // Используем пароль, дату и IP для образования хеша
    $_SESSION['hash'] = sha1( sha1($_POST['password']) . sha1(date('YmdH')) . sha1($kernel->session->IPDetect()) );
}

$moderator->Header('Модерирование');

if(isset($_SESSION['moder']) && isset($_SESSION['hash'])
  && sha1( $moderator->moderators[$_SESSION['moder']] . sha1(date('YmdH')) . sha1($kernel->session->IPDetect()) ) == $_SESSION['hash'])
{
       // Удачно вошли 

        // Выход...
    if(isset($_GET['tab']) && $_GET['tab'] == 'exit')session_destroy();

    $moderator->Menu($_GET['tab']);

    switch ($_GET['tab'])
    {
        case 'exit':
            echo "<td class='text'><h1>Вы вышли.</h1></td>";
            break;

        case 'ban':
            $moderator->ban();
            break;

        case 'msg':
            $moderator->msg();
            break;

        default:
            $moderator->online();
    }
}
else
{
       // Вход не был выполнен или был выполнен неправильно.
    session_destroy();
?>
    <td class="text" valign="top">  
    <h1>Вход</h1>
    <form method="POST" action="index.php"> 
    <table>
    <tr><td>Модеротор:</td><td><input type="text" name="user" value="<?=$_POST['user']?>"></td></tr>
    <tr><td>Пароль:</td><td><input type="password" name="password"></td></tr>
    <tr><td>&nbsp;<small>Тайм-аут каждый час.</small></td><td align="right"><input type="submit" value="Вход"></td></tr>
    </table>
    </form>
    </td>    
<?
}

$moderator->Footer();

$kernel->db->close();
?>

Заранее спасибо!  smile 

Автор: gta4kv 25.2.2008, 15:13
Elfet, это же сессия, че тут может быть не безопасно? о_О

пс. 
Код

$moderator->kernel = & $kernel;


Нафига &? Или у вас PHP4?

Автор: Elfet 25.2.2008, 15:20
gta4kv, хочу что бы и там ещё работало smile
А сессию - вдруг с ворует кто?  smile 

Автор: gta4kv 25.2.2008, 15:24
Elfet, йа почемуто сомневаюсь насчет с воруют.

Цитата

хочу что бы и там ещё работало

Ну вообще работать и так будет, просто вместо объекта будет передаваться ссылка. но вообщем то пофиг )не суть важно.

Автор: zibox86 25.2.2008, 16:49
Я бы еще проверил значения логина и пароля функцией empty!

Так как isset проверяет на существование переменной, а empty на пустоту этой переменной!

Автор: Elfet 25.2.2008, 17:06
zibox86,  smile как же я забыл! smile

Автор: GeneralElectric 25.2.2008, 18:47
Elfet, а можно поинтересоваться содержимым функции $kernel->session->IPDetect()?
Есть у меня большое подозрение, что она позволяет, украв сессию, получить беспрепятственный доступ к ней.

Добавлено через 3 минуты и 10 секунд
zibox86, а в чем смысл empty в данном случае? Ну будут логин с паролем пустыми - и что?

Автор: Elfet 25.2.2008, 18:51
GeneralElectric, Вот: http://forum.vingrad.ru/index.php?showtopic=20838&view=findpost&p=1118249 
И каким же это образом? smile

Автор: GeneralElectric 25.2.2008, 19:06
Позорище какое. И это тут считается эталоном определения IP адреса?
И там огромными буквами, 20 шрифтом не написано, что использовать эту функцию можно только а сочетании с REMOTE_ADDR, а не вместо?

Цитата(Elfet @  25.2.2008,  18:51 Найти цитируемый пост)
И каким же это образом?

самым обычным.

Автор: Elfet 25.2.2008, 20:07
GeneralElectric, это поиск по форуму мне выдал. Мне без разницы как определять IP. Главное что бы определить. Как?
Цитата(GeneralElectric @  25.2.2008,  20:06 Найти цитируемый пост)
самым обычным. 

Поделись каким? smile

Автор: GeneralElectric 25.2.2008, 20:17
Цитата(Elfet @  25.2.2008,  20:07 Найти цитируемый пост)
 Главное, чтобы определить. Как?

Код

$ip=$_SERVER['REMOTE_ADDR'];

Автор: Elfet 25.2.2008, 20:21
GeneralElectric, супер smile Буду знать)))) Тобишь функция такая извратная вовсе не нужна?

Автор: GeneralElectric 25.2.2008, 20:33
нельзя сказать, что она совсем не нужна. Можно её пользоваться. Но надо понимать две вещи
1. что с её помощью злоумышленник легко подделает адрес.
2. следовательно, применять её следует с осторожностью, в каждом конкретном случае - по разному. 

Для случаев контроля сессии, подобных твоим, функция должна выдавать масив. Не один адрес,а массив. из всех найденных адресов.
этот массив можно сериализовать и использовать в хэше.

Автор: CyClon 25.2.2008, 21:51
Для полного смака сделай привязку сессии/хеша к IP.

Автор: Elfet 25.2.2008, 22:35
CyClon, а у меня разве нет такой привязки? smile
GeneralElectric,  smile 

Автор: dm9 26.2.2008, 20:21
Я давно не пользовался стандартными сессиями, но, кажется, есть две вещи:
1. Это "чудо" не чистит за собой куку. То есть после session_destroy() неплохо бы было сделать это самому. Хотя, это не критично.
2. Я бы рекомендовал после session_destroy() очистить массив $_SESSION (=array()). Это избавит от потенциальных ошибок при развитии проекта.

Цитата(Elfet @  25.2.2008,  16:11 Найти цитируемый пост)
case 'exit':            
echo "<td class='text'><h1>Вы вышли.</h1></td>";


Помесь кода и верстки, приправленная острым перчиком "Чили".
Посмотри, как будет время, в сторону какой-нибудь шаблонизации (ключевые слова MVC, шаблонизатор, Smarty, XSLT).
И про антипаттерны тоже: http://insidecpp.ru/antipatterns/magic_strings/
И не надо отговариваться стандартом "код для себя" -- учись абстрагировать код. smile

Автор: Elfet 26.2.2008, 22:58
dm9, ок, спасибо smile
Про код знаю smile Класс код! smile 

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