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


Автор: Jey_k 21.9.2005, 13:54
Хотелось бы примерчик рассмотреть. Особенно что касается безопасности.

Автор: -=Ustas=- 21.9.2005, 14:03
Тоже самое что и с БД, только в файле. Т.е. получаем строки из файла с логином и паролем, и сверяем с введеными данными, если всё пучком, то регистрируем переменные сессии. При сохранении паролья md5-хеш обязателен.

Автор: PARROT 21.9.2005, 17:43
Есть примерчик, но без безопасности, ее нужно дописывать. Нужен?

Автор: Anarki 21.9.2005, 19:42
А о безопасности можно много говорить smile

1. Если хостер правильно выставил права, что у каждого юзера скрипт запускается под своим (uid),
то просто выставлять правильные права на файл. Скажем, rw------- (600) - только чтение пользователем-владельцем, то есть никто другой не сможет прочитать файл, не знаю насколько поможет и будет работать ли у хостеров, но можно попробовать. smile

2. Закинуть в папку .htaccess и запретить доступ через HTTP на этот файл.

3. Следующее - шифровать все пароли, хранящиеся в файле, скажем алгоритмом md5, а затем пришедший от пользователя пароль хешировать и сравнивать хеши.

Шифрование обязательно в любом случае, это предотвращает в какой-то мере хищение важной информации - паролей.

Автор: maugli 21.9.2005, 20:00
А обязательно ли хешировать пароли (если БД исплоьзуешь)? И скажите зачем вообще хешировать, как их украсть можно вооще? И если кто может, то дайте пожалуйста какой-нить мануал по безопасности веб-приложений. Заранее спасибо!!!

Автор: PARROT 21.9.2005, 20:00
maugli
http://forum.vingrad.ru/index.php?showtopic=38887

Автор: Jey_k 21.9.2005, 21:00
Цитата(PARROT @ 21.9.2005, 17:43)
Есть примерчик, но без безопасности, ее нужно дописывать. Нужен?

Хотелось бы глянуть?

Автор: AntonioBanderaz 21.9.2005, 21:07
Ну можно сделать отдельный файл, с именем как у юзера, в котором хранится пароль этого юзера.
Права доступа, только для root'а при открытии они меняются на 0777, производится чтение и снова для root'а.

Автор: Mal Hack 21.9.2005, 21:29
Jey_k вот тебе пример с БД: http://vingrad.ru/PHP-ART-002849
тут правда есть пара недочетов...
1. mysql_real_escape_string нужен
2. BINARY при сравнении.

Что касается файла... Тут очень важно ограничить доступ к файлу на уровне сервера. Идеальный вариант - вынести его выше DocumentRoot, правда, туда и PHP должен добираться.

Автор: PARROT 21.9.2005, 21:38
Писала еще на курсах, но вроде работает.
Удаление тоже имеется, если что.
Код

<center>Регистрация нового пользователя<Form Method="POST">
Имя пользователя:<br><Input Type="text" Name="login" Value=""><Br>
Пароль:<Br><Input Type="password" Name="passw1" Value=""><Br>
Повторите пароль:<Br><Input Type="password" Name="passw2" Value=""><Br>
<Input Type="submit" name="send" Value="Add User">&nbsp;<Input Type="reset" Value="Очистить">
</Form>
<a href="del.php">Delete me from registration!</a>


</center>
<?php
if($send){

    if(!ereg("^[a-z0-9]+$", $login)){
        $error="Ошибка: Вы ввели недопустимое имя пользователя!<br>";
        }
    if(!ereg("^[a-z0-9]+$", $passw1)){
        $error.="Ошибка: Вы ввели недопустимый пароль!<br>";
        }
    if($passw1!==$passw2){
        $error.="Введите пароль правильно!";
        }

if(!$error){
    $data=file("users.txt");
    foreach ($data as $us){
    list($pass, $log)=split("\t", $us);
    if($log==$login){
        $er="Этот логин занят!!!";
        }
    
    }
    if(!$er){
    $dat=fopen("users.txt", "a");
    fwrite($dat, "$passw1\t$login\n");
    fclose($dat);
    }
    
}
else
{echo"$error";}
}
?>

Автор: Jey_k 21.9.2005, 22:05
PARROT
C регистрацией понятно, спасибо за интересный пример.

Мне интересно как грамотно обеспечить доступ к определенной странице через логин/пароль.
Например есть страница admin_page.php нужно чтобы она загружалась только при правильном вводе, например, на странице adm_auth.php. Особенно чтоб это было безопасно, при условии пользования файлом.

Автор: AntonioBanderaz 21.9.2005, 22:13
Цитата(Jey_k @ 21.9.2005, 22:05)
Особенно чтоб это было безопасно, при условии пользования файлом.

можно и с базой сделать так, что не безопастно будет..

Храни и пароль в MD5, логин тоже можешь запихнуть под это дело.

А потом делай выборку файла
имя файла будет допустим - md5($username).$ext
и дальше проверяй если его содержание будет совподать с md5($userPass) - то регистрируется переменная сессии, и передаётся её индетификатор пользователю. Права только для чтения поставь.

Автор: Mal Hack 21.9.2005, 22:21
Цитата(AntonioBanderaz @ 21.9.2005, 23:13)
Храни и пароль в MD5

Почитай тут в поиске. в md5 не безопасно уже хранить.

Автор: AntonioBanderaz 21.9.2005, 22:30
Уже ломанули всё-таки....

ну тогда - mcrypt_ecb(MCRYPT_BLOWFISH,"некий ключ","некая строка",MCRYPT_ENCRYPT);
для расшифровки MCRYPT_DECRYPT. 448 бит

или для однонаправленного

mhash(MHASH_RIPEMD160,"некая строка"); 160 битный хеш.

Автор: PARROT 22.9.2005, 08:41
Цитата(Jey_k @ 21.9.2005, 23:05)
Мне интересно как грамотно обеспечить доступ к определенной странице через логин/пароль.
Например есть страница admin_page.php нужно чтобы она загружалась только при правильном вводе, например, на странице adm_auth.php. Особенно чтоб это было безопасно, при условии пользования файлом.

Ну это уже следующая стадия.
Пиши так, что если логин и md5(пароль) существует, записываем данные пользователя в куки и пускаем на страницу.

Автор: Jey_k 22.9.2005, 11:11
Ой, столько вариантов... Если бы я еще понял хоть процентов 40% smile
Может покажет кто тревиальный примерчик если время есть? Буду благодарен.
Старому дельфисту непросто на php перебираться smile

Автор: PARROT 22.9.2005, 12:37
Jey_k, я уже пишу.
Ну Воть:
Код

<?php
ob_start();
?>
<html>
<head>
<title>Регистрация</title>
</head>
<body>
<a href=registr.php?mode=reg>Регистрация</a><br/>
<a href=registr.php?mode=xod>Войти в панель</a><br/>
<?
if ($button=="выйти") {
        setcookie("log_c", $login, time()-1);
        setcookie("par_c", $passw1,time()-1);
        header("Location: registr.php");
        exit;
}
if($mode=="reg"){
?>
<center>Регистрация нового пользователя<Form Method="POST">
Имя пользователя:<br><Input Type="text" Name="login" Value=""><Br>
Пароль:<Br><Input Type="password" Name="passw1" Value=""><Br>
Повторите пароль:<Br><Input Type="password" Name="passw2" Value=""><Br>
<Input Type="submit" name="send" Value="Add User">&nbsp;<Input Type="reset" Value="Очистить">
</Form>
<a href="del.php">Delete me from registration!</a>


</center>
<?php
if(isset($_POST['send'])){

        if(!ereg("^[a-z0-9]+$", $login)){
                $error="Ошибка: Вы ввели недопустимое имя пользователя!<br>";
                }
        if(!ereg("^[a-z0-9]+$", $passw1)){
                $error.="Ошибка: Вы ввели недопустимый пароль!<br>";
                }
        if($passw1!==$passw2){
                $error.="Введите пароль правильно!";
                }

if(!$error){
        $data=file("users.txt");
        foreach ($data as $us){
        list($pass, $log)=explode("\t", trim($us));
        if($log==$login){
                $er="Этот логин занят!!!";
                }

        }
        if(!$er){
        $dat=fopen("users.txt", "a");
        fwrite($dat, "". md5($_POST[passw1]). "\t".$_POST[login]."\n");
        fclose($dat);
        }

}
else
{echo"$error";}
}
}
if($mode=="xod"){
if(isset($_POST['open'])){
        $tak=file("users.txt");
        foreach ($tak as $us){
        list($pass, $log)=explode("\t", trim($us));
        if($log==$login AND $pass=md5($_POST[passw1])){
                echo "все ок!";
                setcookie("log_c", $login);
                setcookie("par_c", $passw1);
                header('location: registr.php?mode=key');
                exit;
                }
        }
        }
?>
<center>Вход в панель
<Form Method="POST">
Имя:<br><Input Type="text" Name="login" Value=""><Br>
Пароль:<Br><Input Type="password" Name="passw1" Value=""><Br>
<Input Type="submit" name="open" Value="войти">
</Form>
</center>
<?

}
if($mode=="key"){
  echo "вы вошли в панель<br/>";
  echo "<form method=post><input type=submit name=button value=выйти  class=inp style=cursor:hand></form>";
        }
?>
</body>
</html>
<?php
ob_end_flush();
?>

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