webew
Войти » Регистрация
 
PHP :: безопасность

PHP, MySQL и хеширование

9 декабря 2013, 22:42
Автор: vladandk
Поставил у себя Апач, PHP и MySQL. Создал таблицу с полями name и pass. Вписал в таблицу имя и пароль зашифрованный MD5. Создал php-файл, который активирует фрейм авторизации и, обращаясь к вышеозначенной таблице, сравнивает хеш из таблицы и хеш полученный преобразованием пароля введенного во фрейм, ну и имена конечно. Ввожу имя и пароль в этот фрейм а эта стволочь непускает меня на мою страничку администрирования моего собственного сайта на моем же компе. Что только не перепробовал не пущат и все тут. Помогите кто может, а то сами мы не местные)).

Код php-файла активирующего фрейм авторизации:

<?php
  // Выставляем уровень обработки ошибок
  error_reporting(E_ALL & ~E_NOTICE);

  // Если пользователь не авторизовался - авторизуемся
  if(!isset($_SERVER['PHP_AUTH_USER']) || (!empty($_GET['logout']) && $_SERVER['PHP_AUTH_USER'] == $_GET['logout']))
  {
    Header("WWW-Authenticate: Basic realm=\"Control Page\"");
    Header("HTTP/1.0 401 Unauthorized");
    exit();
  }
  else
  {
    // Утюжим переменные $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'],
    // чтобы мышь не проскочила
    if (!get_magic_quotes_gpc())
    {
      $_SERVER['PHP_AUTH_USER'] = mysql_escape_string($_SERVER['PHP_AUTH_USER']);
      $_SERVER['PHP_AUTH_PW']   = mysql_escape_string($_SERVER['PHP_AUTH_PW']);
    }
   
    $query = "SELECT * FROM $tbl_accounts
              WHERE name = '{$_SERVER['PHP_AUTH_USER']}';"
;
    $lst = @mysql_query($query);
    // Если ошибка в SQL-запросе - выдаём окно
    if(!$lst)
    {
      Header("WWW-Authenticate: Basic realm=\"Control Page\"");
      Header("HTTP/1.0 401 Unauthorized");
      exit();
    }
    // Если такого пользователя нет - выдаём окно
    if(mysql_num_rows($lst) == 0)
    {
      Header("WWW-Authenticate: Basic realm=\"Control Page\"");
      Header("HTTP/1.0 401 Unauthorized");
      exit();
    }
    // Если все проверки пройдены, сравниваем хэши паролей
    $account = @mysql_fetch_array($lst);
    if(md5($_SERVER['PHP_AUTH_PW']) != $account['pass'])
    {
      Header("WWW-Authenticate: Basic realm=\"Control Page\"");
      Header("HTTP/1.0 401 Unauthorized");
      exit();
    }
  }
?>


код SQL-запроса на создание таблицы и вписания в нее имени и зашифрованного пароля:

CREATE TABLE system_accounts (
  id_account int(11) NOT NULL auto_increment,
  `name` tinytext NOT NULL,
  pass tinytext NOT NULL,
  PRIMARY KEY  (id_account)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251;

INSERT INTO system_accounts VALUES(1, 'root', MD5('gj68rof'));


Для выявления проблем создал проверочный файл с кодом:

<?php

  // Подключаем SoftTime FrameWork
  require_once("config/class.config.php");
  // Устанавливаем соединение с базой данных
  require_once("config/config.php");

    $query = "SELECT * FROM $tbl_accounts;";  
    // $tbl_accounts - переменная, содержащая имя таблицы (в данном случае system_accounts),
    // инициированная в файле config.php

    $list = @mysql_query($query);
    $ar = @mysql_fetch_array($list);
    // Проверка, в случае удачи - строка зашифрованного пароля
    echo $ar['pass']."<BR>";
    // Тут же, для сравнения вывод зашифрованного пароля, идентичного     табличному                
    echo md5('gj68rof')."<BR>";  
   // Так, на всякий случай - количество строк в таблице      
    echo mysql_num_rows($list)."<BR>";
    // Если есть ошибки в SQL-запросе
    echo mysql_error();                            
?>


Результат вышеописанного кода:

9ad1653204012265d4e12daeed5ea4cc
9ad1653204012265d4e12daeed5ea4cc
1

Как видите, вывод ошибок SQL-запроса отсутствует а хеши абсолютно эдентичны. И тем не менее, после очередного ввода имени и пароля, возвращается фрейм авторизации. Спецы, пожалуйста подскажите, что не так?
Добавить комментарий
NO USERPIC

rgbeast

Вы нигде не сохраняете результат авторизации. $_SERVER['PHP_AUTH...'] есть только после непосредственного введения имени и пароля. Используйте переменные сессии, чтобы сохранить информацию о том, что юзер залогировался. Например, как в этом коменте http://www.php.net/manual/ru/features.http-auth.php#99348
10.12.2013, 00:38
Ответить
NO USERPIC

vladandk

Лишний раз убеждаюсь в том что для того чтобы найти ответ надо геморрой насиживать преимущественно самому. Порылся в книге, там черным по белому написано что глобальные переменные $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'] доступны только тогда, когда php подключен как модуль а не как cgi-приложение. Но здесь опять проблема - в книге написано что подключается php в качестве модуля с помощью файла httpd.konf путем редактирования строк:

AddType application/x-httpd-php phtml php
LoadModule php5_module c:/php/php5apache2.dll

С первой строкой нет проблем, а вот вторую в данном файле я не нашел. А при введении данной строки путем копирования и вставки Апач не хочет перезапускаться, выдает ошибку. Причем строку вставлял и в блоке подключения модулей и в блоке директив AddType и куда только не совал эту строку, результат - нулевой. Спецы помогите пожалуйста. Очень хочется сэкономить время и заняться php-кодом а не тратить его на подобный гимор.
11.12.2013, 22:06
Ответить
NO USERPIC

rgbeast

Судя по тому, что у вас скрипт печатает имя и пароль, авторизация работает. Подключение модуля см. подробно в статье http://sqlinfo.ru/articles/info/6.html - там очень важен путь к dll и какой именно dll выбран

Лучше откажитесь от PHP_AUTH и используйте переменные сесии для авторизации, а форму с логином и паролем напишите в HTML. Так в большинстве проектов реализовано.
12.12.2013, 00:06
Ответить
© 2008—2024 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: