Скрипт авторизации начального уровня

astron8

Guest
Скрипт авторизации начального уровня

Здравствуйте, оцените данный код на "слабые места", я новичок, поэтому решил проконсультироватся...первые шаги все-таки :)

index.php

PHP:
<?php
unset($user_name);
session_start();
if (isset($user_name))
{
    print "Добро пожаловать, ".$user_name."<br><a href=out.php>Выход</a>";
}
    else
{
?>
<form action="auth.php" method="post">
<table cellspacing="0" border="1">
<tr><td>Логин </td><td align="right"><input type="text" size="15" name="user_name" maxlength=25></td></tr>
<tr><td>Пароль</td><td align="right"><input type="password" size="15" name="user_pass"maxlength=32></td></tr>
<tr align="right"><td colspan="2"><input type="submit" name="submit" value="войти"></td></tr> </table> </form>

<?php
}
?>
auth.php

PHP:
auth.php
<?php
session_start();
function error ($error_message)
                   {
                   echo $error_message."<BR>";
                   print "<meta http-equiv=\"refresh\" content=\"2;URL=index.php\">";
                   exit;// header("location: index.php");
                   }
if (isset($submit))
{
    $user_name=$_POST['user_name'];
    $user_name=substr($user_name,0,25);
    $user_name=addslashes($user_name);
    //---------------------------------\\
    $connect=mysql_connect('localhost','root') or die("Ошибка. Нет связи с сервером MySQL.<br>");
    mysql_select_db('test',$connect) or die("Ошибка. Нет связи с Базой Данных.<br>");
    $query = "SELECT * FROM users WHERE user_name = '$user_name'";
    $select = mysql_query($query);
    mysql_close($connect);
    If (mysql_num_rows($select) != "0")//если такой юзер есть
        {
        //$login_user  = mysql_result($select, 0, 'user_id');//так медленее
        $info_user=mysql_fetch_array($select);
        $PASSWORD=$info_user["user_pass"];
        $user_name=$info_user["user_name"];//Логин будет таким как в базе(с учетом регистра)
        sleep(1);//задержка на 1 сек, защита от перегрузки сервера при подборе пароля
        if ($user_pass == "$PASSWORD")
           {
           session_register("user_name");
           print "Сегодня - ".date("d-m-Y",time());
           echo "<br>Привет <b>$user_name</b>.<br>";
           echo "Вы Ввели <b>$PASSWORD</b> и это ваш пароль.";
           echo "<br><a href=out.php>Выход</a>";
           }
           else error("Указан не правильный пароль.
                <br>Попытка входа под этим логином и паролем была занесена в LOG БД");//еще не сделал %)
        }// mysql_num_rows                                 //$IP=$GLOBALS['REMOTE_ADDR'];
    Else
        {
        error("Пользователя с таким именем не существует.");

        }
}
else error("В доступе отказано.")
?>
out.php

PHP:
out.php
<?php
session_start();
session_destroy();
unset($user_name);
print "<meta http-equiv=\"refresh\" content=\"1;URL=index.php\">";
?>
 

f1

formula 1
Re: Скрипт авторизации начального уровня

sleep(1);//задержка на 1 сек, защита от перегрузки сервера при подборе пароля
это имеет прямо противоположный эффект
 

savage[2]

Guest
Лучше сделай так: если (например) 3 раза неправильно ввел пароль то выкидывай этого посетителя из скрипта и ставь exit.
 

Фанат

oncle terrible
Команда форума
про регистер глобалс когда-нибудь слышал?
function error ($error_message)
сообщение об ошибке на две секунды выводить - это тебя палачи в освенципе научили?
$user_name=addslashes($user_name);
на большинстве хостов правильное имя, содержащее кавычку, не будет принято базой.
or die("Ошибка. Нет связи с сервером MySQL.<br>");
ты уверен, что хочешь информировать хакера о своих проблемах с базой?
if ($user_pass == "$PASSWORD")
пароль надо проверять сразу в запросе.

читай http://phpfaq.ru/globals
http://phpfaq.ru/slashes
и, самое главное - http://phpfaq.ru/sessions
 

Фанат

oncle terrible
Команда форума
savage[2]
а тебе, ПЕРСОНАЛЬНО http://phpfaq.ru/na_tanke
чтобы больше таких глупостей про "выкидывание из скрипта" никогда в жизни не говорил :)

-~{}~ 25.06.04 19:54:

auth.php
<?php
session_start();
зачем ты стартуешь сессию еще до того, как проверил пароль?
вдруг он неправильный?

три файла на скрипт начального уровня - это слишком много.
более, чем достаточно одного.
$PASSWORD=$info_user["user_pass"];
ты не находишь несколько нелогичным доставать пароль из базы, чтобы показать его юзеру? из поста что - нельзя, что ли?
вся работа с базой должна занимать 5 строк с коннектом.
соединились, запросили, проверили.
все.
 

astron8

Guest
Автор оригинала: Фанат
про регистер глобалс когда-нибудь слышал?
А что у меня не так?

на большинстве хостов правильное имя, содержащее кавычку, не будет принято базой.
mysql_escape_string?

пароль надо проверять сразу в запросе.
это как?

Если есть ссылка на готовый пример кода, киньте так думаю проще будет
 

Фанат

oncle terrible
Команда форума
что у меня не так?
ВСЕ!
правильный массив я у тебя видел только в ОДНОМ месте!
если хочешь знать, что у тебя не так, читайссылку, которую я тебе любезно предоставил
нет. мэджик квотес.
я тебе ссылки давал для чего? распечатать и на стенку повесить?
так же, как и логин. одновременно запросить запись , у которой логин из формы и пароль из формы.

-~{}~ 25.06.04 20:19:

Если есть ссылка на готовый пример кода, киньте так думаю проще будет
нету.
ты пришел научиться?
тогда зачем тебе готовое?

слышал такую поговорку - "за битого двух не битых дают"?
Свой исправленный лучше чужого.

если ты слижешь готоывй скрипт, не понимая его смысла, то этому будет грош цена - ты дыру сделаешь рядом, не отходя от кассы.
 

astron8

Guest
Спасибо за аргументированные ответы, сел переделывать скрипт, вот вопрос зачем экранировать строку?

В одном форуме написали что если этого не делать, то можно получит доступ так admin' /*

я отключил в своем скрипте экранирование но все нормально работает, пишет неверный логин или пароль...в чем опасность ?

зы get_magic_quotes_gpc() возвращает 0
 

Фанат

oncle terrible
Команда форума
ты, все-таки, не прочитал ни строчки из той ссылки, что я тебе дал.
а ведь там ПОДРОБНО написано - и зачем экранировать, и в чем опасность...
я не поленюсь, дам ее тебе еще раз.
http://phpfaq.ru/slashes


один только риторический вопрос меня мучает.
кому это надо?
такое впечатление складывается, что мне.
 

astron8

Guest
извиняюсь была ошибка в программе, действительно если не экранировать то получается нехорошо, я просто незнаком с синтаксисом мускуля поэтому запись типа admin' /*
мне ничего особо неговорит, а насчет ссылок большое спасибо! прочитал уже и не один раз! я просто чайник и учусь почти с 0.
 

Фанат

oncle terrible
Команда форума
скажи, как ты делаешь сейчас.
а еще лучше, приведи полный код после того, как все исправишь в соответствии с замечаниями.

ТОЛЬКО!
если некоторые замечания непонятны или ты с ними не соглаен или не знаешь. как сделать - спроси ЗАРАНЕЕ.
 

astron8

Guest
вот еще вопрос можно ли в sql запросе использовать не
"$user_name" а "$_POST['user_name']" чтобы неиспользовать промежуточные переменные? если можно то как "выдержать" синтаксис, а то у меня ошибку пишет.
 

Winer

Мимо проходил
можно, например конкатенацией(склейкой) строк
$sql="... WHERE login=".addslashes($_POST['user_name'])." AND...";

-~{}~ 25.06.04 23:43:

конечно нужно учитывать magic_quotes_gpc=on/off, ну да ты ведь статью уже прочитал.
 

Фанат

oncle terrible
Команда форума
Winer
НУ КАК ЖЕ учитывать в том запросе, кот орый ты здесь привел, а?
зачем писать такие противоречивые посты?
 

astron8

Guest
Попытка №2 :)

Файл out.php

PHP:
<?php
session_start();
session_destroy();
unset($_SESSION['auth']);
unset($_SESSION['login']);
print "<meta http-equiv=\"refresh\" content=\"0;URL=index.php\">";
?>
Файл index.php

PHP:
<?php
function login_page ()
         {
          echo "<form action=\"auth.php\" method=\"post\">";
          echo "Логин <input type=\"text\" size=\"15\" name=\"login\" maxlength=25><br>";
          echo "Пароль<input type=\"password\" size=\"15\" name=\"pass\"maxlength=32><br>";
          echo "<input type=\"submit\" name=\"submit\" value=\"войти\">";
         }

if (isset($_REQUEST[session_name()]))
{
    session_start();
    if (isset($_SESSION["auth"]))
    {
         print "Сегодня - ".date("d-m-Y",time());
         echo "<br>Привет <b>".$_SESSION["login"]."</b>.<br>";
         echo "Вы Ввели <b>*******</b> и это ваш пароль.";
         echo "<br><a href=out.php>Выход</a>";
    }
    else login_page();
}
    else login_page();
?>
файл auth.php

PHP:
<?php
function error ($error_message)
                   {
                   echo $error_message."<BR>";
                   print "<meta http-equiv=\"refresh\" content=\"1;URL=index.php\">";
                   exit;// header("location: index.php");
                   }
if (isset($_POST["submit"]))
{
    $login=substr($_POST["login"],0,25);
    if (!get_magic_quotes_gpc()) $login=mysql_escape_string($login);
    $pass=substr($_POST["pass"],0,32);
    if (!get_magic_quotes_gpc()) $pass=mysql_escape_string($pass);

sleep(1);//задержка на 1 сек, защита от перегрузки сервера при подборе пароля

    mysql_connect('localhost','root') or die("Ошибка. Нет связи с сервером MySQL.<br>");
    mysql_select_db('test') or die("Ошибка. Нет связи с Базой Данных.<br>");
    $select = mysql_query("SELECT * FROM `users` WHERE user_name = '$login' AND user_pass = '$pass'")
              or die(mysql_error());
    mysql_close();
    If (mysql_num_rows($select) != "0")//если такой юзер есть
        {
        $info_user=mysql_fetch_array($select);
        $login=$info_user["user_name"];//Логин будет таким как в базе(с учетом регистра)
           session_start();
           $_SESSION["auth"]=true;
           $_SESSION["login"]=$login;
           header("location: index.php");
        }
     Else error("Неправильное имя или пароль.");
}
else error("В доступе отказано.");
?>

Вывод ошибок и другие заглушкиоставил на время разработки...
 

IL78

Guest
в ф-ции function error ($error_message) ИМХО должно выводиться сообщение + ссылка "Назад/Попробовать еще раз", а не авто-редирект.
 

Фанат

oncle terrible
Команда форума
IL78
можно тебя попросить не лезть с украшениями, пока код не отлажен?
 

ys

отодвинутый новичок
astron8

Тут уже говорили. Зачем пользователю знать, что у тебя
база глючит? Задаешь просто, в твоем случае:

error('Sorry, сервис временно недоступен, пожалуйста сообщите тудато');

После mysql_query(...) проще:
if(!$select || mysql_result($select,0,0) != 1) error("В доступе отказано.");

Сам запрос упрощаем, т.к. ты проверяешь только существование пользователя с таким логином и паролем:

"SELECT count(*) FROM users WHERE user_name = '$login' AND user_pass = '$pass'"

И зачем имя таблицы было в кавычках?

А это зачем:
$login=$info_user["user_name"];

при том что в запросе: "user_name = '$login' " ???
 
Сверху