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

Форум PHP

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

 

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

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

тема: проблема с session
 
 автор: dina   (13.03.2006 в 13:31)   письмо автору
 
 

У меня вот такая проблема.
есть на странице форма ввода логина и пароля.
если пользователь авторизовался, то приветствуем его.
можно ему переходить на другие страницы. Все работает.
Но как только пользователь на странице "добавить груз"(только для авторизованных пользователей) нажимает кнопку добавить,то потом пользователь уже не определяется и приветсвуется "Пользователь Array".
почему так?

   
 
 автор: cheops   (13.03.2006 в 14:01)   письмо автору
 
   для: dina   (13.03.2006 в 13:31)
 

Скорее всего вы перезаписываете элемент массива $_SESSION с именем пользователя каким-то массивом.

   
 
 автор: dina   (13.03.2006 в 14:04)   письмо автору
 
   для: cheops   (13.03.2006 в 14:01)
 

Сделала на конец-то. Целый день мучалась. Спасибо за подсказку

   
 
 автор: dina   (13.03.2006 в 15:59)   письмо автору
 
   для: cheops   (13.03.2006 в 14:01)
 

как этого избежать. Опять возникла эта же проблема.

   
 
 автор: Loki   (13.03.2006 в 16:01)   письмо автору
 
   для: dina   (13.03.2006 в 15:59)
 

искать ошибку в коде... как вы присваиваете значение этой переменной?

   
 
 автор: dina   (13.03.2006 в 16:11)   письмо автору
 
   для: 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($nme0); 
      
       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:22)   письмо автору
 
   для: 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 везде на всех страницах приветствуется и определяется

   
 
 автор: Trianon   (13.03.2006 в 16:40)   письмо автору
 
   для: dina   (13.03.2006 в 16:22)
 

Не
".$user["id_user"].")"; 
'".$user["id_user"].'")"; 

Но дело даже не в этом. Вы явно пытаетесь вставить поле ($user["id_user"]), которое только что вытаскивали Select'ом из БД. А сам Select (верхние три строки) у Вас закоментрирован.
Но дело даже не в этом. Весь код дыряв до невозможности. А ведь это, как я понимаю, система авторизации. Вас же ломать будут... :(

   
 
 автор: dina   (13.03.2006 в 17:02)   письмо автору
 
   для: 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.

   
 
 автор: Trianon   (13.03.2006 в 17:55)   письмо автору
 
   для: 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']);

И так далее и тому подобное...

   
 
 автор: dina   (13.03.2006 в 18:05)   письмо автору
 
   для: Trianon   (13.03.2006 в 17:55)
 

Спасибо за подробное объяснение

   
 
 автор: Loki   (13.03.2006 в 20:23)   письмо автору
 
   для: Trianon   (13.03.2006 в 17:55)
 

по 4 пункту: если из куки вынут данные, то кто мешает просто подставить их в свою куку? Тогда что пароль, что хеш - все едино. Или я не прав?

   
 
 автор: Trianon   (14.03.2006 в 10:04)   письмо автору
 
   для: Loki   (13.03.2006 в 20:23)
 

Вы правы. Это я сморозил.
Значение из куки вообще нельзя применять как чистый ключ для входа. Его надо использовать в комбинации с данными из логина, REMOTE_IP, FORWARDED_FOR и USER_AGENT для поиска в таблице уже созданных сессий. Таблицу такую - само собой - надо создать. И строки в нее вносить при опознавании пароля из POST-параметров (в этот же момент и прописывать кукис). А удалять - при появлении несогласованной комбинации.

   
 
 автор: Loki   (13.03.2006 в 16:27)   письмо автору
 
   для: dina   (13.03.2006 в 16:11)
 

Как я понимаю, handler.php используется для всех файлов один, а значение теряется только на одной из страниц, вот в коде формирующем тут страницу я бы и стал искать где используется эта переменная.

   
 
 автор: XPraptor   (13.03.2006 в 16:40)   письмо автору
 
   для: Loki   (13.03.2006 в 16:27)
 

У вас register_global в on и пременная $user пересекается с сессионной переменной user а вы вкоде, который закоментировали, ей массив сплитите. Вот он потом и отображается в сессионой переменой.

   
 
 автор: Loki   (13.03.2006 в 16:52)   письмо автору
 
   для: XPraptor   (13.03.2006 в 16:40)
 

Да... про register globals я как-то не подумал...

   
Rambler's Top100
вверх

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