Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Авторизация

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
pabet
Отправлено: 06 Декабря, 2011 - 19:32:12
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




Здравствуйте! У меня проблемы с кодом авторизации, при вводе верного логина и верного пароля войти нельзя, но почему-то при вводе верного логина и не верного пароля войти можно, даже если не ввести пароль можно войти, подскажите в чем ошибка?
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. $username = $_POST['username'];
  3. $password = $_POST['password'];
  4. $result = mysql_query("SELECT login,password1 FROM users WHERE login='$username'");
  5. $myrow = mysql_fetch_array($result);
  6. if ((strcasecmp($username, $myrow['login']) == 0) && (strcmp($password, $myrow['password1']) == 0))
  7. {
  8.         $_SESSION['username'] = $username;
  9.         $_SESSION['password'] = $password;
  10. }
  11. ?>

(Отредактировано автором: 06 Декабря, 2011 - 19:38:26)

 
 Top
Самогонщик
Отправлено: 06 Декабря, 2011 - 19:43:06
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


Помог: 8 раз(а)




Что содержит $myrow['password1'] ?

Довольно странно проверять логин, если по нему делался поиск в базе.

Получится не очень хорошо, если введённого логина не будет существовать.

Кстати, в коде есть эскуэл-иньекция.
 
 Top
sKaa
Отправлено: 06 Декабря, 2011 - 19:44:53
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


Помог: 25 раз(а)

[+]


PHP:
скопировать код в буфер обмена
  1.  
  2.     <?PHP
  3.     $username = $_POST['username'];
  4.     $password = $_POST['password'];
  5.     $result = mysql_query("SELECT login,password1 FROM users WHERE login='$username'");
  6.     $myrow = mysql_fetch_array($result);
  7.    
  8.     if(!empty($password) && $myrow['password1'] == $password))
  9.     {
  10.             $_SESSION['username'] = $username;
  11.             $_SESSION['password'] = $password;
  12.             header("Location: $_SERVER['REQUEST_URI']");
  13.     }
  14.     ?>
  15.  

У тебя ещё помойму синтаксическая ошибка в $_SERVER[REQUEST_URI]";
 
 Top
Самогонщик
Отправлено: 06 Декабря, 2011 - 19:48:29
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


Помог: 8 раз(а)




sKaa, тот же вопрос: что если логина нет в базе?
 
 Top
pabet
Отправлено: 06 Декабря, 2011 - 19:56:21
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




Самогонщик пишет:
Что содержит $myrow['password1'] ?

В ней хранится пароль, который пользователь ввел при регистрации!
Самогонщик пишет:
Довольно странно проверять логин, если по нему делался поиск в базе.

Получится не очень хорошо, если введённого логина не будет существовать.

Как-то не подумал насчет этого, но ошибка не в этом!
Даже если логина нет в базе ничего не произойдет!

Самогонщик пишет:
Кстати, в коде есть эскуэл-иньекция.

Что?
 
 Top
Microteam
Отправлено: 06 Декабря, 2011 - 20:47:08
Post Id



Гость


Покинул форум
Сообщений всего: 67
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




Самогонщик пишет:
Кстати, в коде есть эскуэл-иньекция.

SQL инъекция это плохо, а так работает?:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $username = $_POST['username'];
  4. $password = $_POST['password'];
  5.  
  6. if (!$password || !$username) die("Поля немогут быть пустыми");
  7.  
  8. $result = mysql_query("SELECT login,password1 FROM users WHERE login='$username'");
  9.  
  10. if (!mysql_num_rows($result)) die("Логина нет в базе"); // это если нет логина
  11. $myrow = mysql_fetch_array($result);
  12. if (strtolower($username) === strtolower($myrow['login']) && $password === $myrow['password1'])
  13. {
  14.         $_SESSION['username'] = $username;
  15.         $_SESSION['password'] = $password;
  16. }
  17. ?>
  18.  

(Отредактировано автором: 06 Декабря, 2011 - 20:50:42)



-----
int i = 6; ++i + i++ = ?
 
 Top
pabet
Отправлено: 06 Декабря, 2011 - 20:54:21
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




Microteam пишет:
а так работает?:

Нет!
(Добавление)
[quote=pabet]Здравствуйте! У меня проблемы с кодом авторизации, почему-то при вводе верного логина и не верного пароля можно войти, даже если не ввести пароль можно войти, подскажите в чем ошибка?
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. $username = $_POST['username'];
  3. $password = $_POST['password'];
  4. $result = mysql_query("SELECT login,password1 FROM users WHERE login='$username'");
  5. $myrow = mysql_fetch_array($result);
  6. if ((strcasecmp($username, $myrow['login']) == 0) && (strcmp($password, $myrow['password1']) == 0))
  7. {
  8.         $_SESSION['username'] = $username;
  9.         $_SESSION['password'] = $password;
  10. }
  11. ?>
[/quote]
(Добавление)
[quote=pabet]
Microteam пишет:
а так работает?:

Нет!
 
 Top
Bio man
Отправлено: 06 Декабря, 2011 - 22:58:37
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




попробуйте отладить.
напишите перед ?>
PHP:
скопировать код в буфер обмена
  1. echo '<table border=1><tr><td><b>Массив $_POST</b></td><td><b>Это моя выборка из БД</b></td></tr><tr><td><pre>';
  2. var_dump($_POST);
  3. echo '</pre></td><td><pre>';
  4. var_dump($myrow);
  5. echo '</pre></td></tr><tr><td><b>strcmp($password, $myrow[\'password1\']) ==</b></td><td>'.strcmp($password, $myrow['password1']).'</td></tr></table>';
 
 Top
Maxi
Отправлено: 07 Декабря, 2011 - 10:21:01
Post Id



Гость


Покинул форум
Сообщений всего: 107
Дата рег-ции: Июнь 2010  
Откуда: Kharkov, Ukraine


Помог: 0 раз(а)




А ты сессию вообще где-нибуть инициализировал?
 
 Top
Sveta
Отправлено: 07 Декабря, 2011 - 11:35:39
Post Id


Новичок


Покинул форум
Сообщений всего: 33
Дата рег-ции: Май 2011  


Помог: 0 раз(а)




Я сессии не использовала, но делала так и у меня работает.
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. // Страница авторизации
  4.  
  5. # Функция для генерации случайной строки
  6. function generateCode($length=6) {
  7.     $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";
  8.     $code = "";
  9.     $clen = strlen($chars) - 1;  
  10.     while (strlen($code) < $length) {
  11.             $code .= $chars[mt_rand(0,$clen)];  
  12.     }
  13.     return $code;
  14. }
  15.  
  16.  
  17. # Соединямся с БД
  18. include_once ("O:/home/localhost/www/db/www/podkluchenie.php");
  19.  
  20. if(isset($_POST['submit']))
  21. {
  22.     # Вытаскиваем из БД запись, у которой логин равняеться введенному
  23.    $query = mysql_query("SELECT `users`.`id_u`, `users`.`password` FROM users WHERE login='".mysql_real_escape_string($_POST['login'])."' LIMIT 1");
  24.     $data = mysql_fetch_assoc($query);
  25.    
  26.     # Сравниваем пароли
  27.    if($data['password'] === md5(md5($_POST['password'])))
  28.     {
  29.         # Генерируем случайное число и шифруем его
  30.        $hash = md5(generateCode(10));
  31.            
  32.         if(!@$_POST['not_attach_ip'])
  33.         {
  34.             # Если пользователя выбрал привязку к IP
  35.            # Переводим IP в строку
  36.            $insip = ", ip=INET_ATON('".$_SERVER['REMOTE_ADDR']."')";
  37.         }
  38.        
  39.         # Записываем в БД новый хеш авторизации и IP
  40.        mysql_query("UPDATE users SET hash='".$hash."' ".$insip." WHERE id_u='".$data['id_u']."'");
  41.        
  42.         # Ставим куки
  43.        setcookie("id", $data['id_u'], time()+60*60*24*30);
  44.         setcookie("hash", $hash, time()+60*60*24*30);
  45.        
  46.         # Переадресовываем браузер на страницу проверки нашего скрипта
  47.        header("Location: [страница куда надо перейти после авторизации].php"); exit();
  48.     }
  49.     else
  50.     {
  51.         print "Вы ввели неправильный логин/пароль";
  52.     }
  53. }
  54. ?>
  55.  
  56. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  57. <html>
  58.  <head>
  59.   <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
  60.  </head>
  61.  <body>
  62.  
  63. <form method="POST">
  64. Логин</td>
  65. <td><input name="login" type="text"><br></td></tr>
  66. <tr><td> Пароль</td> <td> <input name="password" type="password"><br></td></tr>
  67. <tr><td>Не прикреплять к IP (не безопасно)</td> <td> <input type="checkbox" name="not_attach_ip"><br></td><tr>
  68. <tr><td width="140 px"><input name="submit" type="submit" value="Войти">
  69. </form></td></tr></table>
  70.  </body>
  71. </html>
  72.  

для этого нужна таблица в бд с пользователями (у меня таблица users), в которой есть поля id,login,password,hash,ip.
А на странице, на которую ты переходишь, должна быть проверка
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. // Скрипт проверки
  4.  
  5. # Соединямся с БД
  6.  
  7.  
  8. if (isset($_COOKIE['id']) and isset($_COOKIE['hash']))
  9. {  
  10.     $query = mysql_query("SELECT *,INET_NTOA(ip) AS ip FROM users WHERE id_u = '".intval($_COOKIE['id'])."' LIMIT 1");
  11.     $userdata = mysql_fetch_assoc($query);
  12.  
  13.     if(($userdata['hash'] !== $_COOKIE['hash']) or ($userdata['id_u'] !== $_COOKIE['id'])
  14.  or (($userdata['ip'] !== $_SERVER['REMOTE_ADDR'])  and ($userdata['ip'] !== "0")))
  15.     {
  16.         setcookie("id", "", time() - 3600*24*30*12, "/");
  17.         setcookie("hash", "", time() - 3600*24*30*12, "/");
  18.         print "Хм, что-то не получилось";
  19.     }
  20.     else
  21.     {
  22.         print "Привет, ".$userdata['login'].". Всё работает!";
  23.     }
  24. }
  25. else
  26. {
  27.     print "Включите куки";
  28. }
  29. ?>
  30.  
  31.  

Естественно у тебя должны быть свои названия полей

(Отредактировано автором: 07 Декабря, 2011 - 11:37:58)

 
 Top
pabet
Отправлено: 07 Декабря, 2011 - 12:57:52
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




Bio man пишет:
попробуйте отладить.

Хм, странно, если ввести пароль правильно, то появляется 0, а если его не ввести или ввести не правильно, тогда появляются числа от -1 до -5, почему if считает это условие истинным?

Maxi пишет:
А ты сессию вообще где-нибуть инициализировал?

Эти сессии или сессии вообще?
 
 Top
Bio man
Отправлено: 07 Декабря, 2011 - 15:40:40
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




pabet пишет:
почему if считает это условие истинным?
все что не 0 - true (не считая других типов данных) пробуй
PHP:
скопировать код в буфер обмена
  1. strcmp($password, $myrow['password1'])===0
pabet пишет:
Эти сессии или сессии вообще?
session_start();
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB