PHP.SU

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

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

> Найдено сообщений: 6
Advinno Отправлено: 17 Мая, 2011 - 17:07:01 • Тема: Написал авторизацию на PHP • Форум: Наработки по собственным проектам

Ответов: 16
Просмотров: 6933
Кто еще не высказался, отпишитесь, пожалуйста. Важен голос каждого.
Advinno Отправлено: 15 Мая, 2011 - 15:21:40 • Тема: Написал авторизацию на PHP • Форум: Наработки по собственным проектам

Ответов: 16
Просмотров: 6933
Мелкий пишет:
а зачем пароль обрезаете? Всё равно же хэшируете.

Да просто для порядка. Можно и не обрезать.

Мелкий пишет:
Валидность логина - лучше использовать регулярку

Согласен. Но есть одно НО. Наслушался на форумах, что если не правильно составить это выражение, то можно поплатиться. А я, как упоминал выше, опыта в этом вопросе не имею. Перестраховался и сделал наглядно.

Мелкий пишет:
Строки 6-16 достаточно 1 запроса

Точно. Переделал. Стало красиво.

Спасибо за комментарии.
Advinno Отправлено: 14 Мая, 2011 - 19:12:51 • Тема: Написал авторизацию на PHP • Форум: Наработки по собственным проектам

Ответов: 16
Просмотров: 6933
Спасибо. Все учту.
А есть какие-то грубые ошибки кроме "or die(mysql_error())", которые снижают безопасность?
Advinno Отправлено: 14 Мая, 2011 - 18:03:11 • Тема: Написал авторизацию на PHP • Форум: Наработки по собственным проектам

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


Согласен, что до идеала далеко. Для начинающего не плохо.
Можете дать конкретные рекомендации? Был бы очень признателен.
Advinno Отправлено: 14 Мая, 2011 - 17:41:08 • Тема: Написал авторизацию на PHP • Форум: Наработки по собственным проектам

Ответов: 16
Просмотров: 6933
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(), лучше использовать на моменте дебага, но когда уже реально начинаешь юзать код, то их убрать из кода, чтобы в случае чего не дать лишней информации злоумышленнику


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

Еще комментарии есть?
Advinno Отправлено: 14 Мая, 2011 - 11:24:15 • Тема: Написал авторизацию на PHP • Форум: Наработки по собственным проектам

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

Файл 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>

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB