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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: проблема с session

Сообщения:  [1-10]   [11-16] 

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

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

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

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

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

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

   
 
 автор: 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 в 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.

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

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

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

У вас register_global в on и пременная $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 (верхние три строки) у Вас закоментрирован.
Но дело даже не в этом. Весь код дыряв до невозможности. А ведь это, как я понимаю, система авторизации. Вас же ломать будут... :(

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

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

   
 
 автор: 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 везде на всех страницах приветствуется и определяется

   

Сообщения:  [1-10]   [11-16] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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