|
|
|
| для входа в "личный кабинет" использую сессии и куки, кусок кода:
<?
$_SESSION['mail10'] = $_COOKIE['mail']; /* куки уже есть в браузере */
$_SESSION['password10'] = $_COOKIE['password']; /* зашифрованный пароль(эта кука тоже есть в браузере) */
$mail = $_SESSION['mail10']; /* email человека */
$password = $_SESSION['password10']; /* пароль человека(защифрованный) */
$password = deshifr($password); /* расшифровываем пароль */
$rb = mysql_query("SELECT * FROM users WHERE mail='$mail' AND password='$password'");
$gt = mysql_fetch_array($rb);
echo $gt['name']; /* по идеи должно вывестесь имя, но не выводит */
?>
|
искал причину почему не выводит:
<?
/* выводил на экран расшифрованный пароль, чтоб убедиться, что он расшифрован */
$password = deshifr($password); /* расшифровываем пароль */
echo $password; /* выводит 12345(Все верно) */
/* дальше проверял на истину запросы */
$rb = mysql_query("SELECT * FROM users WHERE mail='$mail' AND password='$password'");
if($rb) echo 1; else echo 0; /* выводит истину */
$gt = mysql_fetch_array($rb);
if($gt) echo 1; else echo 0; /* выводит ложь */
Проблема решилась как только в запрос mysql_query за место password='$password' ввел password='12345'
И вот тут вообще стало непонятно почему так происходит. На экране выводится нормальный расшифрованный пароль (12345),
а в запрос видимо отправляется не 12345, но если напрямую в запросе написать 12345, то все окей :)
?>
|
скрипт шифрования взял с сайта http://www.indexsite.ru/index.php?dir=help&post_dir=php_secury&file=4.htm
<?
function shifr($source)
{
$key = "q48vjdn5k3";
// Открывает модуль и создаёт IV
$td = mcrypt_module_open ('des', '', 'ecb', '');
$key = substr ($key, 0, mcrypt_enc_get_key_size ($td));
$iv_size = mcrypt_enc_get_iv_size ($td);
$iv = mcrypt_create_iv ($iv_size, MCRYPT_RAND);
// Инициализирует дескриптор шифрования и шифруем
if (mcrypt_generic_init ($td, $key, $iv) != -1)
{
$s = mcrypt_generic($td, $source);
mcrypt_generic_deinit ($td);
mcrypt_module_close ($td);
}
return $s;
}
function deshifr($source)
{
$key = "q48vjdn5k3";
// Открывает модуль и создаёт IV
$td = mcrypt_module_open ('des', '', 'ecb', '');
$key = substr ($key, 0, mcrypt_enc_get_key_size ($td));
$iv_size = mcrypt_enc_get_iv_size ($td);
$iv = mcrypt_create_iv ($iv_size, MCRYPT_RAND);
// Инициализирует дескриптор шифрования и дешифруем
if (mcrypt_generic_init ($td, $key, $iv) != -1)
{
$s = mdecrypt_generic ($td, $source);
mcrypt_generic_deinit ($td);
mcrypt_module_close ($td);
}
return $s;
}
?>
|
| |
|
|
|
|
|
|
|
для: ladan
(10.01.2012 в 13:41)
| |
<?php
//перепишите это
$rb = mysql_query("SELECT * FROM users WHERE mail='$mail' AND password='$password'");
// на вот это, так будет легче контролировать, что попадает в запрос
$query = "SELECT * FROM `users` WHERE `mail` = '".$mail."' AND `password` = '".$password."'";
echo $query; // видите, что попадает в запрос
$rb = mysql_query($query);
|
проблема у Вас скорей всего в кавычках password='$password' | |
|
|
|
|
|
|
|
для: Slo_Nik
(10.01.2012 в 13:46)
| |
<?
$query = "SELECT * FROM `users` WHERE `mail` = '".$mail."' AND password='".$password."'";
echo $query; // выводит SELECT * FROM `users` WHERE `mail` = 'ana@ana.ru' AND password='12345'
$rb = mysql_query($query);
$rr = mysql_fetch_array($rb); /* опять с косяками.. */
echo $rr['name']; /* и ничего не выводит */
?>
|
<?
$query = "SELECT * FROM `users` WHERE `mail` = '".$mail."' AND password='12345'";
echo $query; // выводит тоже самое SELECT * FROM `users` WHERE `mail` = 'ana@ana.ru' AND password='12345'
$rb = mysql_query($query);
$rr = mysql_fetch_array($rb); /* успех */
echo $rr['name']; /* выводит имя Таня */
?>
|
делал рестарт сервера и все также. какой-то баг | |
|
|
|
|
|
|
|
для: ladan
(10.01.2012 в 14:00)
| | Так не понятно, работает или нет?
Если нет, то...
<?php
/* первое и главное */
error_reporting(E_ALL);
$query = "SELECT * FROM `users` WHERE `mail` = '".$mail."' AND password='12345'";
echo $query; // выводит тоже самое SELECT * FROM `users` WHERE `mail` = 'ana@ana.ru' AND password='12345'
$rb = mysql_query($query);
/* проверяем, выполняется запрос или нет? */
if(!$rb) echo "Ошибка № 1".mysql_error();
$rr = mysql_fetch_array($rb); /* успех */
echo $rr['name']; /* выводит имя Таня */
?>
|
Да, и ещё, в каком виде пароль хранится в Базе Данных? | |
|
|
|
|
|
|
|
для: Slo_Nik
(10.01.2012 в 14:36)
| | не работает :) Запрос выполняется, ошибок нет, а вот mysql_fetch_array ни в какую не хочет нормально работать
<?
$pas = $_COOKIE['password'];
$pas = deshifr($pas);
error_reporting(E_ALL);
$query = "SELECT * FROM `users` WHERE `mail` = 'ana@ana.ru' AND password='$pas'";
$rb = mysql_query($query);
if(!$rb) echo "Ошибка № 1".mysql_error();
$rr = mysql_fetch_array($rb); /* false */
echo $rr['name']; /*пустота */
?>
|
Не думаю что с ковычками что-то связано... Пароль varchar, хванится текстом- 12345
Наверно шифровальщик такой | |
|
|
|
|
|
|
|
для: ladan
(10.01.2012 в 14:55)
| | вообще то правильно хранить пароль в базе в зашифрованном виде, он не должен быть известен ни кому, кроме владельца...
проверьте данные в базе, что бы они совпадали с теми, что Вы вводите.
Если нет совпадения, то нет результата
и error_reporting() должна быть самой первой строкой кода, сразу за <?php | |
|
|
|
|
|
|
|
для: Slo_Nik
(10.01.2012 в 15:15)
| | ну я один владелец, доступ к бд только у меня:) А так конечно пароль в бд совпадает с тем что ввожу, но mysql_fetch_array не хочет принимать "такой расшифрованный" пароль | |
|
|
|
|
|
|
|
для: ladan
(10.01.2012 в 14:55)
| | нашел хороший шифровальщик http://www.softtime.ru/bookphp/gl8_2.php
<?
Шифрование
Применить шифрование к cookies можно разными способами, рассмотрим один из них:
<?
// создаем вектор начального состояния для шифрования
$vector = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_CAST_256,
MCRYPT_MODE_CFB), MCRYPT_RAND);
$key = "qwe233jk312jx813893xk312"; // ключ для расшифрования
$cook_name = "maks";
$cipher = mcrypt_encrypt(MCRYPT_CAST_256, $key, $cook_name,
MCRYPT_MODE_CFB, $vector);
setcookie("username", $cipher, "/decrypt.php");
?>
Как видно из листинга 10.13, расшифровка cookie проводится при помощи скрипта decrypt.php, код которого приведен ниже:
<?
// вектор начального состояния остается неизменным
$vector = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_CAST_256,
MCRYPT_MODE_CFB), MCRYPT_RAND);
$key = "qwe233jk312jx813893xk312";
$decrypt_name = mcrypt_ decrypt(MCRYPT_CAST_256, $key, $username,
MCRYPT_MODE_CFB, $vector);
echo("$decrypt_name, мы рады видеть вас на нашей страничке!");
?>
?>
|
Пока что разбираюсь в нем, сделал так. Пароль шифрует, но не расшифровывает
<?
// создаем вектор начального состояния для шифрования
$vector = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_CAST_256,
MCRYPT_MODE_CFB), MCRYPT_RAND);
$key = "qwe233jk312jx813893xk312"; // ключ для расшифрования
$password = "12345";
$pass_shifr = mcrypt_encrypt(MCRYPT_CAST_256, $key, $password,
MCRYPT_MODE_CFB, $vector);
echo $pass_shifr."<br><br>"; /* выводит зашифрованный пароль */
// вектор начального состояния остается неизменным
$vector = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_CAST_256,
MCRYPT_MODE_CFB), MCRYPT_RAND);
$key = "qwe233jk312jx813893xk312";
$pass_deshifr = mcrypt_decrypt(MCRYPT_CAST_256, $key, $pass_shifr,
MCRYPT_MODE_CFB, $vector);
echo $pass_deshifr; /* выводит карякули */
?>
|
И это нормально, что при каждой перезагрузке он каждый раз по разному шифруется? | |
|
|
|
|
|
|
|
для: ladan
(10.01.2012 в 15:15)
| | уже получилось расшифровать, но без - $vector в mcrypt
<?
$key = "qwe233jk312jx813893xk312"; // ключ для расшифрования
$password = "12345";
$pass_shifr = mcrypt_encrypt(MCRYPT_CAST_256, $key, $password,
MCRYPT_MODE_CFB);
echo $pass_shifr."<br><br>";
$key = "qwe233jk312jx813893xk312";
$pass_deshifr = mcrypt_decrypt(MCRYPT_CAST_256, $key, $pass_shifr,
MCRYPT_MODE_CFB);
echo $pass_deshifr;
?>
при перезагрузке шифрованный пароль не меняется, но выдается предупреждение
Warning: mcrypt_encrypt() [function.mcrypt-encrypt]: Attempt to use an empty IV, which is NOT recommend
а с вектором не удается расшифровать (
|
| |
|
|
|
|
|
|
|
для: ladan
(10.01.2012 в 15:35)
| | попробуйте получить данные из базы без всякой шифровки.
если всё пройдёт нормально, то дело в функции шифрования и тогда будете знать где искать причину | |
|
|
|
|
|
|
|
для: Slo_Nik
(10.01.2012 в 15:39)
| | делал так, все нормально проходит, функция шифрования такая значит :) Вот сейчас проблема с вектором(сообщение выше) | |
|
|
|
|
|
|
|
для: ladan
(10.01.2012 в 15:46)
| | все, разобрался с вектором
<?
$size = mcrypt_get_iv_size (MCRYPT_CAST_256, MCRYPT_MODE_CFB);
$iv = mcrypt_create_iv ($size, MCRYPT_DEV_RANDOM);
$key = "qwe233jk312jx813893xk312"; // ключ для расшифрования
$password = "12345";
$pass_shifr = mcrypt_encrypt(MCRYPT_CAST_256, $key, $password,
MCRYPT_MODE_CFB, $iv);
echo $pass_shifr."<br><br>";
$key = "qwe233jk312jx813893xk312";
$pass_deshifr = mcrypt_decrypt(MCRYPT_CAST_256, $key, $pass_shifr,
MCRYPT_MODE_CFB, $iv);
echo $pass_deshifr;
?>
выводит рандомный шифрованный пароль и расшифровывает в то что надо :)
|
| |
|
|
|
|
|
|
|
для: ladan
(10.01.2012 в 15:55)
| | из статьи http://www.softtime.ru/bookphp/gl8_2.php
там в шифровании указан такой вектор
<?
$vector = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_CAST_256,
MCRYPT_MODE_CFB), MCRYPT_RAND);
?>
|
не буду говорить, что это неправильно, но пароль не расшифровывался
поменял на
<?
$vector = mcrypt_create_iv (mcrypt_get_iv_size (MCRYPT_CAST_256, MCRYPT_MODE_CFB), MCRYPT_DEV_RANDOM);
?>
|
и сейчас вот расшифровался. | |
|
|
|
|
|
|
|
для: ladan
(10.01.2012 в 16:00)
| | а нет, извиняюсь, все правильно из статьи софттайм, это я косячил | |
|
|
|
|
|
|
|
для: ladan
(10.01.2012 в 16:06)
| | все, данные из бд выводит!!!!!!! Косячный шифровальщик был, софт тайм рулит )) | |
|
|
|
|
|
|
|
для: ladan
(10.01.2012 в 16:15)
| | вообщем весь день убил на то, чтоб понять почему в запрос отправляется неверная расшифрованная инфа.
Оптимальное решение, это скрипт, что приводил в самом первом сообщении, он рабочий, но оказывается, если длина шифруемого текста меньше чем 8 символов, то расшифрованные данные не пойдут для запроса бд.. вообще бред.
Может быть из-за этого алгоритма $td = mcrypt_module_open ('des', '', 'ecb', '');? | |
|
|
|
|