За последние 24 часа нас посетили 19423 программиста и 1639 роботов. Сейчас ищут 1895 программистов ...

Аутентификация пользователя

Тема в разделе "Прочие вопросы по PHP", создана пользователем Gennadiy, 13 май 2012.

  1. Gennadiy

    Gennadiy Активный пользователь

    С нами с:
    24 дек 2010
    Сообщения:
    40
    Симпатии:
    0
    Вот скрипт аутентификации пользователя, выдает ошибку включите cookies, хотя они включены:

    login
    Код (Text):
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    5. <title>Untitled Document</title>
    6. </head>
    7.  
    8. <body>
    9. <?php
    10.  
    11. // Страница авторизации
    12.  
    13.  
    14.  
    15. # Функция для генерации случайной строки
    16.  
    17. function generateCode($length=6) {
    18.  
    19.     $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
    20.  
    21.     $code = "";
    22.  
    23.     $clen = strlen($chars) - 1;  
    24.      while (strlen($code) < $length) {
    25.  
    26.             $code .= $chars[mt_rand(0,$clen)];  
    27.      }
    28.  
    29.     return $code;
    30.  
    31. }
    32.  
    33.  
    34.  
    35. # Соединямся с БД
    36.  
    37. mysql_connect("localhost", "root", "");
    38.  
    39. mysql_select_db("agent");
    40.  
    41.  
    42. if(isset($_POST['submit']))
    43.  
    44. {
    45.  
    46.     # Вытаскиваем из БД запись, у которой логин равняеться введенному
    47.  
    48.     $query = mysql_query("SELECT user_id, user_password FROM users WHERE user_login='".mysql_real_escape_string($_POST['login'])."' LIMIT 1");
    49.  
    50.     $data = mysql_fetch_assoc($query);
    51.  
    52.    
    53.  
    54.     # Соавниваем пароли
    55.  
    56.     if($data['user_password'] === md5(md5($_POST['password'])))
    57.  
    58.     {
    59.  
    60.         # Генерируем случайное число и шифруем его
    61.  
    62.         $hash = md5(generateCode(10));
    63.  
    64.            
    65.  
    66.         if(!@$_POST['not_attach_ip'])
    67.  
    68.         {
    69.  
    70.             # Если пользователя выбрал привязку к IP
    71.  
    72.             # Переводим IP в строку
    73.  
    74.             $insip = ", user_ip=INET_ATON('".$_SERVER['REMOTE_ADDR']."')";
    75.  
    76.         }
    77.  
    78.        
    79.  
    80.         # Записываем в БД новый хеш авторизации и IP
    81.  
    82.         mysql_query("UPDATE users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data['user_id']."'");
    83.  
    84.        
    85.  
    86.         # Ставим куки
    87.  
    88.   //      setcookie("id", $data['user_id'], time()+60*60*24*30);
    89.  
    90.     //    setcookie("hash", $hash, time()+60*60*24*30);
    91.  
    92.        
    93.  
    94.         # Переадресовываем браузер на страницу проверки нашего скрипта
    95.  
    96.         header("Location: check.php"); exit();
    97.  
    98.     }
    99.  
    100.     else
    101.  
    102.     {
    103.  
    104.         print "Вы ввели неправильный логин/пароль";
    105.  
    106.     }
    107.  
    108. }
    109.  
    110. ?>
    111.  
    112. <form method="POST">
    113.  
    114. Логин <input name="login" type="text"><br>
    115.  
    116. Пароль <input name="password" type="password"><br>
    117.  
    118. Не прикреплять к IP(не безопасно) <input type="checkbox" name="not_attach_ip"><br>
    119.  
    120. <input name="submit" type="submit" value="Войти">
    121.  
    122. <a href="logout.php">logout </a>
    123. </form>
    124.  
    125.  
    126. </body>
    127. </html>
    regiser
    Код (Text):
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    5. <title>Untitled Document</title>
    6. </head>
    7.  
    8. <body>
    9.  
    10. <?php
    11.  
    12. // Страница авторизации
    13.  
    14.  
    15.  
    16. # Функция для генерации случайной строки
    17.  
    18. function generateCode($length=6) {
    19.  
    20.     $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
    21.  
    22.     $code = "";
    23.  
    24.     $clen = strlen($chars) - 1;  
    25.      while (strlen($code) < $length) {
    26.  
    27.             $code .= $chars[mt_rand(0,$clen)];  
    28.      }
    29.  
    30.     return $code;
    31.  
    32. }
    33.  
    34.  
    35.  
    36. # Соединямся с БД
    37.  
    38. mysql_connect("localhost", "root", "myhost");
    39.  
    40. mysql_select_db("agent");
    41.  
    42.  
    43. if(isset($_POST['submit']))
    44.  
    45. {
    46.  
    47.     # Вытаскиваем из БД запись, у которой логин равняеться введенному
    48.  
    49.     $query = mysql_query("SELECT user_id, user_password FROM users WHERE user_login='".mysql_real_escape_string($_POST['login'])."' LIMIT 1");
    50.  
    51.     $data = mysql_fetch_assoc($query);
    52.  
    53.    
    54.  
    55.     # Соавниваем пароли
    56.  
    57.     if($data['user_password'] === md5(md5($_POST['password'])))
    58.  
    59.     {
    60.  
    61.         # Генерируем случайное число и шифруем его
    62.  
    63.         $hash = md5(generateCode(10));
    64.  
    65.            
    66.  
    67.         if(!@$_POST['not_attach_ip'])
    68.  
    69.         {
    70.  
    71.             # Если пользователя выбрал привязку к IP
    72.  
    73.             # Переводим IP в строку
    74.  
    75.             $insip = ", user_ip=INET_ATON('".$_SERVER['REMOTE_ADDR']."')";
    76.  
    77.         }
    78.  
    79.        
    80.  
    81.         # Записываем в БД новый хеш авторизации и IP
    82.  
    83.         mysql_query("UPDATE users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data['user_id']."'");
    84.  
    85.        
    86.  
    87.         # Ставим куки
    88.  
    89.         setcookie("id", $data['user_id'], time()+60*60*24*30);
    90.  
    91.         setcookie("hash", $hash, time()+60*60*24*30);
    92.  
    93.        
    94.  
    95.         # Переадресовываем браузер на страницу проверки нашего скрипта
    96.  
    97.         header("Location: check.php"); exit();
    98.  
    99.     }
    100.  
    101.     else
    102.  
    103.     {
    104.  
    105.         print "Вы ввели неправильный логин/пароль";
    106.  
    107.     }
    108.  
    109. }
    110.  
    111. ?>
    112.  
    113. <form method="POST">
    114.  
    115. Логин <input name="login" type="text"><br>
    116.  
    117. Пароль <input name="password" type="password"><br>
    118.  
    119. Не прикреплять к IP(не безопасно) <input type="checkbox" name="not_attach_ip"><br>
    120.  
    121. <input name="submit" type="submit" value="Войти">
    122.  
    123. </form>
    124.  
    125.  </body>
    126. </html>
    check
    Код (Text):
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    5. <title>Untitled Document</title>
    6. </head>
    7.  
    8. <body>
    9. <?php
    10.  
    11. // Скрипт проверки
    12.  
    13.  
    14. # Соединямся с БД
    15.  
    16. mysql_connect("localhost", "root", "");
    17.  
    18. mysql_select_db("agent");
    19.  
    20.  
    21. if (isset($_COOKIE['id']) and isset($_COOKIE['hash']))
    22.  
    23. {  
    24.  
    25.     $query = mysql_query("SELECT *,INET_NTOA(user_ip) FROM users WHERE user_id = '".intval($_COOKIE['id'])."' LIMIT 1");
    26.  
    27.     $userdata = mysql_fetch_assoc($query);
    28.  
    29.  
    30.     if(($userdata['user_hash'] !== $_COOKIE['hash']) or ($userdata['user_id'] !== $_COOKIE['id'])
    31.   or (($userdata['user_ip'] !== $_SERVER['REMOTE_ADDR'])  and ($userdata['user_ip'] !== "0")))
    32.  
    33.     {
    34.  
    35.         setcookie("id", "", time() - 3600*24*30*12, "/");
    36.  
    37.         setcookie("hash", "", time() - 3600*24*30*12, "/");
    38.  
    39.         print "Хм, что-то не получилось";
    40.  
    41.     }
    42.  
    43.     else
    44.  
    45.     {
    46.  
    47.         print "Привет, ".$userdata['user_login'].". Всё работает!";
    48.  
    49.     }
    50.  
    51. }
    52.  
    53. else
    54.  
    55. {
    56.  
    57.     print "Включите куки";
    58.  
    59. }
    60.  
    61. ?>
    62.  
    63.  
    64.  
    65.  
    66.  
    67. </body>
    68. </html>
    print "Включите куки"; сначало выдавал что что то не получилось, а теперь пишет включите куки
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    А ошибка на страницы login?

    Там ты закомментировал
    // setcookie("id", $data['user_id'], time()+60*60*24*30);
    // setcookie("hash", $hash, time()+60*60*24*30);

    И зачем 2 раза md5?
    md5(md5($_POST['password']
     
  3. Gennadiy

    Gennadiy Активный пользователь

    С нами с:
    24 дек 2010
    Сообщения:
    40
    Симпатии:
    0
    а закоментировал случайно, сейчас пишет "Хм, что-то не получилось"
    вот, источник инфо вот http://habrahabr.ru/post/13726/
    у меня ошибка выходит

    Добавлено спустя 16 минут 50 секунд:
    // print "Хм, что-то не получилось";
    print "Привет, ".$userdata['user_login'].". Всё работает!";
    показывет логин при входе, это прикол.......:)))))

    Добавлено спустя 9 минут 1 секунду:
    вопрос как написать logout и прочитать логин на других страницах?
     
  4. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    эмм... во-первых куки ставим ДО вывода текста, а не так как это сделано в 1-м скрипте :)
    а чтоб сделать логаут достаточно обнулить куки и обновить страницу
    что касаемо того, как прочитать логин на других страницах, вот тут ваще непонятно что имелось ввиду :)

    ух ты, а в базе и в куках лежит один и тот же хэш?? красота :) тогда лучше 3 раза по md5 :) для надёжности ))