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

Форум PHP

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

 

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

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

тема: непонятки с mysql_fetch_array
 
 автор: ladan   (10.01.2012 в 13:41)   письмо автору
 
 

для входа в "личный кабинет" использую сессии и куки, кусок кода:


<?
$_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 ($key0mcrypt_enc_get_key_size ($td));
 
$iv_size mcrypt_enc_get_iv_size ($td);
 
$iv mcrypt_create_iv ($iv_sizeMCRYPT_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 ($key0mcrypt_enc_get_key_size ($td));
 
$iv_size mcrypt_enc_get_iv_size ($td);
 
$iv mcrypt_create_iv ($iv_sizeMCRYPT_RAND);

 
// Инициализирует дескриптор шифрования и дешифруем
 
if (mcrypt_generic_init ($td$key$iv) != -1
 {
 
$s mdecrypt_generic ($td$source);
 
mcrypt_generic_deinit ($td);
 
mcrypt_module_close ($td);
 }
 return 
$s
 }


?>

  Ответить  
 
 автор: Slo_Nik   (10.01.2012 в 13:46)   письмо автору
 
   для: 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'

  Ответить  
 
 автор: ladan   (10.01.2012 в 14:00)   письмо автору
 
   для: 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']; /* выводит имя Таня */

?>




делал рестарт сервера и все также. какой-то баг

  Ответить  
 
 автор: Slo_Nik   (10.01.2012 в 14:36)   письмо автору
 
   для: 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']; /* выводит имя Таня */ 

?> 

Да, и ещё, в каком виде пароль хранится в Базе Данных?

  Ответить  
 
 автор: ladan   (10.01.2012 в 14:55)   письмо автору
 
   для: 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

Наверно шифровальщик такой

  Ответить  
 
 автор: Slo_Nik   (10.01.2012 в 15:15)   письмо автору
 
   для: ladan   (10.01.2012 в 14:55)
 

вообще то правильно хранить пароль в базе в зашифрованном виде, он не должен быть известен ни кому, кроме владельца...
проверьте данные в базе, что бы они совпадали с теми, что Вы вводите.
Если нет совпадения, то нет результата
и error_reporting() должна быть самой первой строкой кода, сразу за <?php

  Ответить  
 
 автор: ladan   (10.01.2012 в 15:17)   письмо автору
 
   для: Slo_Nik   (10.01.2012 в 15:15)
 

ну я один владелец, доступ к бд только у меня:) А так конечно пароль в бд совпадает с тем что ввожу, но mysql_fetch_array не хочет принимать "такой расшифрованный" пароль

  Ответить  
 
 автор: ladan   (10.01.2012 в 15:15)   письмо автору
 
   для: 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:35)   письмо автору
 
   для: 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

а с вектором не удается расшифровать (

  Ответить  
 
 автор: Slo_Nik   (10.01.2012 в 15:39)   письмо автору
 
   для: ladan   (10.01.2012 в 15:35)
 

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

  Ответить  
 
 автор: ladan   (10.01.2012 в 15:46)   письмо автору
 
   для: Slo_Nik   (10.01.2012 в 15:39)
 

делал так, все нормально проходит, функция шифрования такая значит :) Вот сейчас проблема с вектором(сообщение выше)

  Ответить  
 
 автор: ladan   (10.01.2012 в 15:55)   письмо автору
 
   для: ladan   (10.01.2012 в 15:46)
 

все, разобрался с вектором




<?

  $size 
mcrypt_get_iv_size (MCRYPT_CAST_256MCRYPT_MODE_CFB);
    
$iv mcrypt_create_iv ($sizeMCRYPT_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 в 16:00)   письмо автору
 
   для: 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_256MCRYPT_MODE_CFB), MCRYPT_DEV_RANDOM);

?>


и сейчас вот расшифровался.

  Ответить  
 
 автор: ladan   (10.01.2012 в 16:06)   письмо автору
 
   для: ladan   (10.01.2012 в 16:00)
 

а нет, извиняюсь, все правильно из статьи софттайм, это я косячил

  Ответить  
 
 автор: ladan   (10.01.2012 в 16:15)   письмо автору
 
   для: ladan   (10.01.2012 в 16:06)
 

все, данные из бд выводит!!!!!!! Косячный шифровальщик был, софт тайм рулит ))

  Ответить  
 
 автор: ladan   (10.01.2012 в 23:52)   письмо автору
 
   для: ladan   (10.01.2012 в 16:15)
 

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

Может быть из-за этого алгоритма $td = mcrypt_module_open ('des', '', 'ecb', '');?

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

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