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
Форумы портала PHP.SU :: Версия для печати :: Авторизация на сайте
Форумы портала PHP.SU » PHP » Программирование на PHP » Авторизация на сайте

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

1. -=1100=- - 29 Сентября, 2009 - 20:49:04 - перейти к сообщению
Авторизация

PHP:
скопировать код в буфер обмена
  1.  
  2. // Если поля  формы авторизации  пустые то EXIT!
  3. if(empty($_POST['loginuser']) && empty($_POST['passuser']) ){
  4.   echo("Error!");
  5.   exit();}
  6. // Если НЕ пустые, то....
  7.  
  8. //Преобразует  символы
  9. $logi=htmlspecialchars($_POST['loginuser']);
  10. $logi=trim($logi);  // убираем пробелы
  11. $logi=strtolower($logi); // делаем строку нижнего регистра
  12.  
  13. //Преобразует  символы
  14. $pass=htmlspecialchars($_POST['passuser']);
  15. $pass=trim($pass); // убираем пробелы
  16.  
  17. include "inc/bd.php"; // Подкл. БД
  18. include "inc/generator.php"; //  генерируем строку из 50 символов
  19.  
  20. // узнаем, нет ли такого логина в БД
  21.   $access=mysql_query("SELECT * FROM `dostup` WHERE `login` LIKE '$logi' ");
  22.   $access=mysql_fetch_array($access);
  23.  
  24.          //$access[2] -  Пороль из БД
  25.         //$access[1] - Логин из БД
  26. // если пороль и логин TRUE то идем дальше
  27.   if($access[2]===md5(md5($pass)) && $access[1]===$logi){
  28.    
  29.   // Разбиваем 50 -ти символьную строку напополам (по 25)
  30.     $gen1=substr($gener,0,25);
  31.      $gen2=substr($gener,25);
  32.    
  33.    // записываем целую 50-ти строку в сессию
  34.       $_SESSION['keysession']=$gener;
  35.    
  36.    // пишем обе части длинной строки в БД
  37.      mysql_query("INSERT INTO sessions VALUES('$gen1','$gen2'')");
  38.  
  39.   // адресуем юзера ...  
  40.      echo("<script type='text/javascript'>window.location.href='users/'</script>");
  41.         }
  42.   else{
  43.      echo("Ошибка ввода Логина или Пароля");}
  44.  
  45.   }
  46.  


файл access.php который includ`им на каждую страницу

PHP:
скопировать код в буфер обмена
  1.  
  2.    // Если сессия пустая то шлем на авторизацию
  3. if(empty($_SESSION['keysession']) ){
  4.     echo("<script type='text/javascript'>window.location.href='http://авторизация'</script>");
  5.    exit();}
  6.  
  7.  //Вытаскиваем наше 50-ти символьное число в переменную
  8.    $ses=$_SESSION['keysession'];
  9.      
  10.   // Разбиваем ее напополам
  11.    $ses1=substr($ses,0,25);
  12.    $ses2=substr($ses,25);  
  13.    
  14.    include "bd.php"; // полкл. БД
  15.  
  16.  // Ищем в БД первый  кусок 50-ти символьной строки  строки
  17.    $keyses=mysql_query("SELECT * FROM  sessions WHERE `ID` LIKE '$ses1'");
  18.    $keyses=mysql_fetch_array($keyses);
  19.    
  20.    if(!empty($keyses[0])){ // Если нашли ...
  21.     //Вытаскиваем оба куска из БД и сравниваем их с сессией
  22.     // Если они не равны, то переадресация к авторизации
  23.       if($keyses[0].$keyses[1]!=$_SESSION['keysession']) {
  24.          echo("<script type='text/javascript'>window.location.href='http://авторизация'</script>");
  25.          exit();}}
  26.    else{ // Если в БД пусто то переадрисация
  27.       echo("<script type='text/javascript'>window.location.href='http://авторизация'</script>");
  28.       exit();}
  29.    
  30.  



Если хватило терпения посмотреть код полностью, напишите ваше мнение "+" и "-"

Какие будут предложения.
Что можно дополнить, что убрать ....?
2. Maksim337 - 29 Сентября, 2009 - 21:21:01 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. if(empty($_POST['loginuser']) && empty($_POST['passuser']) ){
  3.   exit('Error!');}
  4. ?>

Улыбка мелочь а приятноУлыбка
(Добавление)
Кстати а как насчет проверки символов?Если я рус букв введу?
3. -=1100=- - 29 Сентября, 2009 - 21:30:08 - перейти к сообщению
Maksim337 пишет:
Кстати а как насчет проверки символов?Если я рус букв введу


Об этом я не подумал. Ну вообще можно на JavaScript сделать. При вводе.

А вообще из соображения безопасности как?
4. Nikola - 30 Сентября, 2009 - 09:17:11 - перейти к сообщению
Можно еще проверять количество не удавшихся авторизаций и в случаи 3(?) попыток, перенаправлять пользователя на другую страницу, либо делать задержку в несколько секунд. Это усложнит брутфорс акаунтов.
5. Phantik - 30 Сентября, 2009 - 10:23:07 - перейти к сообщению
Возникло несколько вопросов\предложений...

1) Почему в SQL запросах вместо = ставишь LIKE?

2) Зачем пароль хэшировать 2 раза?

3) Не совсем понял с какой целью необходимо хранить в базе gen1 и gen2? А в каждой странице выбирать их из базы, складывать и сверять с сессионной переменной? Это должно спасти в случае кражи кукисов? Или для чего это нужно?

4) Параметры передаваемые в SQL запрос вроде как необходимо экранировать
mysql_real_escape_string.

5) Вроде бы красивее было переадресацию делать заголовками.
header("Location: somepage.php");
Или у JS-а асть каккие-то преимущества?
6. JustUserR - 30 Сентября, 2009 - 18:13:27 - перейти к сообщению
Phantik пишет:
Или у JS-а асть каккие-то преимущества?
Есть преимущества особенно когда архитектура PHP-скрипта неправильная и он уже выводит до заголовков какуюлибо информацию
7. -=1100=- - 30 Сентября, 2009 - 19:42:31 - перейти к сообщению
Phantik пишет:
2) Зачем пароль хэшировать 2 раза?

Это параноидальное ))

Phantik пишет:
Почему в SQL запросах вместо = ставишь LIKE?

Мне казалась что LIKE это для VARCHAR, а = для INT Не понял и опечален

Phantik пишет:
Не совсем понял с какой целью необходимо хранить в базе gen1 и gen2? А в каждой странице выбирать их из базы, складывать и сверять с сессионной переменной? Это должно спасти в случае кражи кукисов? Или для чего это нужно?

Ну это для пущей безопасности.

А если использовать ip то еще " + " в безопасности.

PHP:
скопировать код в буфер обмена
  1.  
  2. include "inc/generator.php"; // строка из 50 символов
  3. include "inc/gen.php"; // строка из 5 символов
  4. $ipusera=getenv("REMOTE_ADDR").$hvost;  // ip юзера + 5 символьная строка
  5.  
  6.   $access=mysql_query("SELECT * FROM .`dostup` WHERE `login`='$logi'");
  7.   $access=mysql_fetch_array($access);
  8.  
  9.   if($access[2]===md5(md5($passs)) && $access[1]===$logi){
  10.      $gen1=substr($gener,0,25); // разбиваем на 25
  11.      $gen2=substr($gener,25);  // разбиваем на 25
  12.          
  13.      $gen2=strrev($gen2);   // переворачиваем 2-ую часть "длинной" строку
  14.            
  15.      $_SESSION['keysession']=$gen2; // записываем вторую часть длинной строки в сессию  
  16.      $_SESSION['hvost']=$hvost;  // 5 символьный "хвостик" тоже в сессию
  17.     // записываем в БД
  18.    // первый кусок от длинной строки
  19.   // саму 50-ти символьную строку
  20.      mysql_query("INSERT INTO sessions VALUES('$gen1','$gener','$ipusera')");
  21.  


и на каждой странице include`м

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3.  $exit="<script type='text/javascript'>window.location.href='http://отсылаем'</script>";
  4.    \\ берем ip usera + "хвост".
  5.     $ipusera=getenv("REMOTE_ADDR").$_SESSION['hvost'];
  6.     $ses2=$_SESSION['keysession'];
  7.  
  8.     include "bd.php";
  9.     \\ Ищем в БД ip usera + 5 символьный "хвост"
  10.     $keyses=mysql_query("SELECT * FROM  sessions WHERE `ipusera` LIKE '$ipusera'");
  11.     $keyses=mysql_fetch_array($keyses);
  12.          
  13.     if(!empty($keyses[0])){
  14.           // Если нашел то переворачиваем строку $ses2 в исходное положение
  15.                 $ses2=strrev($ses2);
  16.           // берем первый кусок кусок ( 25 сим.) + второй кусок (25 сим) и сравниваем с 50 символами
  17.         if($keyses[0].$ses2!=$keyses[1]) {
  18.  
  19.            exit($exit);}}
  20.     else{
  21.       exit($exit);}
  22.  
  23.  


Если ip другой то ошибка, + "хвостик" делает его уникальным.
8. Phantik - 30 Сентября, 2009 - 21:18:02 - перейти к сообщению
Я считаю, что запись в базу всевозможных случайных строк, или IP адресов, не дает никаких преимуществ. Хотя я конечно могу и ошибаться.
Но я долго пытался понять от чего такие навароты могут защитить. Нашел только один гипотетический вариант, когда у тебя крадут куки, перетаскивают их каким-то образом к себе на компьютер(а в браузерах кроме IE это довольно - таки не тривиальная задача) и, до истечения срока сессии(а это что-то около 20 минут по дефолтовым настройкам) и уже со своего браузера с твоими кукисами заходят на твой аккаунт. Вот в этом случае запись IP в базу может препятствовать входу.
Зато такой метод увеличивает загрузку базы. Это ведь каждый раз, для каждого пользователя, при каждом переходе на секретную страницу выполняется дополнительный запрос к базе
9. EuGen - 30 Сентября, 2009 - 21:54:01 - перейти к сообщению
Phantik пишет:
а в браузерах кроме IE это довольно - таки не тривиальная задача

ну так подавляющее большинство и используют его. Причем еще дырявое 6-е.
Phantik пишет:
и, до истечения срока сессии

Ну так 20 минут - вечность для такой операции.
10. -=1100=- - 01 Октября, 2009 - 07:25:27 - перейти к сообщению
Phantik пишет:
Зато такой метод увеличивает загрузку базы. Это ведь каждый раз, для каждого пользователя, при каждом переходе на секретную страницу выполняется дополнительный запрос к базе

Тут я полностью согласен.

Просто так более безопаснее. мне так кажется
11. EuGen - 01 Октября, 2009 - 14:00:15 - перейти к сообщению
Phantik пишет:
Зато такой метод увеличивает загрузку базы. Это ведь каждый раз, для каждого пользователя, при каждом переходе на секретную страницу выполняется дополнительный запрос к базе

При правильной организации не загрузит. Все зависит от целей.

 

Powered by ExBB FM 1.0 RC1