|
|
|
| У меня вот такая проблема.
есть на странице форма ввода логина и пароля.
если пользователь авторизовался, то приветствуем его.
можно ему переходить на другие страницы. Все работает.
Но как только пользователь на странице "добавить груз"(только для авторизованных пользователей) нажимает кнопку добавить,то потом пользователь уже не определяется и приветсвуется "Пользователь Array".
почему так? | |
|
|
|
|
|
|
|
для: dina
(13.03.2006 в 13:31)
| | Скорее всего вы перезаписываете элемент массива $_SESSION с именем пользователя каким-то массивом. | |
|
|
|
|
|
|
|
для: cheops
(13.03.2006 в 14:01)
| | Сделала на конец-то. Целый день мучалась. Спасибо за подсказку | |
|
|
|
|
|
|
|
для: cheops
(13.03.2006 в 14:01)
| | как этого избежать. Опять возникла эта же проблема. | |
|
|
|
|
|
|
|
для: dina
(13.03.2006 в 15:59)
| | искать ошибку в коде... как вы присваиваете значение этой переменной? | |
|
|
|
|
|
|
|
для: Loki
(13.03.2006 в 16:01)
| | loginform.php
<? session_start();?>
<META http-equiv=Content-Type content="text/html; charset=windows-1251">
<form action=handler.php method=post>
<div align="right">Имя пользователя:
<input type=text name=name value=<?php echo $_SESSION['user']; ?>>
<br>
Пароль:
<input type=password name=password value=<?php echo $_SESSION['password']; ?>>
<br>
<a href="registerform.php"><font color="#0000FF">Регистрация</font></a>
<input type=submit value=Войти>
</div>
</form>
|
handler.php
<? session_start();
include "config.php";
$query = "SELECT password FROM users WHERE name='".$_POST['name']."'";
$nme = mysql_query($query);
if(!$nme)
{
echo mysql_error();
echo "Ошибка выполнения запроса";
exit();
}
if(mysql_num_rows($nme) > 0)
{
$password = mysql_result($nme, 0);
if ($_POST['password'] == $password)
{
if(session_start())
{
$_SESSION['user'] = $_POST['name'];
$_SESSION['password'] = $_POST['password'];
echo "<HTML><HEAD>
<META HTTP-EQUIV='Refresh' CONTENT='0; URL=".$_SERVER['HTTP_REFERER']."' content=\"text/html; charset=windows-1251\">
</HEAD><body>";
}
}
else
{
echo "Ошибка идентификации: неправильный пароль";
exit();
}
}
else
{
echo "Ошибка идентификации: посетитель не зарегистрирован";
exit();
}
?>
|
и есть страница где добавляется груз, там есть код может здесь ошибка когда я его удаляла все работало( выбирается строки из таблицы авторизованного пользователя)
$query1 = "select * from users where name='".$_SESSION['user']."'";
|
| |
|
|
|
|
|
|
|
для: dina
(13.03.2006 в 16:11)
| | когда я удаляю
в коде
//$query1 = "select * from users where name='".$_SESSION['user']."'";
// $result1 = mysql_query($query1);
// $user=mysql_fetch_array($result1);
$query="insert into addcar(car_id, tip_kuz, ves, v, length, width, heigth, tir, ekmt, adr, ot, do, data, addday, min, curs, note, kontakt, time, id_user ) values('',
'$tip_kuz',
'$ves',
'$v',
'$length',
'$width',
'$heigth',
'$tir',
'$ekmt',
'$adr',
'$ot',
'$do',
'$data',
'$addday',
'$min',
'$curs',
'$note',
'$kontakt',
now(),
".$user["id_user"].")";
|
выделенное жирном тоже удаляю. Все работает и user везде на всех страницах приветствуется и определяется | |
|
|
|
|
|
|
|
для: dina
(13.03.2006 в 16:22)
| | Не ,а
'".$user["id_user"].'")";
|
Но дело даже не в этом. Вы явно пытаетесь вставить поле ($user["id_user"]), которое только что вытаскивали Select'ом из БД. А сам Select (верхние три строки) у Вас закоментрирован.
Но дело даже не в этом. Весь код дыряв до невозможности. А ведь это, как я понимаю, система авторизации. Вас же ломать будут... :( | |
|
|
|
|
|
|
|
для: Trianon
(13.03.2006 в 16:40)
| | когда три строчки были закоментированы все работает
$query1 = "select * from users where name='".$_SESSION['user']."'";
$result1 = mysql_query($query1);
$user=mysql_fetch_array($result1);
$query="insert into addcar(car_id, tip_kuz, ves, v, length, width, heigth, tir, ekmt, adr, ot, do, data, addday, min, curs, note, kontakt, time, id_user ) values('',
'$tip_kuz',
'$ves',
'$v',
'$length',
'$width',
'$heigth',
'$tir',
'$ekmt',
'$adr',
'$ot',
'$do',
'$data',
'$addday',
'$min',
'$curs',
'$note',
'$kontakt',
now(),
".$user["id_user"].")";
|
теперь написала вот так, как подсказали ниже($user убрала) и заработало
$query1 = "select id_user from users where name='".$_SESSION['user']."'";
$result1 = mysql_query($query1);
$us=mysql_fetch_array($result1);
|
>>Но дело даже не в этом. Весь код дыряв до невозможности. А
>ведь это, как я понимаю, система авторизации. Вас же ломать
>будут... :(
Первый раз делаю систему авторизации. Скажите, что ни так. Учусь здесь на softtime. | |
|
|
|
|
|
|
|
для: dina
(13.03.2006 в 17:02)
| | Насчет того, что ".$user["id_user"].")"; написан неверно, я наврал, прошу прощения. Если это число, то там все в порядке.
> Первый раз делаю систему авторизации. Скажите, что ни так.
>Учусь здесь на softtime.
Что не так?
1. register_globals нужно отключить. Хотя бы на собственной машине, где Вы это тестируете.
Хотя лучше бы и на боевом сервере тоже. Совпадение имен сессионной и локальной переменной, и вызванный этим конфликт, лучшее тому подтверждение. И сейчас это случайность. А потом такие вещи будут использовать в качестве дыр.
Неоднократно слышал - новичкам лучше работать с включенными register_globals. Ерунда. С ними могут работать только матерые профессионалы, которые весь код насквозь видят, и каждую переменную помнят. И то, скорее всего, они то как раз отключат.
2. Целочисленные данные из полей ввода надо проверять, перед тем как отправлять еще куда-то, например в MySQL-запрос. Строковые данные из полей ввода надо грамотно экранировать.
Строка
$query = "SELECT password FROM users WHERE name='".$_POST['name']."'";
- типичный объект для sql-injection-атаки . Может быть Вас спасут magic_quoets, может оказаться и наоборот. Даже скоррее всего так.
3. В базе нужно хранить не пароли, а только хеши паролей. По хешу невозможно было определить пароль. Сами пароли хранить нельзя. А чего не хранишь - того не украдут.
4. Нельзя пароли запихивать в кукисы. Они оттуда вынимаются в два счета. Хочется удерживать сессию, за счет кукисов - запихивайте туда хеш пароля. И крайне желательно, не тот, который в базе лежит, а другой. Иначе хеш в базе станет фактически открытым паролем.
5. Нельзя писать пользователю "пароль не подошел". Только "неизвестный логин-пароль". Вообще нельзя проверять пароль отдельно, а логин отдельно. Только вместе - одним SQL-запросом. Иначе это будет прямым предложением устроить перебор, пока не подойдет. Соответственно, запрос следует строить не так:
$query = "select password from users where name= '$input_name'"
а, например, так:
$session_pwd = isset($_SESSION['pwd'])?$_SESSION['pwd']: md5($input_login.$input_pwd);
$query = "select user_id from users
where pwd_hash = md5('$session_pwd')
and name = '".mysql_escape_chars($input_name)."'"
$res = mysql_query($query);
if(mysql_num_rows($res) == 1)
$_SESSION['pwd'] = $session_pwd;
else unset($_SESSION['pwd']);
|
И так далее и тому подобное... | |
|
|
|
|
|
|
|
для: Trianon
(13.03.2006 в 17:55)
| | Спасибо за подробное объяснение | |
|
|
|
|
|
|
|
для: Trianon
(13.03.2006 в 17:55)
| | по 4 пункту: если из куки вынут данные, то кто мешает просто подставить их в свою куку? Тогда что пароль, что хеш - все едино. Или я не прав? | |
|
|
|
|
|
|
|
для: Loki
(13.03.2006 в 20:23)
| | Вы правы. Это я сморозил.
Значение из куки вообще нельзя применять как чистый ключ для входа. Его надо использовать в комбинации с данными из логина, REMOTE_IP, FORWARDED_FOR и USER_AGENT для поиска в таблице уже созданных сессий. Таблицу такую - само собой - надо создать. И строки в нее вносить при опознавании пароля из POST-параметров (в этот же момент и прописывать кукис). А удалять - при появлении несогласованной комбинации. | |
|
|
|
|
|
|
|
для: dina
(13.03.2006 в 16:11)
| | Как я понимаю, handler.php используется для всех файлов один, а значение теряется только на одной из страниц, вот в коде формирующем тут страницу я бы и стал искать где используется эта переменная. | |
|
|
|
|
|
|
|
для: Loki
(13.03.2006 в 16:27)
| | У вас register_global в on и пременная $user пересекается с сессионной переменной user а вы вкоде, который закоментировали, ей массив сплитите. Вот он потом и отображается в сессионой переменой. | |
|
|
|
|
|
|
|
для: XPraptor
(13.03.2006 в 16:40)
| | Да... про register globals я как-то не подумал... | |
|
|
|
|