Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Очените безопасность скрипта
 
 автор: NIK   (23.11.2006 в 16:35)   письмо автору
 
 

когда впервые потребовалась система авторизации юзеров сайта, прочит пару статеек и написал свой код. Особо о безопасности не думал, ибо особо этого не требовалось :)

Вообщем начну с того, когда пользователь регистрируется. Заполняет форму, всё как обычно. В обработчике проверяю на ошибки, создаю MD5 хеш пароля и всё это дело в БД.

Далее сам процесс авторизации. 2 варианта - при помощи cookies и сессий. Смысл один - создается 5 сессий/кукисов. Код:


if (empty($_POST['login_action'])) {
    echo "<form action='auth.php' method='post' name='auth_page'>
          <input class='text' type='text' name='login' value='Логин' onClick=document.auth_page.login.value='' style='width: 100px; height: 18px; margin-bottom: 1px; margin-left: 15px;'> <br>
          <input class='text' type='text' name='password' value='Пароль' onClick=document.auth_page.password.value='' style='width: 100px; height: 18px; margin-bottom: 2px; margin-left: 15px;'> <br>
          <input class='submit' type='submit' value='Вход' style='width: 65px; height: 20px; margin-left: 15px;'> <br>
          <input type='checkbox' name='cookies' value='true' style='margin-top: 6px; margin-bottom: 0px; margin-left: 15px;'><small><u><b>Запомнить</b></u></small>
          <input type='hidden' name='login_action' value='true'>
         </form>";
  } else {
    $form_login = $_POST['login'];
    $form_password = $_POST['password'];
    $form_password = strtoupper(md5($form_password));
    $query = mysql_query("SELECT * FROM users WHERE login = '$form_login' AND active = 'show'");
    $user_query = mysql_fetch_array($query);

    # Проверяем, ввёл ли посетитель логин
    if (empty($form_login)) {
      $error = $error."<li type='square'><b>Вы не ввели логин</b> <br>";
    }
    # Проверяем, ввёл ли посетитель пароль
    if (empty($form_password)) {
      $error = $error."<li type='square'><b>Вы не ввели пароль</b> <br>";
    }

    if (empty($error)) { // если посетитель всё ввёл, проверяем логин и пароль
      # Проверяем правильность логина и пароля
      if ($form_login != $user_query['login'] OR $form_password != $user_query['password_md5']) {
        $login_error = $login_error."<li type='square'><b>Неверный логин или пароль</b> <br>";
      }
      if (empty($login_error)) {
        $id = $user_query['id'];
        $nick = $user_query['nick'];
        $login = $user_query['login'];
        $password = $user_query['password_md5'];
        $_SESSION['network_creative_user'] = "true"; // регистрируем сеанс, говорящий о том, что пользователь авторизован
        $_SESSION['network_creative_user_nick'] = "$nick"; // регистрируем сеанс с ником пользователя
        $_SESSION['network_creative_user_login'] = "$login"; // регистрируем сеанс с логином
        $_SESSION['network_creative_user_password'] = "$password"; // регистрируем сеанс с паролем
        $_SESSION['network_creative_user_id'] = "$id"; // регистрируем сеанс с id пользователся

        # Проверяем, поставил ли посетитель галку 'Запомнить'
        # Если пользователя нужно запомнить, перемещаемся на странцу cookies.php
        # с id пользователя, чтобы создать cookies
        # Если пользователя запоминать не нужно, сообщаем что всё в порядке и
        # перемещаем его на главную страницу
        if ($_POST['cookies'] == "true") {
          Redirect("cookies.php?id=$id", 0);
        } else {
          echo "Вы успешно вошли как автор <b><u>$nick</u></b>, под логином <b><u>$login</u></b>. В течении 5 секунд вы будете перемещены на <a href='index.php'><b>Главную страницу</b></a> сайта.";
          Redirect("index.php", 5);
        }
      } else {
        echo $login_error;  // выводим ошибки неверного логина/пароля, если они есть
      }
    } else {
      echo $error; // выводим сообщения, если пользователь не ввёл логин/пароль
    }
  }


Ну и собственно как в дальнейшем на сайте определяется, авторизован ли юзер


# Этот блок кода определяет, авторизован ли пользователь
if (empty($_SESSION['network_creative_user'])) {
  $user = "Неизвестный автор";
  $auth_string = "<a href='auth.php'><u>[ войти ]</u></a>";
  $access = "deny";
  if (!empty($_COOKIE['network_creative_user'])) {
    $id = $_COOKIE['network_creative_user_id'];
    $nick = $_COOKIE['network_creative_user_nick'];
    $user = "<a href='profile.php?user=$id'>$nick</a>";
    $auth_string = "<a href='quit.php'><u>[ выйти ]</u></a>";
    $access = "allow";
  }
} else {
  $id = $_SESSION['network_creative_user_id'];
  $nick = $_SESSION['network_creative_user_nick'];
  $user = "<a href='profile.php?user=$id'>$nick</a>";
  $auth_string = "<a href='quit.php'><u>[ выйти ]</u></a>";
  $access = "allow";
}


Вот и всё. Сейчас снова нужно написать систему авторизации, но подход уже более серьёзный. Можно ли использовать такой скрипт?

PS: блин, думал пишу в PHP, а оказывается в разном, простите..

   
 
 автор: Loki   (23.11.2006 в 17:02)   письмо автору
 
   для: NIK   (23.11.2006 в 16:35)
 

В общем, полный кошмар, конечно.
Много, путано и дыряво (в силу первых двух причин).

Проверьте, при каких условиях у вас выполнится этот фрагмент?
<?
    $form_password 
$_POST['password']; 
    
$form_password strtoupper(md5($form_password)); 
... 
    
# Проверяем, ввёл ли посетитель пароль 
    
if (empty($form_password)) { 
      
$error $error."<li type='square'><b>Вы не ввели пароль</b> <br>"

БД скармливаете пользовательские данные безо вской проверки.
Больше всего мне, конечно, понравилось то, что авторизоваться можно подсунув скрипту абсолютно любую куку.
Короче, не дай бог иметь подобный кошмар на своем ресурсе.

   
 
 автор: NIK   (23.11.2006 в 17:54)   письмо автору
 
   для: Loki   (23.11.2006 в 17:02)
 

понятно, я примерно такое же себе и представлял :)

тогда может кто посоветует грамотную статью как безопасно создать авторизацию (кроме тех что на этом сайте)?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования