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

 PHP.SU

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


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

> Описание: прошу указать на ошибки
Advinno
Отправлено: 14 Мая, 2011 - 11:24:15
Post Id


Новичок


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


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




Посмотрите опытным взглядом на наличие дырок. Коллективный разум свернет горы.

Файл start.php. С него начинается просмотр.
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. require "bezopasnost'.php";
  4. echo "Скрываемая инфа";
  5. ?>


Файл bezopasnost'.php. Он включается во все защищаемые страницы.
PHP:
скопировать код в буфер обмена
  1. <?
  2.    session_name("Id");
  3.    session_start();
  4.  
  5.    if (!isset($_SESSION['Session_Name_of_User']))
  6.    {
  7.       header("Location: http://".$_SERVER['HTTP_HOST']."/login.php");
  8.       exit;
  9.    }
  10.    else
  11.    {
  12.       if ($_SESSION['Session_IP_of_User'] != $_SERVER['REMOTE_ADDR']
  13.       || $_SESSION['Time_of_User_session_start']+300 < time())
  14.       {
  15.          session_unset();
  16.          session_destroy();
  17.          header("Location: http://".$_SERVER['HTTP_HOST']."/login.php");
  18.          exit;
  19.       }
  20.    }
  21. ?>


Файл login.php. Собственно, авторизация.
PHP:
скопировать код в буфер обмена
  1. <?
  2.    mysql_connect("localhost","MySQL_login","11111") or die(mysql_error());
  3.    mysql_select_db("My_db") or die(mysql_error());
  4.  
  5.    # Удаляем из таблицы "Неудачные попытки авторизации" записи, которые создались в предыдущий день.
  6.   $query = "SELECT * FROM `bad_popitki`";
  7.    $res = mysql_query($query) or trigger_error(mysql_error().$query);
  8.    while ($row = mysql_fetch_assoc($res))
  9.    {
  10.      if (date('d.m.Y',$row['Time_of_last_attempt']) <> date('d.m.Y'))
  11.       {
  12.          $query2 = "DELETE FROM `bad_popitki` WHERE `Id` = '".$row['Id']."'";
  13.          $res2 = mysql_query($query2) or trigger_error(mysql_error().$query);
  14.       }
  15.    }
  16.    mysql_free_result($res);
  17.  
  18.    if (isset($_POST['Auth_Name']) && isset($_POST['Auth_Pass']))
  19.    {
  20.       # Защита от брутфорса. Проверяем не исчерпан ли лимит на кол-во попыток ввода пароля.
  21.      $query3 = "SELECT * FROM `bad_popitki` WHERE `IP_of_User` = '".$_SERVER['REMOTE_ADDR']."'";
  22.       $res3 = mysql_query($query3) or trigger_error(mysql_error().$query);
  23.       if ($row3 = mysql_fetch_assoc($res3))
  24.       {
  25.          if ($row3['Kolvo_popitok'] >= 5)
  26.          {
  27.             mysql_free_result($res3);
  28.             mysql_close;
  29.             header("Location: http://".$_SERVER['HTTP_HOST']."/login.php");
  30.             exit;
  31.          }
  32.       }
  33.  
  34.       # Обрезаем Логин и Пароль и берем хэш от пароля
  35.      $Name=substr($_POST['Auth_Name'],0,20);
  36.       $Pass=hash('sha256',substr($_POST['Auth_Pass'],0,20));
  37.  
  38.       # Т.к. от пароля остался только его хэш, то там нет неприятных символов. Проверяем только Логин.
  39.      # Если встретился хоть один символ кроме 0-9, a-z, A-Z, то увеличиваем на единицу кол-во неудачных попыток.
  40.      for ($i = 0; $i < strlen($Name); $i++)
  41.       {
  42.          if (ord(substr($Name,$i,1))<48
  43.          ||  ord(substr($Name,$i,1))>57 && ord(substr($Name,$i,1))<65
  44.          ||  ord(substr($Name,$i,1))>90 && ord(substr($Name,$i,1))<97
  45.          ||  ord(substr($Name,$i,1))>122)
  46.          {
  47.             Plus_one_bad_popitka();
  48.             mysql_close;
  49.             header("Location: http://".$_SERVER['HTTP_HOST']."/login.php");
  50.             exit;
  51.          }
  52.       }
  53.  
  54.       # Если дошли сюда, значит пара Логин-Пароль не содержин неприятных символов. Проверяем ее по таблице "Логин-Пароль"
  55.      $query8 = "SELECT * FROM `My_Users` WHERE `Name_of_User` = '".$Name."' AND `Pass_of_User` = '".$Pass."'";
  56.       $res8 = mysql_query($query8) or trigger_error(mysql_error().$query);
  57.       if ($row8 = mysql_fetch_assoc($res8))
  58.       {
  59.          session_name("Id");
  60.          session_start();
  61.          # Авторизуем юзера
  62.         $_SESSION['Session_Name_of_User'] = $row8['Name_of_User'];
  63.          $_SESSION['Session_IP_of_User'] = $_SERVER['REMOTE_ADDR'];
  64.          $_SESSION['Time_of_User_session_start'] = time();
  65.  
  66.          # Обнуляем неудачные попытки входа для этого IP
  67.         $query9 = "DELETE FROM `bad_popitki` WHERE `IP_of_User` = '".$_SERVER['REMOTE_ADDR']."'";
  68.          $res9 = mysql_query($query9) or trigger_error(mysql_error().$query);
  69.  
  70.          mysql_free_result($res8);
  71.          mysql_close;
  72.          header("Location: http://".$_SERVER['HTTP_HOST']);
  73.          exit;
  74.       }
  75.       else
  76.       {
  77.          Plus_one_bad_popitka();
  78.          mysql_free_result($res8);
  79.          mysql_close;
  80.          header("Location: http://".$_SERVER['HTTP_HOST']."/login.php");
  81.          exit;
  82.       }
  83.    }
  84.    else
  85.    {
  86.       # Если не нажата кнопка входа в форме, то выводим саму форму
  87.      $query10 = "SELECT * FROM `bad_popitki` WHERE `User_IP` = '".$_SERVER['REMOTE_ADDR']."'";
  88.       $res10 = mysql_query($query10) or trigger_error(mysql_error().$query);
  89.       if ($row10 = mysql_fetch_assoc($res10))
  90.       {
  91.          if ($row10['Kolvo_popitok'] >= 5)
  92.          {
  93.             $Stroka_dlya_formi = "<div class='alert_red'>Попробуй после полуночи</div>";
  94.          }
  95.          if ($row10['Kolvo_popitok'] == 4)
  96.          {
  97.             $Stroka_dlya_formi = "<div class='alert_red'>Осталась 1 попытка</div>";
  98.          }
  99.          if ($row10['Kolvo_popitok'] == 3)
  100.          {
  101.             $Stroka_dlya_formi = "<div class='alert_red'>Осталось 2 попытки</div>";
  102.          }
  103.          if ($row10['Kolvo_popitok'] == 2)
  104.          {
  105.             $Stroka_dlya_formi = "<div class='alert_green'>Осталось 3 попытки</div>";
  106.          }
  107.          if ($row10['Kolvo_popitok'] == 1)
  108.          {
  109.             $Stroka_dlya_formi = "<div class='alert_green'>Осталось 4 попытки</div>";
  110.          }
  111.       }
  112.       else
  113.       {
  114.          $Stroka_dlya_formi = "<div class='alert_green'>Осталось 5 попыток</div>";
  115.       }
  116.       mysql_free_result($res10);
  117.       mysql_close;
  118.       require "forma-for-login.php";
  119.    }
  120.  
  121.    function Plus_one_bad_popitka()
  122.    {
  123.       $query4 = "SELECT * FROM `bad_popitki` WHERE `User_IP` = '".$_SERVER['REMOTE_ADDR']."'";
  124.       $res4 = mysql_query($query4) or trigger_error(mysql_error().$query);
  125.       if ($row4 = mysql_fetch_assoc($res4))
  126.       {  # Если нашли IP, то обновляем время последней попытки
  127.         $query5 = "UPDATE `bad_popitki` SET `Time_of_last_attempt` = '".time()."' WHERE `User_IP` = '".$row4['User_IP']."'" ;
  128.          $res5 = mysql_query($query5) or trigger_error(mysql_error().$query);
  129.          # и увеличиваем на 1 кл-во неудачных попыток
  130.         $query6 = "UPDATE `bad_popitki` SET `Kolvo_popitok` = '".($row4['Kolvo_popitok']+1)."' WHERE `User_IP` = '".$row4['User_IP']."'";
  131.          $res6 = mysql_query($query6) or trigger_error(mysql_error().$query);
  132.       }
  133.       else
  134.       {
  135.          # Если не нашли IP, то создаем новую запись
  136.         $query7 = "INSERT INTO `bad_popitki` (`User_IP`, `Time_of_last_attempt`, `Kolvo_popitok`) VALUES ('".$_SERVER['REMOTE_ADDR']."','".time()."','1')";
  137.          $res7 = mysql_query($query7) or trigger_error(mysql_error().$query);
  138.       }
  139.       mysql_free_result($res4);
  140.    }
  141. ?>


Файл forma-for-login.php. Форма авторизации.
PHP:
скопировать код в буфер обмена
  1. <html>
  2. <head>
  3.    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
  4.    <title>Авторизация</title>
  5. </head>
  6. <body>
  7.    <? echo $Stroka_dlya_formi; ?>
  8.       <form method='POST'>
  9.          <input type='text' name='Auth_Name' class='input_text' size='25' maxlength='25'><br>
  10.          <input type='password' name='Auth_Pass' class='input_text' size='25' maxlength='25'><br>
  11.          <input type='submit' value='Вход' class='input_submit'>
  12.       </form>
  13. </body>
  14. </html>
 
 Top
molchun201
Отправлено: 14 Мая, 2011 - 11:45:34
Post Id



Посетитель


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


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




1. У Вас много "SELECT * . . ." в запросах, для безопастности лучше писать конкретные поля
2. Меня учили писать session_start(); первой строчкой в коде, если используются сессии
3. mysql_close; по спецификации советуют писать так mysql_close($connect); - т.е. конкретно указывать. Хотя щас PHP умный стал и закрывать не обязательно
4. Недавно услышал на (IRBIS_team) что закрывать PHP код ?> не нужно, во избежании внедрения всяких гадостей в код
5. charset=windows-1251 - лучше сразу UTF-8, чтоб потом проблем не было
6. Мне советовали что все проверки, такие как mysql_error(), лучше использовать на моменте дебага, но когда уже реально начинаешь юзать код, то их убрать из кода, чтобы в случае чего не дать лишней информации злоумышленнику


-----
Обрамляйте код тегами и читайте
 
 Top
OrmaJever
Отправлено: 14 Мая, 2011 - 11:51:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




molchun201 пишет:
4. Недавно услышал на (IRBIS_team) что закрывать PHP код ?> не нужно, во избежании внедрения всяких гадостей в код

Оо новость! А можно статью? Сам замечал что в некоторых движках нету закрывающихся тегов думал может редактор что-то мутит.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
molchun201
Отправлено: 14 Мая, 2011 - 12:27:51
Post Id



Посетитель


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


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




Цитата:
А можно статью?


http://irbis-team[dot]com/15/10/2
Цитата:
?> нельзя ставить ни в коем случае. Это не просто вредно, но и опасно.
Объясню, чтоб не быть голословным.
1. После него может оказаться пробел или перенос строки. А так, как файл подключен выше доктайпа, значит и пробел вылезет туда. А это гарантированно угробит верстку в IE.
2. Всё, что написано после него, интерпретируется как HTML. А это значит, что (не дай Бог) в конец файла попадет вирус, то он сработает.
А тупые боты именно туда норовят прописать всякую гадость. Так вот, ежели его (закрывающего значка) не будет, то вирь попадет в тело php и вызовет ошибку. Плохо конечно, но лучше, чем бы он сработал у клиента.


-----
Обрамляйте код тегами и читайте
 
 Top
demot
Отправлено: 14 Мая, 2011 - 17:39:43
Post Id


Частый гость


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


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




molchun201 пишет:
http://irbis-team.com/15/10/2

Спасибо за статью, очень познавательно.
Т.к. сам начинающий, то узнал много интересностей.
 
 Top
Advinno
Отправлено: 14 Мая, 2011 - 17:41:08
Post Id


Новичок


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


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




molchun201 пишет:
1. У Вас много "SELECT * . . ." в запросах, для безопастности лучше писать конкретные поля
2. Меня учили писать session_start(); первой строчкой в коде, если используются сессии
3. mysql_close; по спецификации советуют писать так mysql_close($connect); - т.е. конкретно указывать. Хотя щас PHP умный стал и закрывать не обязательно
4. Недавно услышал на (IRBIS_team) что закрывать PHP код ?> не нужно, во избежании внедрения всяких гадостей в код
5. charset=windows-1251 - лучше сразу UTF-8, чтоб потом проблем не было
6. Мне советовали что все проверки, такие как mysql_error(), лучше использовать на моменте дебага, но когда уже реально начинаешь юзать код, то их убрать из кода, чтобы в случае чего не дать лишней информации злоумышленнику


Спасибо. Учел все пункты.
И сайт от Ирбиса хорош.

Еще комментарии есть?
 
 Top
OrmaJever
Отправлено: 14 Мая, 2011 - 17:43:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Advinno пишет:
Еще комментарии есть?

код написан плохо, некоторые условия можно объеденить, запросы так же обьеденить, и некоторые повторяющиеся части кода в функцию записать.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Advinno
Отправлено: 14 Мая, 2011 - 18:03:11
Post Id


Новичок


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


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




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


Согласен, что до идеала далеко. Для начинающего не плохо.
Можете дать конкретные рекомендации? Был бы очень признателен.
 
 Top
OrmaJever
Отправлено: 14 Мая, 2011 - 18:52:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




1) <> так не кто не пишет пишите !=
2) Условия
PHP:
скопировать код в буфер обмена
  1. if(true) {
  2.  if(true) {
  3.    // тело условия
  4.  }
  5.  
  6. }

Можно переделать так

3) Как уже выше написали некогда не пишите с функциями mysql

или подобные. Это может дать очень полезную информацию для плохих людей
4) ну и повторяющиеся куски кода можно запихнуть в функцию. Например
PHP:
скопировать код в буфер обмена
  1. function loc($param = '') {
  2.          mysql_free_result($res8);
  3.          mysql_close;
  4.          header("Location: http://".$_SERVER['HTTP_HOST'].$param);
  5.          exit;
  6. }
  7. // и затем место этих 4 строк вызывать только loc() или loc('login.php');


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Advinno
Отправлено: 14 Мая, 2011 - 19:12:51
Post Id


Новичок


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


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




Спасибо. Все учту.
А есть какие-то грубые ошибки кроме "or die(mysql_error())", которые снижают безопасность?
 
 Top
destus
Отправлено: 14 Мая, 2011 - 19:42:34
Post Id


Гость


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


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




mysql_connect("localhost","MySQL_login","11111") or die(mysql_error());
mysql_select_db("My_db") or die(mysql_error());

лучше в отдельный файл запихнуть и через require_once подключать. Почти в каждом скрипте это будет использоваться, т.е. если название базы изменится, придется в каждом файле менять.
 
 Top
sergtka4ov
Отправлено: 14 Мая, 2011 - 23:56:20
Post Id



Новичок


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


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

[+]


molchun201 пишет:
4. Недавно услышал на (IRBIS_team) что закрывать PHP код ?> не нужно, во избежании внедрения всяких гадостей в код


Не кажется ли это бредом?
Лично у меня не закрытый ?> вызвал Parse error: syntax error, unexpected '<' in .....\index.php on line 20
 
 Top
molchun201
Отправлено: 15 Мая, 2011 - 00:11:46
Post Id



Посетитель


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


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




sergtka4ov подразумевается что после кода ничего другого уже не будет!
А у меня предчуствие что у Вас там html или js или ненароком 2-ой кусок php кода


-----
Обрамляйте код тегами и читайте
 
 Top
Мелкий Супермодератор
Отправлено: 15 Мая, 2011 - 00:12:38
Post Id



Активный участник


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


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




sergtka4ov, ну важно понимать, где закрывать, а где - нет.

синтаксически корректен и используется разработчиками фреймворков, как минимум.

Advinno, а зачем пароль обрезаете? Всё равно же хэшируете.
Валидность логина - лучше использовать регулярку, и читается легче и дополнительные символы проще прописывать. И быстрее будет.
Строки 6-16 достаточно 1 запроса, SQL-функции даты и времени в помощь http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]e-functions[dot]html


-----
PostgreSQL DBA
 
 Top
sergtka4ov
Отправлено: 15 Мая, 2011 - 00:14:14
Post Id



Новичок


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


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

[+]


molchun201 пишет:
sergtka4ov подразумевается что после кода ничего другого уже не будет!
А у меня предчуствие что у Вас там html или js или ненароком 2-ой кусок php кода


Точно так и есть, далее HTML и опять вставки php и тд.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Наработки по собственным проектам »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB