|
|
|
| Здравствуйте,
Очень долго пытаюсь понять, какая ошибка содержится в моём коде, но никак не получается её решить, поэтому обращаюсь к более знающим людям чем я, к Вам.
Начну сразу с описания проблемы. А связана она с шифрованием cookies для формы авторизации. Работает следующим образом:
1. Пользователь вводит данные: логин и пароль;
2. Обработчик проверяет введённые данные, сверяет их на соответствие в БД и если всё успешно, то шифрует данные для cookies (логин, пароль и ранг, который берёт из БД) и создаёт эти самые cookies.
Код обработчика следующий:
<?
// Проверка на безопасность полученных данных
$login = mysql_escape_string(htmlspecialchars(substr($_POST['login'],0,15)));
$password = mysql_escape_string(htmlspecialchars(substr($_POST['password'],0,32)));
$password = md5($password);
$loginsql = mysql_query("SELECT login, password, active, deleted, rang FROM USERS WHERE login='".$login."' AND password='".$password."'");
// Проверяем на наличия такого пользователя в базе данных
if(mysql_num_rows($loginsql))
{
// Проверяем пользователя на активность
$loginbase = mysql_fetch_row($loginsql);
if($loginbase[2] == "0")
{
echo "<html><head><META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'></head><body><script>alert('".$loginblock1."');</script></body></html>";
exit;
}
if($loginbase[3] == "0")
{
echo "<html><head><META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'></head><body><script>alert('".$loginblock2."');</script></body></html>";
exit;
}
// Шифруем COOKIES
$key = "23157fd9d8b3dbe0ef642870eb00bdbd";
$login = @mcrypt_encrypt(MCRYPT_CAST_256, $key, $login, MCRYPT_MODE_CFB);
$password = @mcrypt_encrypt(MCRYPT_CAST_256, $key, $password, MCRYPT_MODE_CFB);
$rang = @mcrypt_encrypt(MCRYPT_CAST_256, $key, $loginbase[4], MCRYPT_MODE_CFB);
setcookie("id", $login, time()+24*3600*14);
setcookie("password", $password, time()+24*3600*14);
setcookie("rang", $rang, time()+24*3600*14);
header("location:index.php");
exit;
}
else
{
echo "<html><head><META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'></head><body><script>alert('".$loginblock0."');</script></body></html>";
}
?>
|
3. В конце обработчик перенаправляет пользователя на главную страницу, где вместо формы авторизации уже выводится закрытое меню. Вывод этого меню осуществляется через функцию, код которой представлен ниже:
<?
function autorizedform($auto, $cpanelblock)
{
$auto = unserialize($auto);
// Определяем наличие необходимых COOKIE
if(isset($_COOKIE["id"]) AND isset($_COOKIE["password"]) AND isset($_COOKIE["rang"]))
{
// Проверка на безопасность полученных данных
/*
$login = mysql_escape_string(htmlspecialchars($_COOKIE["id"]));
$password = mysql_escape_string(htmlspecialchars($_COOKIE["password"]));
$rang = mysql_escape_string(htmlspecialchars($_COOKIE["rang"]));
*/
// Расшифровка COOKIES
$key = "23157fd9d8b3dbe0ef642870eb00bdbd";
$login = @mcrypt_decrypt(MCRYPT_CAST_256, $key, $login, MCRYPT_MODE_CFB);
$password = @mcrypt_decrypt(MCRYPT_CAST_256, $key, $password, MCRYPT_MODE_CFB);
$rang = @mcrypt_decrypt(MCRYPT_CAST_256, $key, $rang, MCRYPT_MODE_CFB);
$loginsql = mysql_query("SELECT login, password, rang FROM USERS WHERE login='".$login."' AND password='".$password."' AND rang='".$rang."'");
// Проверяем на наличия такого пользователя в базе данных
if(mysql_num_rows($loginsql))
{
// Выводим CSB
$cpanelblock = unserialize($cpanelblock);
require_once("temp/cpanel.tpl");
}
else
{
// Выводим сообщение о попытке взлома
echo "<html><head><META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'></head><body><script>alert('".$message."');</script></body></html>";
}
}
else
{
// Выводим форму авторизации
require_once("temp/login.tpl");
}
}
?>
|
4. Вроде всё верно, но вот почему-то вместо открытия закрытого меню вечно вылетает сообщение о попытке взлома. Позже выяснил, что пароль (хэш md5) расшифровывается не совсем корректно и в браузере половина хэша отображается правильно. а половина различными символами. И вследствии этого функция проверки на валидность cookies работает неверно.
Очень бы хотелось узнать, где я допустил ошибку и как мне её исправить.
Заранее большое спасибо, надежда только на Вас. | |
|
|
|
|
|
|
|
для: Desh
(01.08.2008 в 20:16)
| | Никто не знает?( | |
|
|
|
|
|
|
|
для: Desh
(02.08.2008 в 10:41)
| | Не могу понять что тут у Вас:
<?php
# ...
// Расшифровка COOKIES
$key = "23157fd9d8b3dbe0ef642870eb00bdbd";
$login = @mcrypt_decrypt(MCRYPT_CAST_256, $key, $login, MCRYPT_MODE_CFB);
$password = @mcrypt_decrypt(MCRYPT_CAST_256, $key, $password, MCRYPT_MODE_CFB);
$rang = @mcrypt_decrypt(MCRYPT_CAST_256, $key, $rang, MCRYPT_MODE_CFB);
# ...
?>
|
Данные нужно получать из $_COOKIE, а у Вас они откуда? $login, $password, $rang не определены.
И вот тут:
> setcookie("id", $login, time()+24*3600*14);
Вас самого не сбивает с толку это? | |
|
|
|
|
|
|
|
для: BinLaden
(02.08.2008 в 13:27)
| | Там при расшифровке выше в комментариях написано присваивание значений COOKIES в $login, $password, $rang соответственно, не так вставил, на деле они не заключены в комментарии, сейчас откорректировать уже форум не даёт. | |
|
|
|
|
|
|
|
для: Desh
(02.08.2008 в 13:32)
| | А зачем Вы зашифрованные данные рушите функциями htmlspecialchars() и mysql_escape_string()? | |
|
|
|
|
|
|
|
для: BinLaden
(02.08.2008 в 13:57)
| | Работал с ними, когда не делал зашифровку, да так и оставил, казалось, что лишней такая проверка не будет. Сейчас убрал - заработало как надо) Спасибо большое, а то так бы и не доглядел) | |
|
|
|
|