Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

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

 

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

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

тема: Расшифровывает неверно
 
 автор: Desh   (01.08.2008 в 20:16)   письмо автору
 
 

Здравствуйте,

Очень долго пытаюсь понять, какая ошибка содержится в моём коде, но никак не получается её решить, поэтому обращаюсь к более знающим людям чем я, к Вам.

Начну сразу с описания проблемы. А связана она с шифрованием 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$loginMCRYPT_MODE_CFB);
$password = @mcrypt_encrypt(MCRYPT_CAST_256$key$passwordMCRYPT_MODE_CFB);
$rang = @mcrypt_encrypt(MCRYPT_CAST_256$key$loginbase[4], MCRYPT_MODE_CFB);

setcookie("id"$logintime()+24*3600*14);
setcookie("password"$passwordtime()+24*3600*14);
setcookie("rang"$rangtime()+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$loginMCRYPT_MODE_CFB);
$password = @mcrypt_decrypt(MCRYPT_CAST_256$key$passwordMCRYPT_MODE_CFB);
$rang = @mcrypt_decrypt(MCRYPT_CAST_256$key$rangMCRYPT_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   (02.08.2008 в 10:41)   письмо автору
 
   для: Desh   (01.08.2008 в 20:16)
 

Никто не знает?(

  Ответить  
 
 автор: BinLaden   (02.08.2008 в 13:27)   письмо автору
 
   для: Desh   (02.08.2008 в 10:41)
 

Не могу понять что тут у Вас:

<?php

# ...

// Расшифровка COOKIES 
$key "23157fd9d8b3dbe0ef642870eb00bdbd"
$login = @mcrypt_decrypt(MCRYPT_CAST_256$key$loginMCRYPT_MODE_CFB); 
$password = @mcrypt_decrypt(MCRYPT_CAST_256$key$passwordMCRYPT_MODE_CFB); 
$rang = @mcrypt_decrypt(MCRYPT_CAST_256$key$rangMCRYPT_MODE_CFB);

# ...

?>


Данные нужно получать из $_COOKIE, а у Вас они откуда? $login, $password, $rang не определены.

И вот тут:

> setcookie("id", $login, time()+24*3600*14);

Вас самого не сбивает с толку это?

  Ответить  
 
 автор: Desh   (02.08.2008 в 13:32)   письмо автору
 
   для: BinLaden   (02.08.2008 в 13:27)
 

Там при расшифровке выше в комментариях написано присваивание значений COOKIES в $login, $password, $rang соответственно, не так вставил, на деле они не заключены в комментарии, сейчас откорректировать уже форум не даёт.

  Ответить  
 
 автор: BinLaden   (02.08.2008 в 13:57)   письмо автору
 
   для: Desh   (02.08.2008 в 13:32)
 

А зачем Вы зашифрованные данные рушите функциями htmlspecialchars() и mysql_escape_string()?

  Ответить  
 
 автор: Desh   (02.08.2008 в 14:09)   письмо автору
 
   для: BinLaden   (02.08.2008 в 13:57)
 

Работал с ними, когда не делал зашифровку, да так и оставил, казалось, что лишней такая проверка не будет. Сейчас убрал - заработало как надо) Спасибо большое, а то так бы и не доглядел)

  Ответить  
Rambler's Top100
вверх

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