Глюки с внесением строк в бд

Статус
Закрыто для дальнейших ответов.

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Сегодня заметил такой глюк, что допустим вносим в бд строку:
Код:
mysql_query("insert into `table` (`login`,`text`,`data`) ('".$_SESSION['login']."','$text','".time()."')");
то иногда на записывается логин в бд.. просто вообще в бд пустой логин.. и в чате или письмах вместо ссылки с ником пустота..
Всё перерыл - всё правильно перед вносом... и главное у меня с компа и с телефона норм вносится.. а у некоторых пользователей такие глюки...
в чем может быть проблема? Хотя бы предположения выскажите.. И вот так только с логинами.. с остальным вроде нормально...
Может это быть из-за того что я пишу $_SESSION['login']? может логин надо присвоить переменной?

А может быть из-за этого:
У меня в отдельном файле стоит проверка:
Код:
if(!isset($_SESSION['id'])){header('location: http://'.$_SERVER['HTTP_HOST'].'?mod=autorization');}
Дык вот они жмут Написать а сессия просрачивается и их переадресует на автологин.. но похоже код срабатывает дальше по отправке после переадресации и сообщение отправляется...
или я не знаю(
 

Serg@NT

Well-Known Member
Регистрация
20.02.2010
Сообщения
506
Ну, если у вас действительно стоит такой обработчик на существование сессии, то достаточно добавить exit(); после header(...), т.к. пользователя то перенаправляет на другую страницу, а сервер то продолжает исполнять код страницы до конца. Так что, ваше последнее предположение скорее всего верно.

ЗЫ: Можете проверить в Firefox. Авторизуйтесь, потом в меню Инструменты - Стереть недавнюю историю - Активные сеансы и куки. И пробуйте нажать Написать.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Ну, если у вас действительно стоит такой обработчик на существование сессии, то достаточно добавить exit(); после header(...), т.к. пользователя то перенаправляет на другую страницу, а сервер то продолжает исполнять код страницы до конца. Так что, ваше последнее предположение скорее всего верно.

ЗЫ: Можете проверить в Firefox. Авторизуйтесь, потом в меню Инструменты - Стереть недавнюю историю - Активные сеансы и куки. И пробуйте нажать Написать.
Попробовал так сделать.. нет, ничего не заносится, а просто переадресует на авторизацию:(
Может они жмут "отправить", потом на "остановку или паузу" и не до конца вносится как то? Но у меня не получается так сделать:(
Уже думал что может со временем сессий в htaccess что то не в порядке. Поставил строчки туда:
Код:
php_value session.gc_maxlifetime 10800
php_value session.cookie_lifetime 10800
Однако и это не помогло:(
 

marker

Well-Known Member
Регистрация
23.10.2010
Сообщения
399
По полочкам разложите все, что у вас вначале выполняется внесение в базу или переадресация на страницу логина.
Вы проверяете есть ли у него в сессии ключ login прежде чем добавлять в базу?
Вы не хотите использовать множество проверок, потому что считаете что так будет лучше или просто лень писать много буковок?
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Хорошо, распишу подробно ход действий:
Регистрация, присвоение в сессию логина и id, занесение этого всего так же и в куки.
config_users.php - отдельный файл, который подключается везде, где требуется сессия
Его содержимое:
Код:
//Проверяем сессию
if(!isset($_SESSION['id'])){header('location: http://'.$_SERVER['HTTP_HOST'].'?mod=autorization'); exit();}
//здесь ещё пара проверок на забаненность и ip, но это наверное писать не надо, т.к делается не через сессию
файл messages.php - отправление писем внутри сайта
Его содержимое:
Код:
include 'config_users.php'; //Подключаем файл, что бы проверить сессию и остальное
if(isset($_POST['go'])){
//Тут отправляем сообщение другому пользователю
mysql_query("INSERT INTO `messages` (`poluchatel`,`otpravitel`,`text`,`data`) VALUES('".$res['login']."','".$_SESSION['login']."','$text','".time()."')");
}
else{
//Иначе выводим форму для заполнения и кнопку отправить..
}
Ну вот так вот и есть принцип работы..
Вы проверяете есть ли у него в сессии ключ login прежде чем добавлять в базу?
Нет, не проверял. Обычно при авторизации я сразу заношу и id и login в сессию.. Или логин может пропасть из сессии, а id остаться? о.О
Вы не хотите использовать множество проверок, потому что считаете что так будет лучше или просто лень писать много буковок?
Нет, не лень. Просто стараюсь укоротить код и да, считаю что это будет лучше, хотя не понимаю чем это будет лучше.. На скорость вроде не сильно влияет..
 

medwoodu

Злобный модер
Регистрация
22.12.2005
Сообщения
1 418
Хорошо, распишу подробно ход действий:
Регистрация, присвоение в сессию логина и id, занесение этого всего так же и в куки.
config_users.php - отдельный файл, который подключается везде, где требуется сессия
Его содержимое:
Код:
//Проверяем сессию
if(!isset($_SESSION['id'])){header('location: http://'.$_SERVER['HTTP_HOST'].'?mod=autorization'); exit();}
//здесь ещё пара проверок на забаненность и ip, но это наверное писать не надо, т.к делается не через сессию
файл messages.php - отправление писем внутри сайта
Его содержимое:
Код:
include 'config_users.php'; //Подключаем файл, что бы проверить сессию и остальное
if(isset($_POST['go'])){
//Тут отправляем сообщение другому пользователю
mysql_query("INSERT INTO `messages` (`poluchatel`,`otpravitel`,`text`,`data`) VALUES('".$res['login']."','".$_SESSION['login']."','$text','".time()."')");
}
else{
//Иначе выводим форму для заполнения и кнопку отправить..
}
Ну вот так вот и есть принцип работы..
Вы проверяете есть ли у него в сессии ключ login прежде чем добавлять в базу?
Нет, не проверял. Обычно при авторизации я сразу заношу и id и login в сессию.. Или логин может пропасть из сессии, а id остаться? о.О
Вы не хотите использовать множество проверок, потому что считаете что так будет лучше или просто лень писать много буковок?
Нет, не лень. Просто стараюсь укоротить код и да, считаю что это будет лучше, хотя не понимаю чем это будет лучше.. На скорость вроде не сильно влияет..
empty для проверки id сессии используйте
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Хорошо, распишу подробно ход действий:
Регистрация, присвоение в сессию логина и id, занесение этого всего так же и в куки.
config_users.php - отдельный файл, который подключается везде, где требуется сессия
Его содержимое:
Код:
//Проверяем сессию
if(!isset($_SESSION['id'])){header('location: http://'.$_SERVER['HTTP_HOST'].'?mod=autorization'); exit();}
//здесь ещё пара проверок на забаненность и ip, но это наверное писать не надо, т.к делается не через сессию
файл messages.php - отправление писем внутри сайта
Его содержимое:
Код:
include 'config_users.php'; //Подключаем файл, что бы проверить сессию и остальное
if(isset($_POST['go'])){
//Тут отправляем сообщение другому пользователю
mysql_query("INSERT INTO `messages` (`poluchatel`,`otpravitel`,`text`,`data`) VALUES('".$res['login']."','".$_SESSION['login']."','$text','".time()."')");
}
else{
//Иначе выводим форму для заполнения и кнопку отправить..
}
Ну вот так вот и есть принцип работы..
Вы проверяете есть ли у него в сессии ключ login прежде чем добавлять в базу?
Нет, не проверял. Обычно при авторизации я сразу заношу и id и login в сессию.. Или логин может пропасть из сессии, а id остаться? о.О
Вы не хотите использовать множество проверок, потому что считаете что так будет лучше или просто лень писать много буковок?
Нет, не лень. Просто стараюсь укоротить код и да, считаю что это будет лучше, хотя не понимаю чем это будет лучше.. На скорость вроде не сильно влияет..
empty для проверки id сессии используйте
А в чем между ними разница? Вроде обе проверяют, установлена ли переменная..
 

marker

Well-Known Member
Регистрация
23.10.2010
Сообщения
399
Скрипт должен быть независим от существования и поддерживания браузером cookie,
для это следует использовать конструкции и условия.

Код:
$res['login']
Откуда это?
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Скрипт должен быть независим от существования и поддерживания браузером cookie,
для это следует использовать конструкции и условия.

Код:
$res['login']
Откуда это?
Ну пользователь перед отправкой письма же вводит логин получателя, так?
Вооот.. Я ищу его в бд, затем заношу логин этот в массив, если он конечно существует и вношу в новую таблицу логин получателя, свой логин, сообщение, дату...

У меня так и есть, насчет кук, в авторизации..
index.php

Код:
if($_GET['mod']=='autorization'){
//Проверяем, может через кнопку "войти" пытаются авторизоваться
if(isset($_POST['pass'],$_POST['login'])){
//Обрабатываем данные
//Делаем запрос в бд с логином и паролем
$nme=mysql_qwery("delect * from `tbl` where `login` ='$logn' and `pass`='$pass'");
if(mysql_num_rows($nme)==1) {$auto='';}
}
//Проверяем (может в куках есть пароль и ид_логин
elseif($_COOKIE['id'] && $_COOKIE['pass']){
$reg='/([^a-zA-Z0-9\_])/';
$id=intval($_COOKIE['id']);
$pass=preg_replace($reg,'', $_COOKIE['pass']);
$nme=mysql_qwery("delect * from `tbl` where `id` ='$id' and `pass`='$pass'");
if(mysql_num_rows($nme)==1) {$auto='';}
}
//Если не была нажата кнопка "войти" и нету кук (т.е сюда перешли через строку, то переводим на главную)
else{header('location: http://'.$_SERVER['HTTP_HOST']); exit();}
//Проверяем есть ли переменная (которая создается когда находится пользователь через куки или кнопку войти)
if(isset($auto)){
//Смотрим, поставил ли пользователь флажок на запомнить
if($_POST['save']){
$time=time()+(30*24*60*60);
setcookie('id',$nme['id'], $time);
setcookie('login',$nme['login'], $time);
setcookie('pass',$nme['pass'], $time);
setcookie('time',$time,$time);}
}
//Формируем массив из найденного выше
$nme = mysql_fetch_assoc($nme);
$_SESSION['id']= $nme['id'];
$_SESSION['login']= $nme['login'];
echo 'Вы успешно авторизованы!';
}
else{
echo 'Главная страница сайта, тут форма для входа (логин и пароль, флажок запомнить)';
}
Всё, вот так пользователь авторизуется на главной.
А на всех страницах подключаем файл config_users.php для проверки сессии и если сессии нету, то переадресуем сюда на авторизацию..
Извиняюсь за ошибки, писал "от руки"... копировать весь код не стал..
там проверки на ip,soft и прочее...
 

marker

Well-Known Member
Регистрация
23.10.2010
Сообщения
399
У меня нет слов, а вот это меня вообще вынесло
Код:
setcookie('pass',$nme['pass'], $time);
Подожди исправлю на что-нибудь не такое убогое.

Не это не исправить.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
У меня нет слов, а вот это меня вообще вынесло
Код:
setcookie('pass',$nme['pass'], $time);
Подожди исправлю на что-нибудь не такое убогое.

Не это не исправить.
Вопрос: А в чем не правильно у меня?
Код:
setcookie('pass',$nme['pass'], $time);
а это то чем не угодило? Создаем куку из данных пароля пользователя бд..
Блин, можно хоть комментировать свое мнение, когда говорите что это говнокод? Я приму это к сведениею и впредь не буду делать таких ошибок..
 

marker

Well-Known Member
Регистрация
23.10.2010
Сообщения
399
Куки хранятся в браузере, точнее в одном файлике, в открытом виде.
Если ты будешь складывать пароли в куки это будет рай для быдло-вирусов.
Складывай в бд IP SESSION ID, дату последнего входа и идентификатор пользователя если он зарегистрирован или 0 если гость,
действия и данные о посетителе\пользователе складывай в отдельную таблицу.
В куки не вставляй ни логин, ни пароль, ни какую-либо еще конфиденциальную информацию.

Будь мужиком изучай чужой код который хвалят множества людей,
например YI Framework, Zend (ну тут я думаю загнул слегка, это будет для тебя сложно),
сайты с открытым кодом написанные учитывая MVC ( Model - View - Controler , Модель - Представление - Контролер )
затем попробуй написать для этого сайта или на фреймворке, смотря что ты будешь изучать.
Желательно изучать YI, Bitrix, Drupal, все остальное не изучай, вроде Joomla - это убогое творение.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Куки хранятся в браузере, точнее в одном файлике, в открытом виде.
Если ты будешь складывать пароли в куки это будет рай для быдло-вирусов.
Складывай в бд IP SESSION ID, дату последнего входа и идентификатор пользователя если он зарегистрирован или 0 если гость,
действия и данные о посетителе\пользователе складывай в отдельную таблицу.
В куки не вставляй ни логин, ни пароль, ни какую-либо еще конфиденциальную информацию.

Будь мужиком изучай чужой код который хвалят множества людей,
например YI Framework, Zend (ну тут я думаю загнул слегка, это будет для тебя сложно),
сайты с открытым кодом написанные учитывая MVC ( Model - View - Controler , Модель - Представление - Контролер )
затем попробуй написать для этого сайта или на фреймворке, смотря что ты будешь изучать.
Желательно изучать YI, Bitrix, Drupal, все остальное не изучай, вроде Joomla - это убогое творение.
Действия и данные я сделал ещё раньше..
а как тогда производить авторизацию, если в куках не будет ни пароля ни логина?
человек не заходил неделю на сайт, потом вспомнил и зашел по закладке, например в чат... Нет ни сессии ни куки у нас с паролем и логином, ему выдаст что вы не авторизованы и он вообще забьет на сайт:(
 

marker

Well-Known Member
Регистрация
23.10.2010
Сообщения
399
Код:
setcookie('user_id', $user['id'], time() + 3600*3600, '/' )
setcookie('user_hash', md5( $user['login'] . $user['hash'] ), time() + 3600*3600, '/' );

select * from `users` where `id` = $_COOKIE['user_id']

if( ... and $_COOKIE['user_hash'] == md5( $row['login'] . $row['hash'] ) ){

$_SESSION['data'] = $row;

}
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
Код:
setcookie('user_id', $user['id'], time() + 3600*3600, '/' )
setcookie('user_hash', md5( $user['login'] . $user['hash'] ), time() + 3600*3600, '/' );

select * from `users` where `id` = $_COOKIE['user_id']

if( ... and $_COOKIE['user_hash'] == md5( $row['login'] . $row['hash'] ) ){

$_SESSION['data'] = $row;

}
А $user['hash'] во второй строчке это что? id последней сессии?
 

Serg@NT

Well-Known Member
Регистрация
20.02.2010
Сообщения
506
У меня нет слов, а вот это меня вообще вынесло
Код:
setcookie('pass',$nme['pass'], $time);
Подожди исправлю на что-нибудь не такое убогое.

Не это не исправить.
Вопрос: А в чем не правильно у меня?
Код:
setcookie('pass',$nme['pass'], $time);
а это то чем не угодило? Создаем куку из данных пароля пользователя бд..
Блин, можно хоть комментировать свое мнение, когда говорите что это говнокод? Я приму это к сведениею и впредь не буду делать таких ошибок..
Из-за возможности утекания куков куда-нибудь в нехорошие руки, хранить там пароль - последнее дело. Зайдёт человек с чужого компа, а сделующий за ним посмотрит куки в браузере и стырит пароль.
Я лично храню в базе md5(пароля), а в куках md5(md5(пароля)). Таким образом, даже заглянув в базу никто ничьи пароли не узнает, и то, что хранится в куках нельзя будет использовать для входа на сайт.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
У меня нет слов, а вот это меня вообще вынесло
Код:
setcookie('pass',$nme['pass'], $time);
Подожди исправлю на что-нибудь не такое убогое.

Не это не исправить.
Вопрос: А в чем не правильно у меня?
Код:
setcookie('pass',$nme['pass'], $time);
а это то чем не угодило? Создаем куку из данных пароля пользователя бд..
Блин, можно хоть комментировать свое мнение, когда говорите что это говнокод? Я приму это к сведениею и впредь не буду делать таких ошибок..
Из-за возможности утекания куков куда-нибудь в нехорошие руки, хранить там пароль - последнее дело. Зайдёт человек с чужого компа, а сделующий за ним посмотрит куки в браузере и стырит пароль.
Я лично храню в базе md5(пароля), а в куках md5(md5(пароля)). Таким образом, даже заглянув в базу никто ничьи пароли не узнает, и то, что хранится в куках нельзя будет использовать для входа на сайт.
Ага, понял! А что бы авторизоваться, то надо брать из бд id-логин, который в куках и если такой id найдется, то перевести пароль, который в бд ещё раз в md5 и сравнить с паролем в куках, который был два раза в md5? так?
 

marker

Well-Known Member
Регистрация
23.10.2010
Сообщения
399
да можешь так сделать но я не советую хранить пароль где бы то ни было, храни md5 хеш пароля

из пароля можно получить хеш но нельзя получить пароль из хеша, это как спросить что весит 5 кг, от это информации невозможно понять так как существует неограниченное множество вариантов.

структура таблицы примерно такая

id - integer(21) - 1
login - string(100) - user
email - string(200) - user@user.ru
hash - string(300) - md5( password )
visit - integer(21) - time()
все эти данные хранить массивом например в ключе массива сессии $_SESSION['data'] = $a_user;

в куках держать 2 параметра, это: идентификатор пользователя - id и md5 хеш логина и хеша пароля например

Код:
$cookie['id'] = $a_user['id'];
$cookie['hash'] = md5( $a_user['login'] . $a_user['hash'] );
Затем логичными действиями проверять совпадение. как я писал в предыдущем посте и передавать массив данных о пользователе, точнее строку в массив сессии.
 

FiRеFоX

V.I.P.
Регистрация
07.08.2010
Сообщения
744
да можешь так сделать но я не советую хранить пароль где бы то ни было, храни md5 хеш пароля

из пароля можно получить хеш но нельзя получить пароль из хеша, это как спросить что весит 5 кг, от это информации невозможно понять так как существует неограниченное множество вариантов.

структура таблицы примерно такая

id - integer(21) - 1
login - string(100) - user
email - string(200) - user@user.ru
hash - string(300) - md5( password )
visit - integer(21) - time()
все эти данные хранить массивом например в ключе массива сессии $_SESSION['data'] = $a_user;

в куках держать 2 параметра, это: идентификатор пользователя - id и md5 хеш логина и хеша пароля например

Код:
$cookie['id'] = $a_user['id'];
$cookie['hash'] = md5( $a_user['login'] . $a_user['hash'] );
Затем логичными действиями проверять совпадение. как я писал в предыдущем посте и передавать массив данных о пользователе, точнее строку в массив сессии.
Понял! Спасибо!
 
Статус
Закрыто для дальнейших ответов.
Верх Низ