Перейти к содержимому

Фото
- - - - -

проблема с сессиями


  • Вы не можете создать новую тему
  • Please log in to reply
16 ответов в этой теме

#1 simonsays

simonsays
  • Пользователь
  • 835 сообщений

Отправлено 02 февраля 2006 - 17:00

вот такая вот проблема. написал скрипт, который проверяет вошёл ли пользователь. добавил его через include во все готорвые страницы сайта. сам скрипт вот:
<?php
 
function checkUser($login, $pass) {
		dbConnect("test");
	$sql = "SELECT * FROM users WHERE login = '$login' AND MD5(password) = MD5('$pass')";
	$result =  mysql_query($sql) or die(mysql_error());
	if (!$result) { error("Andmebaasi viga: palun proovi hiljem uuesti!"); return false; }
	if (mysql_num_rows($result) == 1) {
	$_SESSION['uid'] = $uid;
	$_SESSION['pwd'] = $pwd;
 	return true;
	} else {return false;}
}

 include_once 'error.php';
 include_once 'data.php';
 
 session_start();
 
 $display = "form.php";

 if (isset($_POST['uid']) && isset($_POST['pwd'])) {
		$uid = addslashes($_POST['uid']);
 	$pwd = addslashes($_POST['pwd']);
	if (checkUser($uid, $pwd)) {
		$day = date('d');
			$month = date('m');
			$year = date('Y');
			$time = date('H:i');
		dbConnect('test');
		$sql = "UPDATE users SET last_day='$day', last_month = '$month', last_year = '$year', last_time = '$time' WHERE login = '$uid'";
		if (!mysql_query($sql)) {
				error('A database error occurred in processing your submission.<br />' . mysql_error());
		}
		$_SESSION['uid'] = $uid;
		$_SESSION['pwd'] = $pwd;
		$display = "form1.php";
	} else { header("Location:viga.php"); }
 }  elseif (isset($_SESSION['uid']) && isset($_SESSION['pwd'])) {
		$uid = addslashes($_SESSION['uid']);
 	$pwd = addslashes($_SESSION['pwd']);

	if (checkUser($uid, $pwd)) { $display = "form1.php";}
	else { header("Location:viga.php"); }
 } else {
		session_unset();
		session_destroy();
 }

 if ((isset($_GET['logout'])) && ($_GET['logout']==1)) {
	   session_unset();
 	session_destroy();
	$display = "form.php";
	$host  = $_SERVER['HTTP_HOST']; 
	$uri = $_SERVER['PHP_SELF'];
	echo ("http://$host$uri?logout=1");
}

 ?>

как из него понятно, в случае если признак пользователя и пароль правильные или если действует сессия, то отображается form1.php (какой скрипт отображается, я через тот же include добавил в саму html страницу).
form1.php содержит в себе приветствие пользователя по его признаку:

<?php?>
<html>
<td height="82">
<p><b><font size="2">Tere tulemast, <?php  echo $uid; ?>!</font><br>
<font size="1"><a href="<?php $host  = $_SERVER['HTTP_HOST']; $uri = $_SERVER['PHP_SELF'];
echo ("http://$host$uri?logout=1");?>">[Logi vдlja]</a></p></font></b>
</html>
<?php?>

проблема в том, что логинится всё ОК. я захожу, меня приветсвуют. но при переходе на другую страницу сессия сохраняется (проверял с помощью echo $uid i $pwd), а имя моего в приветсвии уже не пишут. при новом переходе на следующую страницу сессия пропадает вообще...
в чём может быть проблема?
  • 0

#2 ФрукТ

ФрукТ
  • Постоялец
  • 768 сообщений
  • Откуда:сеть

Отправлено 02 февраля 2006 - 17:26

По делу сейчас нифига не напишу :)
Чуть позже прогоню твой скрипт на сервере, а пока могу только сказать, что
1) В строчках 22-48 столько if-else-elseif, что читать практически невозможно
2)
$day = date('d');
			$month = date('m');
			$year = date('Y');
			$time = date('H:i');
		dbConnect('test');
		$sql = "UPDATE users SET last_day='$day', last_month = '$month', last_year = '$year', last_time = '$time' WHERE login = '$uid'";

ЗАЧЕМ такое извращение? В sql есть прекрасный тип поля TIMESTAMP, который прекрасно хранит в себе время последнего редактирования записи при врубленной опции "timestamp on update" или как-то так.

3) Протесть свой скрипт на XSS уязвимости. Имхо одного addslashes для $uid не достаточно

пока все
  • 0

#3 simonsays

simonsays
  • Пользователь
  • 835 сообщений

Отправлено 02 февраля 2006 - 17:52

спасибо огромное за советы! но оставлю их пока без комментариев, потому что на данный момент меня всё же волнует проблема с сессиями :)

P.S. про TIMESTAMP я прекрасно знаю. по-отдельности всё записываю, потому что так мне будет надо :)

Сообщение изменено: simonsays (02 февраля 2006 - 18:08 )

  • 0

#4 V^v

V^v
  • Пользователь
  • 316 сообщений

Отправлено 02 февраля 2006 - 18:35

3) Протесть свой скрипт на XSS уязвимости.

как -ето делается?
  • 0
int main(void)

#5 ФрукТ

ФрукТ
  • Постоялец
  • 768 сообщений
  • Откуда:сеть

Отправлено 02 февраля 2006 - 18:40

V^v,

как -ето делается?


а как они по-твоему ещё находятся?

сидят психи и пытаются взломать. Вот на время надо стать таким же психом и попытаться найти дыры в собственном скрипте.

для начала психи, естественно, курят гугл
  • 0

#6 simonsays

simonsays
  • Пользователь
  • 835 сообщений

Отправлено 03 февраля 2006 - 14:43

ну по идее скрипт будет безопасным, если я буду думать, что на мой сайт будут ходить ТОЛЬКО хакеры с ОДНОЙ целью взломать его :)
ладно, жду ответа про сессии
  • 0

#7 ФрукТ

ФрукТ
  • Постоялец
  • 768 сообщений
  • Откуда:сеть

Отправлено 03 февраля 2006 - 17:44

simonsays, хаха
а потом плачут всякие "почему меня дефейсят" (-:
скрипт должен быть защищенным в любом случае
  • 0

#8 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 03 февраля 2006 - 18:21

проблема в том, что логинится всё ОК. я захожу, меня приветсвуют. но при переходе на другую страницу сессия сохраняется (проверял с помощью echo $uid i $pwd), а имя моего в приветсвии уже не пишут. при новом переходе на следующую страницу сессия пропадает вообще...
в чём может быть проблема?


У меня нет времени разбираться в этом глупом коде, возможно, ты что-то делаешь неправильно. Мне кажется, что проблема в твоей функции checkUser() откуда ты берёшь переменные $uid и $pwd? Ты сам свои переменные обнуляешь и ещё жалуешься чего-то... Да, советую для тестирования вставлять такую строку в начало скрипта: error_reporting( E_ALL );

	if (mysql_num_rows($result) == 1) {
	$_SESSION['uid'] = $uid;
	$_SESSION['pwd'] = $pwd;
	return true;


  • 0

#9 not nil

not nil
  • Пользователь
  • 27 сообщений

Отправлено 04 февраля 2006 - 04:39

simonsays, версия PHP случайно не 5-я? Думаю что следует пихать старт сессии в самое начало страницы. Особенно к этому требовательна последняя версия PHP, т.е. не внезависимости от вывода и предшествующих блоков и функций. Отлавливать лучше используя дампинг сессии, то есть var_dump($_SESSION). И думаю будет не лишним пользоваться функцией register_session, хотя с 4.0.1 официально и нет нужды это делать.
  • 0

#10 ФрукТ

ФрукТ
  • Постоялец
  • 768 сообщений
  • Откуда:сеть

Отправлено 04 февраля 2006 - 11:19

сегодня буду как раз писать фигню для работы с сессиями и кукисами, могу потом выложить исходник для сравнения

просто

У меня нет времени разбираться в этом глупом коде


я этих ifelseifelseifelseelseififelse не понимаю
  • 0

#11 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 04 февраля 2006 - 13:39

ерсия PHP случайно не 5-я? Думаю что следует пихать старт сессии в самое начало страницы. Особенно к этому требовательна последняя версия PHP,

Что за чушь? session_start можно положить в любое место, лишь бы до этого момента в браузер не была отослана никакая информация (headers не в счёт). В php.ini можно задать опцию будет ли PHP автоматически буферизировать первые N байт, а только потом уже выдавать контент юзеру.

И думаю будет не лишним пользоваться функцией register_session, хотя с 4.0.1 официально и нет нужды это делать

Не нужно ей пользоваться

И вообще, проблему я уже назвал в своём предыдущем посте - функция checkuser обнуляет переменные сессии

$_SESSION['uid'] = $uid;
$_SESSION['pwd'] = $pwd;

дальнейшее обсуждение бессмысленно :)

я этих ifelseifelseifelseelseififelse не понимаю

Да их там не так уж и много ;) Что их понимать... ничего сложного, просто оформление кода хромает ;)
  • 0

#12 simonsays

simonsays
  • Пользователь
  • 835 сообщений

Отправлено 04 февраля 2006 - 14:26

спасибо большое! как всё было просто... теперь работает как надо.
а что именно там прихрамывает?
  • 0

#13 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 04 февраля 2006 - 14:52

а что именно там прихрамывает?

что где прихрамывает?

Кстати, вместо addshashes() используй ф-цию mysql_escape_string()

P.S. ты парень или девчонка? почему Пол женский стоит, а говоришь от мужского имени? :)
  • 0

#14 ФрукТ

ФрукТ
  • Постоялец
  • 768 сообщений
  • Откуда:сеть

Отправлено 04 февраля 2006 - 18:36

Кстати, немного не в тему, но все же:

Функция идентична mysql_real_escape_string(), исключая то, что mysql_real_escape_string() принимает параметром ещё и указатель на соединение и экранирует в зависимости от кодировки. mysql_escape_string() не делает этого и результат работы не зависит от кодировки, в который вы работаете с БД.


есть ли смысл использовать mysql_REAL_escape_string и если есть, то когда?
  • 0

#15 simonsays

simonsays
  • Пользователь
  • 835 сообщений

Отправлено 08 февраля 2006 - 17:10

всё-таки поставлю правильный пол. не обратил даже внимания :)
  • 0

#16 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 09 февраля 2006 - 01:47

Лучше РЕАЛ эскейп использовать, в мануале об этом написано

Меня повеселила эта конструкция
MD5(password) = MD5('$pass')
получается, что МД5 тут просто "для понта" используется, а пароль в базе храняться все-равно в незашифрованном виде.

Надо использовать
password = MD5('$pass')
где поле password содержит МД5 хеш пароля
  • 0

#17 ФрукТ

ФрукТ
  • Постоялец
  • 768 сообщений
  • Откуда:сеть

Отправлено 09 февраля 2006 - 19:14

Strelok, по риал эспейпу я привел цитату из мануала

там не написано главное - "а зачем?".
Что дает проверка в зависимости от кодировки?

а с мд5 весело... (-:
  • 0