PHP, MySQL и хеширование
9 декабря 2013, 22:42
Автор: vladandk
Поставил у себя Апач, PHP и MySQL. Создал таблицу с полями name и pass. Вписал в таблицу имя и пароль зашифрованный MD5. Создал php-файл, который активирует фрейм авторизации и, обращаясь к вышеозначенной таблице, сравнивает хеш из таблицы и хеш полученный преобразованием пароля введенного во фрейм, ну и имена конечно. Ввожу имя и пароль в этот фрейм а эта стволочь непускает меня на мою страничку администрирования моего собственного сайта на моем же компе. Что только не перепробовал не пущат и все тут. Помогите кто может, а то сами мы не местные)).
Код php-файла активирующего фрейм авторизации:
код SQL-запроса на создание таблицы и вписания в нее имени и зашифрованного пароля:
Для выявления проблем создал проверочный файл с кодом:
Результат вышеописанного кода:
9ad1653204012265d4e12daeed5ea4cc
9ad1653204012265d4e12daeed5ea4cc
1
Как видите, вывод ошибок SQL-запроса отсутствует а хеши абсолютно эдентичны. И тем не менее, после очередного ввода имени и пароля, возвращается фрейм авторизации. Спецы, пожалуйста подскажите, что не так?
Код 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();
}
}
?>
// Выставляем уровень обработки ошибок
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'));
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();
?>
// Подключаем 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-запроса отсутствует а хеши абсолютно эдентичны. И тем не менее, после очередного ввода имени и пароля, возвращается фрейм авторизации. Спецы, пожалуйста подскажите, что не так?