За последние 24 часа нас посетили 18825 программистов и 1651 робот. Сейчас ищут 932 программиста ...

Авторизация под одним и тем же логином

Тема в разделе "PHP и базы данных", создана пользователем soctellad, 19 сен 2013.

  1. soctellad

    soctellad Новичок

    С нами с:
    22 авг 2013
    Сообщения:
    12
    Симпатии:
    0
    Добрый день, подскажите почему постоянно заходит через первую запись базы где логин admin, причем логины и пароли ввожу разные. Внизу кусок кода:
    Код (Text):
    1. <?php
    2. session_set_cookie_params(10800);
    3. session_start();
    4.  
    5. include ('connect.php');
    6.  
    7.  
    8. if(isset($_POST['go']))
    9. {
    10. $q2=mysql_query("SELECT * FROM database WHERE login='".$_REQUEST['login']."' and tariff_id='2'");
    11. $f = mysql_fetch_array($q2);
    12.     if(($_REQUEST['login']==$f['login']) && (md5($_REQUEST['passwd'])==$f['password']))
    13.     {
    14.         $_SESSION['enter'] = "1";
    15.         $_SESSION['us_id'] = $f['user_id'];
    16.         $_SESSION['right'] = $f['rig'];
    17.      
    18.         header("Location: index.php");
    19.  
    20.  
    21.     }
    22.     else
    23.     {
    24.         echo "<div class='clean-gray'>Не верное сочетание логина и пароля <a href=lock.php>Попробовать ещё раз.</a></div>";
    25.     }
    26.  
    27. }
    28.  
    29. ?>
    30.  
    31. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    32. "http://www.w3.org/TR/html4/loose.dtd">
    33. <head>
    34. <title>Вход Админцентр</title>
    35. <meta http-equiv="content-type" content="text/html; charset=utf-8">
    36. <link rel="shortcut icon" href="images/siteico0.ico" type="image/x-icon" />
    37.  
    38. <style type="text/css" media="all">
    39. * { margin: 0; padding: 0; }
    40. body {background: #fAfAfA; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:12px;}
    41. img {border:none;}
    42. #conteiner {width: 400px; margin: 7em auto;}
    43. #conteiner .loform {
    44.     padding: 16px 16px 16px 16px;
    45.     font-weight: normal;
    46.     -moz-border-radius: 11px;
    47.     -khtml-border-radius: 11px;
    48.     -webkit-border-radius: 11px;
    49.     border-radius: 5px;
    50.     background: #fff;
    51.     border: 1px solid #e5e5e5;
    52.     -moz-box-shadow: rgba(200,200,200,1) 0 4px 18px;
    53.     -webkit-box-shadow: rgba(200,200,200,1) 0 4px 18px;
    54.     -khtml-box-shadow: rgba(200,200,200,1) 0 4px 18px;
    55.     box-shadow: rgba(200,200,200,1) 0 4px 18px;
    56. }
    57. #conteiner .mess {
    58.     margin-bottom: 10px;
    59.     padding: 10px;
    60.     font-weight: normal;
    61.     -moz-border-radius: 5px;
    62.     -khtml-border-radius: 5px;
    63.     -webkit-border-radius: 5px;
    64.     border-radius: 5px;
    65.     border: 1px solid;
    66.     -moz-box-shadow: rgba(200,200,200,1) 0 4px 18px;
    67.     -webkit-box-shadow: rgba(200,200,200,1) 0 4px 18px;
    68.     -khtml-box-shadow: rgba(200,200,200,1) 0 4px 18px;
    69.     box-shadow: rgba(200,200,200,1) 0 4px 18px;
    70.     color:#000;
    71.     font-family:Verdana, Arial, Helvetica, sans-serif;
    72.     font-size:11px;
    73. }
    74.  
    75.  
    76. #conteiner .loform p {color:#808080; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:14px; margin:5px;}
    77. #conteiner .loform input {background:#fafafa; border:1px solid #cccccc; color:#666666; padding:4px; width:98%; font-size:25px; margin-bottom:20px;}
    78. #conteiner .loform input.submit {margin-top:-16px; width:74px; height:64px; border: 1 px; text-align:right; vertical-align:top;}
    79. #conteiner .loform a {color: #bcbcbc; text-decoration: none;}
    80. #conteiner .loform a:hover {color:#d7722f;}
    81.  
    82. #conteiner .logo {text-align:center; padding-bottom:20px;}
    83. </style>
    84. </head>
    85. <body>
    86. <div id="conteiner">
    87.     <div class="logo">
    88.      
    89.       <p><strong>Вход для администраторов</strong></p>
    90.     </div>
    91.  
    92. <div class="loform">
    93.             <form name="form1" method="post" action="">`
    94.             <p>Логин <input type="text" name="login" size="40" /></p>
    95.             <p>
    96.                 Пароль<br />
    97.                 <input type="password" name="passwd"  size="40" />
    98.                 <input type="submit" value="Войти" size="40" name="go">
    99.  
    100.             </p>
    101.         </form>
    102.             </div>
    103. </div>
    104. </body>
    105. </html>
    106. <?
    107.  
    108.  
    109. ?>
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    тут столько ошибок, что я просто теряюсь сказать почему. это каша-малаша.

    во первых, ты не проверяешь параметры login и passwd на пустоту. а потом не проверяешь результат запроса (а вдруг не нашел ничего?)

    во вторых, судя по первому if ты ждешь данных из post-запроса, а потом вдруг согласен получить login и passwd из все равно откуда :) ты понимаешь что такое $_REQUEST?

    в третьих, ты подставляешь в запрос неэкранированные данные. это приглашение к сексу в слепую.

    в четвертых, сразу после header('Location...') должен стоять exit(), ВСЕГДА!

    ... и почему в случае НЕудачи сессия никак не меняется? это же сессия, один раз туда попало нечто и блеать лежит там при следующем вызове и в третьем, двадцать пятом..

    ...

    короче хз. просто незачет
     
  3. soctellad

    soctellad Новичок

    С нами с:
    22 авг 2013
    Сообщения:
    12
    Симпатии:
    0
    Поменял на следуещее, но не входит
    Код (Text):
    1. include './connect.php';
    2.  
    3.  
    4.  
    5.  
    6. if(isset($_POST['login'], $_POST['passwd']))
    7. {
    8.     $login = is_scalar($_POST['login']) ? mysql_real_escape_string(trim($_POST['login'])) : NULL;
    9.     $pass = is_scalar($_POST['passwd']) ? md5($_POST['passwd']) : NULL;
    10.     if(!empty($login) && !empty($pass))
    11.     {
    12.         $qw="SELECT `rig`,`user_id` FROM `re_user` WHERE `login` = '$login' AND `password` = '$pass'";
    13.         $q2=mysql_query($qw);
    14.         $f = mysql_fetch_assoc($q2);
    15.         if(!empty($f['user_id']))
    16.         {
    17.             $_SESSION['enter'] = 1;
    18.             $_SESSION['us_id'] = $f['user_id'];
    19.             $_SESSION['right'] = $f['rig'];
    20.             $_SESSION['login'] = $login;
    21.         }
    22.         else
    23.         {
    24.             echo '<div class="clean-gray">Не верное сочетание логина и пароля <a href="lock.php">Попробовать ещё раз.</a></div>';
    25.         }
    26.     }
    27.     else
    28.     {
    29.             echo '<div class="clean-gray">Введите логин и пароль <a href="lock.php">Попробовать ещё раз.</a></div>';
    30.     }
    31.  
    32. }
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    выглядит лучше :) бизнес-логика правда не улучшилась, зато техника подросла.

    что ты имеешь: если форма отправлена и данные верны, то в сессию записывается инфа о пользователе.

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

    Алсо: если ты тестируя свое изделие один раз успешно прошел аутентификацию, то эти данные будут жить в сессии довольно долго. неуспешные попытки ничего не меняют. нигде нет ни настоящего logout, ни сброса сессии при неуспехе. видимо это причина твоей боли.
     
  5. soctellad

    soctellad Новичок

    С нами с:
    22 авг 2013
    Сообщения:
    12
    Симпатии:
    0
    В код личного кабинета добавил кнопку выхода
    Код (Text):
    1. <form action="" method="post"><input type='submit' name='exit' value='Выйти из кабинета'/></form>
    2. <?php
    3.  
    4. if($_REQUEST['exit'])
    5.   {
    6.  
    7.     header("Location: lock.php");
    8. session_destroy();
    9.         exit();
    10.   }
    11.  
    12.  
    13. ?>
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Здесь форма лишняя. чтобы породить параметр с именем "exit", достаточно дать ссылку
    Код (Text):
    1. <a href="?exit">Выйти из кабинета</a>
    2. ...
    3. if (isset($_GET['exit'])) ...
    Ты избежишь многих проблем если избавишся от $_REQUEST и будешь явно использовать $_GET и $_POST.

    Еще мега-совет: отлаживай свои скрипты с выводом всех ошибок и предупреждений. А когда перенесешь на рабочий сервер, выключай это.
    Код (Text):
    1.  
    2. error_reporting(-1);
    3. ini_set('display_errors', 'on');
    Поначалу это повергнет тебя в депрессию, столько появится предупреждений о неизвестных переменных и индексов массива. Например такая хуйня порождает предупреждение:
    Код (Text):
    1. if($_REQUEST['exit'])
    Потому что в большинстве случаев у этого массива отсутствует индекс 'exit'. Придется везде втыкать isset() или array_key_exists() или !empty()...
    Но это реально помогает избавиться от скрытых ошибок. Предупреждения они не зря!