Вы не зашли.
Главная » PHP » авторизация $_COOKIE
#1. nord Off (1)
Участник
2011.02.19 21:09
вобщем меня давно интересует такой вопрос , есть пароль я зашифровал его в md5 потом еще в base64
но если украсть этот хеш то с ним можно зайти спокойно на сайт под чужим паролем
помогите пожалуйста как сделать такую авторизацию правильно и безопасно чтобы при �раже хеша не смогли авторизоваться под чужим паролем?
Отредактировано nord (2011.02.19 21:09)
#2. DarkDaNTe Off (11)
Участник
2011.02.19 22:10
А как авторизоваться-то? base64 - бред
#3. TLENS Off (14)
Moderator
2011.02.19 23:11
nord
Наоборот надо было сразу в base64 потом в md5
А еще лучше md5(md5($pass))
Добавлено спустя   1 минуту  26 секунд:
А воще зачем ты шифровал его в куку?
#4. Gemorroj Off (107)
Administrator
2011.02.19 23:11
не нужно было тут base64 ни в каком варианте
#5. nord Off (1)
Участник
2011.02.20 08:08
а как это все правильно сделать дайте маленький пример? Чтобы понять как это работает с куками не работал ни когда
#6. DarkDaNTe Off (11)
Участник
2011.02.20 17:05
$pass = md5($_POST['pass']);
А дальше setcookie
#7. Gemorroj Off (107)
Administrator
2011.02.20 18:06
вообще, не нужно хранить в куках пароль. там нужно хранить идентификатор сессии. а в самой сессии уже все данные.
#8. TLENS Off (14)
Moderator
2011.02.20 19:07
DarkDaNTe написал:
$pass = md5($_POST['pass']);
А дальше setcookie
И что это будет?
Если я правильно понял ты хочешь записать хеш пароля в куку а потом сравнивать с хешом в базе?
Ни вкоем случае так не делай.
Смысл тогда его хешироват? А нету
Так как если солют базу, ни каким образом нельзя дать доступ к учетке через хеш.
А так просто стоит себе в куку вставить хеш и впирет доступ открыт.
А хотя я думаю если смогут базу слить то и получить доступы не составит труда
Отредактировано TLENS (2011.02.20 19:07)
#9. nord Off (1)
Участник
2011.02.21 08:08
Gemorroj написал:
вообще, не нужно хранить в куках пароль. там нужно хранить идентификатор сессии. а в самой сессии уже все данные.
да да оно самое а как это правильно сделать можно поподробнее пожалуйста?
#10. Gemorroj Off (107)
Administrator
2011.02.21 10:10
ну что еще можно рассказать-то? конкретней вопрос задай.
#11. nord Off (1)
Участник
2011.02.21 10:10
как это делать и как потом это все проверять можно маленький пример пожалуйста?
#12. Gemorroj Off (107)
Administrator
2011.02.21 10:10
Код:
<?php
session_start();
 
if (isset($_SESSION['id'])) {
    echo 'Ваш ID: ' $_SESSION['id'];
} else {
    echo 'Вы не залогинены.';
}
#13. nord Off (1)
Участник
2011.02.21 12:12
на сессиях я делал авторизацию , и на куках тоже получаеться но журил я хеш возьму  и вставлю на другом компе в оперу то я авторизуюсь под этой учетной записью, или от этого защититься нельзя?
#14. Gemorroj Off (107)
Administrator
2011.02.21 13:01
да, вставишь. защититься можно проверяя IP, Браузер, их сочетание.
#15. nord Off (1)
Участник
2011.02.21 15:03
а как можно по ip проверить если но динамический?
#16. Gemorroj Off (107)
Administrator
2011.02.21 15:03
никак.
#17. TLENS Off (14)
Moderator
2011.02.21 18:06
Ну можно создать таблицу в её писать id юза и какой нибудь хеш ну и браузер хеш отправить в куку а и после простоя сесии сравнить хеш браузер ну и еще какие то данные это на сколько фантазии хватит и если все сходится авторизовуем ну и меняем хеш.
Добавлено спустя   3 минуты  20 секунд:
Ну я думаю надо по любому и себе делать авто авторизацию а то часто бывало пишу какое то сообщение мучаюсь тут жму отправить а оно мне вы не авторизованы. Жмем назад а кеширование понятно отключено
#18. TLENS Off (14)
Moderator
2011.02.21 18:06
Ну или время жизни сессии поставить на 5 часов
#19. nord Off (1)
Участник
2011.02.21 21:09
спасибо большое всем за помощь хоть немного разобрался)
#20. Istsam Off (0)
Участник
2011.02.22 12:12
а можно $pass = md5(base64($_POST['pass']));
Добавлено спустя   1 минуту :
или же
Код:
<?php
function mdQ($var)
{
    return md5(base64_encode($var) . 'MyBlog');
}
?>
#21. TLENS Off (14)
Moderator
2011.02.22 22:10
Istsam
Ну можно и по ключю
Но base64 там не нужен
Отредактировано TLENS (2011.02.22 22:10)
#22. Vynderkind Off (0)
Участник
2011.03.30 03:03
если делать с помощю сесии то авторизация не будет слетать?
#23. Gemorroj Off (107)
Administrator
2011.03.30 08:08
всегда есть вероятность потери сессии (пользователь удалил куку, на сервере что-то случилось с хранилищем сессий...)
#24. НЕЗНАЙКА Off (11)
Участник
2011.04.01 18:06
Или же место на сервере закончилось! Я у себя в подержку написал о переполнении дык сказали сделаем. Неделю где-то папка сессии растет:-) круто, да?
Я, допустим, делал так: в таблицу юзеров пишу случайный хэш, его же и в сессию + проверка по ip.
ДАУН-Данная Аватара Унаследована Незнайкой
#25. tipsun Off (19)
Moderator
2011.04.09 23:11
Я вообще не понимаю что к чему тут, но хочу разобраться smile

- С чего вообще ты это взял?
- Ну вот:

.promodj.ru    TRUE    /    FALSE    1333806479    pdjsid    452ddpcej5vf83q7i4e6fueng0
.promodj.ru    TRUE    /    FALSE    1643749200    maxi    1181816
.promodj.ru    TRUE    /    FALSE    1643749200    jazz    %7E355400e24b65b0f2fb3e9ee92f3e2073
.promodj.ru    TRUE    /    FALSE    1643749200    trickme    5b7550ddc1c6c97a87b80339e748da81
promodj.ru    FALSE    /    FALSE    1304948878    fatboy    AAAAAU2fEg4sc3Lqc89QAg==
Последняя кажется всегда постоянна...

Код:
<?php
 
if(isset($_COOKIE['sid']))
  {
    //echo $_COOKIE['sid'];
    Session_Start($_COOKIE['sid']); //Запуск прежней сессии, ну как я понял.
                                    //она остается всегда на сервере? Или сколько времени она действительна?
  }
  else
  {
    Session_Start(); //Запуск новой сессии
    
    //При авторизации будем сохранять ид сессии у юзера на компе.
    //SetCookie('sid',    Session_ID(), $_SERVER['REQUEST_TIME'] + (86400*7), '/',     $_SERVER['HTTP_HOST'], false, false);
    //SetCookie('subsid', Session_ID(), $_SERVER['REQUEST_TIME'] + (86400*7), '/', '.'.$_SERVER['HTTP_HOST'], false, false);
  }
 
?>
Отредактировано tipsun (2011.04.10 00:12)
#26. Gemorroj Off (107)
Administrator
2011.04.10 00:12
http://php.net/session_start ответы всегда в мануале.
bool session_start ( void )
#27. tipsun Off (19)
Moderator
2011.04.10 00:12
Это кто там такую фигню в посте #25 пишет??! big_smile

void - пусто. Понял)) СПС.

Код:
<?php
 
//echo $_COOKIE['sid'];
Session_Name('sid'); //Запуск прежней сессии, если был получен её id через $_GET, $_POST или $_COOKIE, иначе не беда, создается новый
Session_Start();
 
//При авторизации будем сохранять ид сессии у юзера на компе.
//SetCookie('sid', Session_ID(), $_SERVER['REQUEST_TIME'] + (86400*7), '/', $_SERVER['HTTP_HOST'], false, false);
//при закрытии окошка в интернет, у нас останется ключ...
 
?>
Отредактировано tipsun (2011.04.10 00:12)
#28. tipsun Off (19)
Moderator
2011.04.10 13:01
Вот я не пойму, зачем в куки все суют браузеры, ипы... Он же на отдельном компе каждого хранится.
----
Узнал, как можно продлить жизнь файла сессии, просто создать для него отдельную папку и если можно там, где нет доступа.
Код:
<?php
ini_set('session.save_path'$_SERVER['DOCUMENT_ROOT'] .'../sessions/');
Базу не трогать, т.к. все равно с файла вытащить это все быстрее будет, как я понял.
Отредактировано tipsun (2011.04.10 13:01)
#29. Gemorroj Off (107)
Administrator
2011.04.10 13:01
что за дибилизм, трудно в мануал заглянуть?
http://www.php.net/manual/en/session.co … axlifetime
а save_path только меняет папку для хранения сессий.
Добавлено спустя   1 минуту  23 секунды:
нет, из БД быстрее, особенно когда сессий много. еще быстрее мемкеш.
#30. tipsun Off (19)
Moderator
2011.04.10 13:01
http://habrahabr.ru/blogs/php/28418/ o_O
- - - -
А епт, это для виртуального хостинга.
Отредактировано tipsun (2011.04.10 14:02)
#31. Gemorroj Off (107)
Administrator
2011.04.10 14:02
там просто проблема с тем, что папка переполнялась.
#32. tipsun Off (19)
Moderator
2011.04.10 14:02
Понял. СПС.
В след раз в ману лезть буду...
#33. tipsun Off (19)
Moderator
2011.04.10 16:04
Вот shit, поговнокодить не дают... http://phpfaq.ru/sessions
#34. Nu3oN Off (11)
Moderator
2011.04.10 21:09
Зачем так мудрить? чем обычный подход к этому делу не устроил?
Я буду лучше голоден, но между креслом и рулем и на дороге.
#35. tipsun Off (19)
Moderator
2011.04.10 23:11
Не, ну там написано типа для гостей не надо сессию начинать, как я понял.
Не надо старые сессии продолжать при получении куков, а стартовать новую с данными юзера.
- - - -
А если так делать, то надо в базу лезть.
И если даже для гостей сессию не начинать, то как captcha будет работать.
В принципе в этой сессии кроме ид, статуса и каптчи ниче не хранится у меня.
- - - -
Я в принципе писал, что пока не разбираюсь в этих делах, но хочу разобраться.
Там пример тоже приводится в конце статьи...
Отредактировано tipsun (2011.04.10 23:11)
#36. tipsun Off (19)
Moderator
2011.04.11 22:10
Заблудился я совсем...
#37. tipsun Off (19)
Moderator
2011.04.12 14:02
Набросок

Код:
<?php
 
$db mysql_connect('localhost''root''');
      mysql_select_db('tsb',    $db);
      mysql_set_charset('utf8'$db);
 
//типа авторизовался...
if(isset($_GET['auth']))
  {
    Session_Start();
    
    //Когда логин и пароль подошли, из базы достаем...
    $_SESSION['id']   = 1//пока просто для теста.
    $_SESSION['team'] = 1//пока просто для теста.
    $_SESSION['ip']   = $_SERVER['REMOTE_ADDR'];
    /////
    mysql_query("UPDATE `users` SET `ip`='".$_SERVER['REMOTE_ADDR']."', `remember`=1 WHERE `id`=1 LIMIT 1;"$db);
    //типа нажал запомнить
    //у меня там в говнокоде заносится и ip и browser
 
    SetCookie('REMEMBER'1$_SERVER['REQUEST_TIME'] + 86400'/');
    //типа нажал запомнить
 
    header('Location: http://'.$_SERVER['HTTP_HOST']);
    exit;
  }
 
//в шляпе... не кролик...
if(isset($_COOKIE['PHPSESSID']))
  {
    Session_Start();
    
    if(isset($_COOKIE['REMEMBER']) AND $_SESSION['ip'] != $_SERVER['REMOTE_ADDR'])
    {
      $query mysql_query("SELECT `id`, `team` FROM `users` WHERE `ip`='".$_SERVER['REMOTE_ADDR']."' AND `remember`=1 LIMIT 1;"$db);
      //если типа нажал запомнить
 
      if(mysql_num_rows($query))
      {
        //не надо начинать старые сессии, ну ладно не будем...
        
        //Удаляем старую сессию. Можно и оставить, сервер удалит...
        Session_Destroy();
        //Удаляем её ключ
        unset($_COOKIE['PHPSESSID']);
        
        //Стартуем новую сессию
        Session_Start();
        
        $array mysql_fetch_array($queryMYSQL_ASSOC);
        
        $_SESSION['id']   = $array['id']; //Из базы будет извлекаться...
        $_SESSION['team'] = $array['team']; //Из базы будет извлекаться...
        $_SESSION['ip']   = $_SERVER['REMOTE_ADDR'];
        
        header('Location: http://'.$_SERVER['HTTP_HOST']);
        exit;
      }
      else
      {
        //переадресация на страницу авторизации.
      }
    }
    else
    {
      //переадресация на страницу авторизации.
    }
  }
?>
Отредактировано tipsun (2011.04.12 15:03)
#38. Gemorroj Off (107)
Administrator
2011.04.12 16:04
перед тем как делаешь session_destroy сделай еще и $_SESSION = null;
и пиши имена функций с маленькой буквы не  Session_Destroy, а  session_destroy.
а вообще не вижу смысла делать session_destroy, а затем сразу же делать session_start.
#39. DarkDaNTe Off (11)
Участник
2011.04.12 19:07
Код:
<?php
unset($_COOKIE['PHPSESSID']);
?>
и почитай как удалять куки еще
#40. tipsun Off (19)
Moderator
2011.04.12 20:08
Спс всем. Буду еще думать.

Подумал:
Код:
<?php
 
$db mysql_connect('localhost''root''');
      mysql_select_db('tsb',    $db);
      mysql_set_charset('utf8'$db);
 
//типа авторизовался...
if(isset($_GET['auth']))
  {
    session_start();
    
    $_SESSION['id']   = 1//пока просто для теста.
    $_SESSION['team'] = 1//пока просто для теста.
    $_SESSION['ip']   = $_SERVER['REMOTE_ADDR'];
    /////
    mysql_query("UPDATE `users` SET `remember`=1 WHERE `id`=1 LIMIT 1;"$db);
    SetCookie('REMEMBER'1$_SERVER['REQUEST_TIME'] + 86400'/');
    
    header('Location: http://'.$_SERVER['HTTP_HOST']);
    exit;
  }
 
if(isset($_COOKIE['PHPSESSID']))
  {
    session_start();
    
    if(isset($_COOKIE['REMEMBER']) && $_SESSION['ip'] != $_SERVER['REMOTE_ADDR'])
    {
      $query mysql_query("SELECT `id`, `team` FROM `users` WHERE `ip`='".$_SERVER['REMOTE_ADDR']."' AND `remember`=1 LIMIT 1;"$db);
      
      if(mysql_num_rows($query))
      {
        $_SESSION null//чистим, чтоб потом чистый файл был :)
        session_regenerate_id(true); //ну тут собстЭнна я и упал с велосипеда...
 
        $array mysql_fetch_array($queryMYSQL_ASSOC);
        
        $_SESSION['id']   = $array['id']; //Из базы будет извлекаться...
        $_SESSION['team'] = $array['team']; //Из базы будет извлекаться...
        $_SESSION['ip']   = $_SERVER['REMOTE_ADDR'];
        
        header('Location: http://'.$_SERVER['HTTP_HOST']);
        exit;
      }
      else
      {
        //session_destroy(); - надо или нет пока не знаю...        
        //переадресация на страницу авторизации.
      }
    }
    elseif(!isset($_COOKIE['REMEMBER']) && $_SESSION['ip'] != $_SERVER['REMOTE_ADDR'])
    {
      //session_destroy(); - надо или нет пока не знаю...        
      //переадресация на страницу авторизации.
    }
    
    //или просто продолжаем, если все нормально.
  }
?>
Отредактировано tipsun (2011.04.12 22:10)
#41. tipsun Off (19)
Moderator
2011.04.13 18:06
Вот сделал. Подскажите пожалуйста, нет ли ошибок? А то я вот только начал use PDO...
Код:
<?php
 
/////
$time    $_SERVER['REQUEST_TIME']; //Время с запуска страницы
$offline $time 240;              //Лимит тунеянства
/////
$browser = isset($_SERVER['HTTP_X_OPERAMINI_PHONE_UA']) ? $_SERVER['HTTP_X_OPERAMINI_PHONE_UA'] : $_SERVER['HTTP_USER_AGENT'];
//Получание данных о браузере
$ip      $_SERVER['REMOTE_ADDR'];
//Получение данных об ip-адресе
 
//DB CONNECTION//
$host_db 'mysql:host=localhost;dbname=tsb';
$user    'root';
$pass    '';
/////
$db = new PDO($host_db$user$pass); //Соединение с БД
$db->exec("SET NAMES 'utf8';");        //Установка кодировки
 
//SESSION//
if(isset($_COOKIE['PHPSESSID']))
  {
    session_start();
    
    if(isset($_COOKIE['REMEMBER']) AND $_SESSION['ip'] != $ip)
    {
      $Hq1 $db->prepare("SELECT `id`, `team` FROM `users` WHERE `remember`=1 AND `ip`=? LIMIT 1;");
      $Hq2 $db->prepare("UPDATE `users` SET `online`='$time', `browser`=?, WHERE `ip`=? LIMIT 1;");
      /////
      $Hq1->execute(array($ip));
      
      if($Hq1->rowcount())
      {
        $_SESSION null;
        session_regenerate_id(1);
        
        $Ha $Hq1->fetch(PDO::FETCH_ASSOC);
        $Hq1->closecursor();
        
        $_SESSION['id']   = $Ha['id'];   //Из базы будет извлекаться...
        $_SESSION['team'] = $Ha['team']; //Из базы будет извлекаться...
        $_SESSION['ip']   = $ip;
        /////
        $Hq2->execute(array($browser$ip));
        $Hq2->closecursor();
      }
      else
      {
        $_SESSION null;
        session_destroy();
      }
    }
    elseif(!isset($_COOKIE['REMEMBER']) AND $_SESSION['ip'] != $ip)
    {
      $_SESSION null;
      session_destroy();
    }
  }
  else
  {
    $Hq3 $db->prepare("REPLACE INTO `guests` SET `online`='$time', `browser`=?, `ip`=?;");
    $Hq3->execute(array($browser$ip));
    $Hq3->closecursor();
  }
 
?>
Друг подсказал, что надо и браузер в это дело подключить и еще ип сравнивать только по 3м первым диапазонам. 4ый меняется.
Отредактировано tipsun (2011.04.13 22:10)
#42. Nu3oN Off (11)
Moderator
2011.04.14 00:12
вместо $db->exec("SET NAMES 'utf8';"); делай так
Код:
<?php
$db = new PDO($host_db$user$pass, array(PDO :: MYSQL_ATTR_INIT_COMMAND => 'SET NAMES `utf8`'));
?>
Вместо fetch(PDO::FETCH_ASSOC); укажи один раз, и вс smile
Код:
<?php
$db-> setAttribute(PDO :: ATTR_DEFAULT_FETCH_MODEPDO :: FETCH_ASSOC);
?>
Вот это:
Код:
<?php
$stmt $db -> prepare("...");
$stmt -> execute(array(...));
$stmt -> closecursor();
?>
Сделай как плагинизацию (в котором ты будешь разширять класс пдо) такой метод

Код:
<?php
class ClassBase extends PDO {
 
   //  ля ля ля
 
    /**
    * prepare
    *
    * @param  string $sql    Строка запроса.
    * @return object
    **/  
    
    public function prepare($sql)
    {
    
        $stmt parent :: prepare($sql, array(PDO :: ATTR_STATEMENT_CLASS => array('PDOStatement')));
        return $stmt;
    }
}
 
?>
В общем глянь как это в роторе сделано! удобней чем каждый раз это все писать!
Я буду лучше голоден, но между креслом и рулем и на дороге.
#43. tipsun Off (19)
Moderator
2011.04.14 00:12
Спс smile
Как будет время рассмотрю остальную половину сообщения. Под рукой компа нет... С моб не удобно...
Как бы мне снова не заблудиться smile
Отредактировано tipsun (2011.04.14 12:12)
#44. Gemorroj Off (107)
Administrator
2011.04.14 11:11
Nu3oN написал:
$db = new PDO($host_db, $user, $pass, array(PDO :: MYSQL_ATTR_INIT_COMMAND => 'SET NAMES `utf8`'));
http://php.net/ChangeLog-5.php#5.3.6
Implemented FR #47802 (Support for setting character sets in DSN strings). (Kalle)
так, к сведению, начиная с PHP 5.3.6 кодировку можно указвыать прямо в строке подключения
#45. tipsun Off (19)
Moderator
2011.04.14 12:12
Ахринеть, это только сессия! big_smile

Надо более компактно и логично сделать...

Код:
<?php
 
$time    $_SERVER['REQUEST_TIME']; //Время с запуска страницы
$offline $time 240;              //Лимит тунеянства
/////
$browser $_SERVER['HTTP_USER_AGENT'];
$ip      $_SERVER['REMOTE_ADDR'];
$stat_ip substr($ip0strrpos($ip'.'));
 
//DB CONNECTION//
$base = array(
'localhost'//Host
'root',      //User
'',          //Pass
'tsb',       //Base
'utf8');     //Char
 
if('5.3.6' phpversion())
  {
    $attr[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES `'.$base[4].'`;';
  }
 
$db = new PDO('mysql:host='.$base[0].';dbname='.$base[3].';charset='.$base[4].';'$base[1], $base[2], $attr);
 
//SESSION//
if(!empty($_COOKIE['PHPSESSID']))
  {
    session_start();
    
    if(!empty($_COOKIE['REMEMBER']) && $_SESSION['browser'] != $browser && $_SESSION['ip'] != $stat_ip)
    {
      $Hq1 $db->prepare("
      SELECT `id`, `team`
      FROM `users`
      WHERE `remember`=1 AND `browser`=? AND `ip` LIKE ?;");
      
      $Hq2 $db->prepare("
      UPDATE `users`
      SET `online`='$time'
      WHERE `browser`=? AND `ip` LIKE ?;");
      /////
      $Hq1->execute(array($browser$stat_ip.'%'));
      
      if($Hq1->rowcount())
      {
        $_SESSION null;
        session_regenerate_id(1);
        
        $Ha $Hq1->fetch(PDO::FETCH_ASSOC);
        $Hq1->closecursor();
        
        $_SESSION['id']      = $Ha['id'];
        $_SESSION['team']    = $Ha['team'];
        $_SESSION['browser'] = $browser;
        $_SESSION['ip']      = $stat_ip;
        /////
        $Hq2->execute(array($browser$stat_ip.'%'));
        $Hq2->closecursor();
      }
      else
      {
        $_SESSION null;
        session_destroy();
        setcookie('PHPSESSID'null);
      }
    }
    elseif(empty($_COOKIE['REMEMBER']) && $_SESSION['browser'] != $browser && $_SESSION['ip'] != $stat_ip)
    {
      $_SESSION null;
      session_destroy();
      setcookie('PHPSESSID'null);
    }
  }
  else
  {
    $Hq3 $db->prepare("
    REPLACE INTO `guests`
    SET `online`='$time', `browser`=?, `ip`=?;");
    $Hq3->execute(array($browser$ip));
    $Hq3->closecursor();
  }
 
?>
Отредактировано tipsun (2011.04.16 18:06)
#46. tipsun Off (19)
Moderator
2011.04.17 10:10
Чет мне народ говорит, что говнокод.
Типа по диапазону не стоит проверять, да и если так, то можно через модем билайн зайти, браузер поставить как у жертвы и все...
- - - -
Как тогда сделать?
Отредактировано tipsun (2011.04.17 10:10)
#47. Gemorroj Off (107)
Administrator
2011.04.17 11:11
я вообще не понимаю, нафига ты что-то мудришь? ты банковскую систему чтоли пишешь? идентифицируй пользователя по сессии и хватит. если пользователь умудрился потерять потерять куки, то ему уже ничто не поможет, ИМХО.
#48. tipsun Off (19)
Moderator
2011.04.17 11:11
Вебмани хотел переплюнуть big_smile
- - - -
Снова я заблудился.
- - - -
Пофиг на функцию запомнить...
Вот типа авторизовался, побродил.
Вышел кука ид сессии удалилась, она ведь при закрытия браузера удаляется...
И эмм... все?
- - - -
Код:
<?php
 
if($_COOKIE['PHPSESSID'])
  {
    session_start();
  }
 
?>
Отредактировано tipsun (2011.04.17 12:12)
#49. НЕЗНАЙКА Off (11)
Участник
2011.04.17 13:01
Зачем вообще на куках делать? Сессия же интереснее  и никто не увидит хэш.
ДАУН-Данная Аватара Унаследована Незнайкой
#50. Gemorroj Off (107)
Administrator
2011.04.17 13:01
tipsun написал:
И эмм... все?
http://www.php.net/manual/en/function.s … params.php
#51. tipsun Off (19)
Moderator
2011.04.17 17:05
Nu3oN написал:
В общем глянь как это в роторе сделано! удобней чем каждый раз это все писать!
Да, спс, шикарно. И в конце разъединяет.
- - - -
Правда я пока и применять, и сам писать класс наверно не буду.
Я и в классы плохо понимаю и pdo только начал осваивать.
#52. tipsun Off (19)
Moderator
2011.09.13 21:09
Gemorroj написал:
tipsun написал:
И эмм... все?
http://www.php.net/manual/en/function.s … params.php
Код:
<?php
 
if (isset($_COOKIE['PHPSESSID'])) {
    
    session_set_cookie_params(1440'/''.'.$_SERVER['HTTP_HOST'], falsetrue);
    session_start();
  }
 
?>
#53. WapStyle Off (3)
Участник
2011.09.13 23:11
Шифруй пароли с мусором
md5($_POST['pass'].'мусор');

а потом проверяй пароль но подставляя мусор который ты заранее подставляеш

$pass = $_POST['pass'].'мусор';
if($pass == $user['pass']) echo 'ok'; else echo 'иди нах';
#54. Gemorroj Off (107)
Administrator
2011.09.13 23:11
это называется "соль", а не мусор)
#55. WapStyle Off (3)
Участник
2011.09.13 23:11
Гемор её поразному можно назвать ))
#56. TLENS Off (14)
Moderator
2011.09.13 23:11
Я вобще не пойму зачем шифровать.
#57. DarkRiDDeR Off (4)
Участник
2011.09.14 08:08
Ну кто-то спёр базу, допустим, а там пороли. Дык зашифрованные ещё надо расшифровать, а это большие проблемы, и если ещё получится это сделать.
Отредактировано DarkRiDDeR (2011.09.14 08:08)
#58. Gemorroj Off (107)
Administrator
2011.09.14 08:08
DarkRiDDeR, тут есть проблема с тем, что соль, как правило, хранится рядом с паролями. И при брутфорсе ее так же можно смешивать.
#59. DarkRiDDeR Off (4)
Участник
2011.09.14 13:01
Ну соль сильно не будет влиять на усложнение расшифровки, к тому же, если удасться расшифровать пару паролей, у них будет одинаковый конец - соль, хотя... Я думаю md5 хватит. Ну я использую md5(sha1()),  пусть расшифровывают, это намного труднее, чем всякие соль.
#60. tipsun Off (19)
Moderator
2011.09.14 23:11
WapStyle написал:
Шифруй пароли с мусором
md5($_POST['pass'].'мусор');

а потом проверяй пароль но подставляя мусор который ты заранее подставляеш

$pass = $_POST['pass'].'мусор';
if($pass == $user['pass']) echo 'ok'; else echo 'иди нах';
Это при сохранении в базу?
Я без соли сохранял.

При авторизации:
Ник / Пароль
Проверка в базе
1 Все совпадает, даем сессию занося туда ид/уровень (везде где надо проверка на сущ. сессии).
Хотя можно и в шапке сделать проверку. Или функцию сделать.
0 Просим повторить ввод данных.
Отредактировано tipsun (2011.09.14 23:11)
#61. TLENS Off (14)
Moderator
2011.09.15 01:01
Но зачем расшифровывать, если можно просто вставить в заголовок c куками и произвести авторизацию.
Я имею в виду шифровать пароль для записи в куку
Отредактировано TLENS (2011.09.15 01:01)
#62. Gemorroj Off (107)
Administrator
2011.09.15 08:08
это да, частая ошибка.
#63. DarkRiDDeR Off (4)
Участник
2011.09.15 09:09
Ну я про куки не говорил, в куки пароль воопще незачем пихать, хоть зашифрованны, хоть незашифрованный. Для авторизации существуют сесси, они для этого и созданы, и нечего делать авторизацию на куках: возможностей меньше и защита меньше.
#64. tipsun Off (19)
Moderator
2011.10.08 21:09
Или я снова, как всегда, не понимаю сути, или...

Все таки так, потому что это будет в шапке. А параметры мы задали в авторизации.
Код:
<?php
 
if (isset($_COOKIE['PHPSESSID'])) {
    
    session_start();
  }
 
?>
А так, при авторизации, если юзер нажмет запомнить.
Только вот сейчас вопрос возник, если юзер использовал сессию до истечения срока, например в 1 минуту, то удаление файла сессии снова отложится на 1440 сек или нет?

Код:
<?php
 
//session_set_cookie_params(1440, '/', '.'.$_SERVER['HTTP_HOST'], false, true);
 
ini_set('session.cookie_path''/');
ini_set('session.cookie_domain''.'.$_SERVER['HTTP_HOST']);
session_start();
 
?>
Отредактировано tipsun (2011.10.09 16:04)
#65. WapStyle Off (3)
Участник
2011.10.08 23:11
Давать пасс в куку (даже шифрованный) не есть айс. Как делаю я
1. При авторизации(успешной) в базу записыватся хеш(рандомный) для определённого юзера и этот же хеш даётся юзеру в куку
2. Если юзер покинул сайт (нажал выход) идёт уничтожение куки у юзера и смена хеш в базе на рандомный.
3. Пароль узнать невозможно и сменить тоже, даже если авторизация была успешной(если каким то макаром удалось своровать действуюбщий хеш), т.к. при смене попросит вести старый пароль.
Отсюда имеем у юзера нет хеша, а если он его сохранил он всёравно не подойдёт, т.к. при выходе скрипт скрипт сам поменял хеш. Если юзер боиться что его акк взломали просто нужно нажать выход и заново авторизироваться(хеш будет изменён)

Ну как так ))
#66. tipsun Off (19)
Moderator
2011.10.09 14:02
tipsun написал:
... Только вот сейчас вопрос возник, если юзер использовал сессию до истечения срока, например в 1 минуту, то удаление файла сессии снова отложится на 1440 сек или нет?
Время отсчитывается от последнеого обращения посетителя т.е. это время доступа к файлу, а не создания.
Отредактировано tipsun (2011.10.09 14:02)
#67. tipsun Off (19)
Moderator
2012.02.10 12:12
С механизмом запоминания наверно можно так поступить:
- при авторизации пользователь указывает сайту "запомни меня".
- сайт создает обычную сессию + куку, имя которой заносится в базу.
Если есть PHPSESSID у пользователя, значит не надо проверять куку.
Другое дело, если PHPSESSID есть, а файл сессии удалился...
Наверно проверить по куке и сгенерировать новый PHPSESSID.
Это я только сейчас додумался, точнее сама в голову пришла идея.
Хотя давно все так делают big_smile 100%
#68. Gemorroj Off (107)
Administrator
2012.02.10 17:05
можно еще при "запомни меня" время жизни сессии принудительно ставить большое.
#69. tipsun Off (19)
Moderator
2012.02.10 21:09
Получается session_id() в базу надо будет заносить.
Код напишу, выложу.
#70. tipsun Off (19)
Moderator
2012.02.10 23:11
Насчет сроков не посмотрел. Ну регерится с теми же сроками или нет.
Остальное за файлом/механизмом авторизации.
Код:
<?php
 
if (isset($_COOKIE['PHPSESSID'])) {
    session_start();
    
    if (! isset($_SESSION['SELF'])) {
        //Запрос к БД о наличии заданной session_id()
        //PHPSESSID=d65fjsmf8kc69ee8urb1glh855
        //Можно было бы и SELECT COUNT(1) FROM `users` WHERE `PHPSESSID`='d65fjsmf8kc69ee8urb1glh855'; +- LIMIT 1;
        //Но надо, наверно, вытащить какую-нибудь важную инфу, поэтому скорее всего...
        //SELECT `uid` FROM `users` WHERE `PHPSESSID`='d65fjsmf8kc69ee8urb1glh855' LIMIT 1;
        if (/*Подсчет кол-ва затронутых строчек*/) {
            $_SESSION = array();
            session_regenerate_id();
            $_SESSION['SELF'] = true;
            //выплевываем данные с массива базы в массив сессии...
        } else {
            //отрубить сессию, может быть.
        }
    }
}
Отредактировано tipsun (2012.02.10 23:11)
#71. Gemorroj Off (107)
Administrator
2012.02.11 09:09
$_COOKIE['PHPSESSID'] - лучше не использовать дефолтовое название, а ставить свое
#72. tipsun Off (19)
Moderator
2012.02.11 12:12
Код:
<?php
 
define('SESSION_NAME''SID');
session_name(SESSION_NAME);
 
if (isset($_COOKIE[SESSION_NAME])) {
    session_start();
    
    if (! isset($_SESSION['SELF'])) {
        //Запрос к БД о наличии заданной session_id()
        //PHPSESSID=d65fjsmf8kc69ee8urb1glh855
        //Можно было бы и SELECT COUNT(1) FROM `users` WHERE `PHPSESSID`='d65fjsmf8kc69ee8urb1glh855'; +- LIMIT 1;
        //Но надо, наверно, вытащить какую-нибудь важную инфу, поэтому скорее всего...
        //SELECT `uid` FROM `users` WHERE `PHPSESSID`='d65fjsmf8kc69ee8urb1glh855' LIMIT 1;
        if ($_/*Подсчет кол-ва затронутых строчек*/) {
            $_SESSION = array();
            session_regenerate_id();
            $_SESSION['SELF'] = true;
            //выплевываем данные с массива базы в массив сессии...
        } else {
            //отрубить сессию, может быть.
            $_SESSION = array();
            session_destroy();
            //$params = session_get_cookie_params();
            setCookie(SESSION_NAMEnull$_SERVER['REQUEST_TIME'] - 1);
            //Доконца не понял че там этот session_destroy(); делает.
            //Как я понял: не очищает массив сессии, и не удаляет куку.
        }
    }
}
Отредактировано tipsun (2012.02.11 13:01)
#73. Gemorroj Off (107)
Administrator
2012.02.11 13:01
да и не SID тоже, лучше подгонять под конкретный проект. на вапинете скажем, сессия SID может ставится и в блогах и на форуме. в таком случае они будут перезаписывать друг друга.
лучше называть что-то типа wapinet_blog, wapinet_forum и т.д.
#74. tipsun Off (19)
Moderator
2012.02.13 15:03
Чет не удаляется печенюха с "лисы".

Простая сессия, кука пропадает после закрытия браузера.
Чет она не удаляется. Видимо только при закрытии браузера only.
Или все-таки можно удалить?
Код:
<?php
define('SESSION_NAME''SID');
 
$_ session_get_cookie_params();
//setCookie(SESSION_NAME, null, $_SERVER['REQUEST_TIME'] - 1);
setCookie(SESSION_NAMEnull$_SERVER['REQUEST_TIME'] - 1$_['path'], $_['domain'], $_['secure'], $_['httponly']);
 
//session_set_cookie_params(null, '/', '.' . $_SERVER['HTTP_HOST'], false, true);
//session_name(SESSION_NAME);
//session_start();
 
echo $_COOKIE[SESSION_NAME];
Добавлено спустя   6 минут  39 секунд:
Все, я понял в чем дело. smile
Код:
echo '<pre>';
print_r(session_get_cookie_params());
echo '</pre>';
Отредактировано tipsun (2012.02.13 15:03)
#75. tipsun Off (19)
Moderator
2012.02.13 18:06
И зачем session_get_cookie_params() вообще нужна, если она нифига не работает...
Можно как-то о куке которая у браузера узнать побольше?
- - - -
Точнее работает, когда указано явно session_set_cookie_params() или через ini_set() наверно.
Отредактировано tipsun (2012.02.13 18:06)
#76. Gemorroj Off (107)
Administrator
2012.02.13 18:06
tipsun написал:
И зачем session_get_cookie_params() вообще нужна, если она нифига не работает...
работает в соответствии с документацией.
на серверных языках о куках особо инфы не получить. видимо.
#77. tipsun Off (19)
Moderator
2012.02.14 00:12
Код:
<?php
 
define('SLASH'DIRECTORY_SEPARATOR);
 
define('SESSION_NAME',                         'SID');
define('SESSION_LIFETIME',                    604800); //1 week/неделя
define('SESSION_PATH',                         SLASH);
define('SESSION_DOMAIN''.' $_SERVER['HTTP_HOST']);
define('SESSION_SECURE',                       false);
define('SESSION_HTTPONLY',                      true);
 
session_name(SESSION_NAME);
if (isset($_COOKIE[SESSION_NAME])) {
    session_start();
    if (! isset($_SESSION['SELF'])) {
        //Запрос к БД о наличии заданной session_id() а проще $_COOKIE[SESSION_NAME]
        //SELECT `uid` FROM `users` WHERE `PHPSESSID`='d65fjsmf8kc69ee8urb1glh855' LIMIT 1;
        $_SESSION = array(); //на всякий случай...
        if ($query_rowCount) {
            session_set_cookie_params(SESSION_LIFETIME,
                                      SESSION_PATH,
                                      SESSION_DOMAIN,
                                      SESSION_SECURE,
                                      SESSION_HTTPONLY);
            session_regenerate_id(true); //копирует инфу в новый файл + удаляет старый файл.
            $_SESSION['SELF'] = true//самоидентификация типа (есть файл или нет чтоб потом посмотреть).
            //выплевываем данные с массива базы в массив сессии...
        } else {
            session_destroy();
            setCookie(SESSION_NAME,
                      null,
                      0,
                      SESSION_PATH,
                      SESSION_DOMAIN,
                      SESSION_SECURE,
                      SESSION_HTTPONLY);
        }
    }
}
 
//echo '<pre>';
//print_r($_SESSION);
//echo '</pre>';
Добавлено спустя   8 минут  17 секунд:
Указал в параметрах куки сессии SESSION_LIFETIME из соображений, если пользователь зашел на сайт, а файла нет, то скорее всего его долго не было. А раз долго не было, а кука сохранилась, значит он нажимал на (запомнить).
Хотя может я и не прав. Время жизни файла сессии по умолчанию вроде, как помню, 1440 секунд
Отредактировано tipsun (2012.02.14 01:01)
#78. tipsun Off (19)
Moderator
2012.02.14 00:12
Ну можно довести сохранение файла сессии до 60*60*6 = 6 часов или сделать 12 часов, не знаю.
Вероятность ошибочного присвоения метки (запомнить) будет меньше, наверно...
Отредактировано tipsun (2012.02.14 00:12)
#79. tipsun Off (19)
Moderator
2012.02.14 14:02
Вроде, готово.
Код:
<?php
//+ Это можно отдельно где-то держать...
define('DS'DIRECTORY_SEPARATOR);
 
define('SESSION_NAME',                         'SID');
define('SESSION_LIFETIME',                    604800); //1 week/неделя
define('SESSION_PATH',                            DS);
define('SESSION_DOMAIN''.' $_SERVER['HTTP_HOST']);
define('SESSION_SECURE',                       false);
define('SESSION_HTTPONLY',                      true);
//- Это можно отдельно где-то держать...
include_once 'db.php'//PDO Driver
 
session_name(SESSION_NAME);
if (isset($_COOKIE[SESSION_NAME])) {
    session_start();
    if (! isset($_SESSION['SELF'])) {
        $_SESSION = array();
        $query $db->prepare("SELECT `uid` FROM `users` WHERE `session_id`=? LIMIT 1;");
        $query->execute(array($_COOKIE[SESSION_NAME]));
        if ($query->rowCount()) {
            $_SESSION['SELF'] = true;
            session_set_cookie_params(SESSION_LIFETIME,
                                      SESSION_PATH,
                                      SESSION_DOMAIN,
                                      SESSION_SECURE,
                                      SESSION_HTTPONLY);
            session_regenerate_id(true);
            $_SESSION += $query->fetch(PDO::FETCH_ASSOC);
            $query $db->prepare("UPDATE `users` SET `session_id`=:new WHERE `session_id`=:old LIMIT 1;");
            $query->execute(array(':old' => $_COOKIE[SESSION_NAME], ':new' => $_COOKIE[SESSION_NAME] = session_id()));
        } else {
            session_destroy();
            setCookie(SESSION_NAME,
                      null//Session value
                      0,    //Session lifetime
                      SESSION_PATH,
                      SESSION_DOMAIN,
                      SESSION_SECURE,
                      SESSION_HTTPONLY);
        }
    }
}
 
///*
echo '<pre>';
print_r($_COOKIE);
echo '</pre>';
//*/
Отредактировано tipsun (2012.02.16 17:05)
#80. tipsun Off (19)
Moderator
2012.02.29 16:04
В базе нужно будет помимо `session_id` сделать еще `session_expire`, а то кука удалится, а поле в базе с этим `session_id` будет активна.
Мне так кажется.
Отредактировано tipsun (2012.02.29 16:04)
#81. tipsun Off (19)
Moderator
2012.03.04 03:03
Код:
<?php
 
/*
-- +MySQL
-- Table structure for table `users`
--
 
CREATE TABLE IF NOT EXISTS `users` (
  `user_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `session_id` varchar(32) NOT NULL,
  `session_expire` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  KEY `session_id` (`session_id`),
  KEY `session_expire` (`session_expire`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=120 ;
 
--
-- Dumping data for table `users`
--
 
INSERT INTO `users` (`user_id`, `session_id`, `session_expire`) VALUES
(1, '12345', '2012-03-05 14:23:59');
-- -MySQL
*/
 
//define('SESSION_NAME',                 'SID_CAPTCHA');
//define('SESSION_NAME',                 'SID_SPECIAL');
define('SESSION_NAME',                   'SID_DEFAULT');
define('SESSION_EXPIRE',                        129600);
define('SESSION_PATH',             DIRECTORY_SEPARATOR);
define('SESSION_DOMAIN', ('.' $_SERVER['HTTP_HOST']));
define('SESSION_SECURE',                         false);
define('SESSION_HTTPONLY',                        true);
 
define('TIMESTAMP''Y-m-d H:i:s');
 
//ini_set('display_errors', 1);
//error_reporting(E_ALL);
 
//include_once 'db.php'; //PDO Driver
 
/*
setCookie(SESSION_NAME,
          '12345', //Session value
          SESSION_EXPIRE + $_SERVER['REQUEST_TIME'],    //Session lifetime
          SESSION_PATH,
          SESSION_DOMAIN,
          SESSION_SECURE,
          SESSION_HTTPONLY);
*/
 
//$_COOKIE['someKey'] = 'someValue';
 
session_name(SESSION_NAME);
if (isset($_COOKIE[SESSION_NAME])) {
    
    session_start();
    
    if (! isset($_SESSION['SELF'])) {
        
        $_SESSION = array();
        $query $db->prepare("SELECT `user_id` FROM `users` WHERE `session_id` = ? AND `session_expire` > NOW() LIMIT 1;");
        //$query = $db->prepare("SELECT `user_id` FROM `users` WHERE `session_expire` > NOW() AND `session_id` = ? LIMIT 1;");
        //$query = $db->prepare("SELECT `user_id` FROM `users` WHERE `session_expire` > '" . date(TIMESTAMP) . "' AND `session_id` = ? LIMIT 1;");
        $query->execute(array($_COOKIE[SESSION_NAME]));
        
        if ($query->rowCount()) {
            
            $_SESSION['SELF'] = true;
            session_set_cookie_params(SESSION_EXPIRE,
                                      SESSION_PATH,
                                      SESSION_DOMAIN,
                                      SESSION_SECURE,
                                      SESSION_HTTPONLY);
            session_regenerate_id(true);
            $_SESSION += $query->fetch();
            $query $db->prepare("UPDATE `users` SET `session_expire` = NOW() + INTERVAL '" SESSION_EXPIRE "' SECOND, `session_id` = :new WHERE `session_id` = :old LIMIT 1;");
            //$query = $db->prepare("UPDATE `users` SET `session_expire` = '" . date(TIMESTAMP, SESSION_EXPIRE + $_SERVER['REQUEST_TIME']) . "', `session_id` = :new WHERE `session_id` = :old LIMIT 1;");
            $query->execute(array(':old'  => $_COOKIE[SESSION_NAME],
                                  ':new'  => $_COOKIE[SESSION_NAME] = session_id()));
        }
        else {
            
            session_destroy();
            setCookie(SESSION_NAME,
                      null//Session value.
                      0,    //Session expire.
                      SESSION_PATH,
                      SESSION_DOMAIN,
                      SESSION_SECURE,
                      SESSION_HTTPONLY);
            unSet($_COOKIE[SESSION_NAME]);
        }
    }
}
 
//*
echo '<pre>';
print_r($_COOKIE);
print_r($_SESSION);
echo '</pre>';
//*/
Отредактировано tipsun (2012.03.04 12:12)
#82. tipsun Off (19)
Moderator
2012.03.04 12:12
Вопрос, как лучше?
Средствами MySQL пользоваться NOW(), INTERVAL или средствами php?
#83. Gemorroj Off (107)
Administrator
2012.03.04 12:12
ключ с session_expire вероятно лучше убрать
Добавлено спустя    14 секунд:
лучше mysql
#84. tipsun Off (19)
Moderator
2012.03.04 12:12
Ок. Спс.
#85. tipsun Off (19)
Moderator
2012.03.04 13:01
Код:
<?php
 
-- нет
WHERE `session_expire` > NOW() AND `session_id` = ?
 
-- да
WHERE `session_id` = ? AND `session_expire` > NOW()
Отредактировано tipsun (2012.03.04 13:01)
#86. tipsun Off (19)
Moderator
2012.03.09 01:01
Только сейчас додумался, что можно пароль и потом проверить. Вот дурья башка.
Обычно с запросом проверяется.

Код:
<?php
 
$getName     $_GET['name'];
$getPassword $_GET['password'];
 
$query $db->prepare("SELECT `user_id`, `user_password` FROM `users` WHERE `user_name` = ? LIMIT 1;");
$query->execute(array($getName));
$result $query->rowCount();
 
if ($result and isSet($_GET['auth'])) {
    
    $array $query->fetch();
    
    if ($array['user_password'] == md5($getPassword)) {
        
        // Добро пожаловать.
        exit('1');
    }
    else {
        
        // Неверный пароль.
        exit('2');
    }
}
else if (! $result and isSet($_GET['save'])) {
    
    $db->prepare("INSERT INTO `users`(`user_name`, `user_password`) VALUES(?, ?);")->execute(array($getNamemd5($getPassword)));
    
    // Теперь вы пользователь.
    exit('3');
}
else {
    
    // Нет такого пользователя.
    // Или имя пользователя занято.
    // Или не нажали кнопку.
    
    if (isSet($_GET['auth'])) exit('4');
    else if (isSet($_GET['save'])) exit('5');
    else exit('6');
}
Отредактировано tipsun (2012.03.09 01:01)
#87. tipsun Off (19)
Moderator
2012.06.29 10:10
Хотел в класс запихать код для старта сессии при получении печеньки и при присутствии/отсутствии файла сессии, но чет не знаю как практичней.
Не хочу трогать базу, ну через конструктор заносить сингтон базы.
Я за независимость smile
Просто почитал чуть про хороший код. И типа лучше всего, когда класс не зависит от другого класса/кода.
Добавлено спустя   1 минуту  9 секунд:
Сейчас наброски скину.
#88. tipsun Off (19)
Moderator
2012.06.29 12:12
Еще думал, как принимать тучу параметров печенья.
Была мысль о ini_set()
Но потом подумал, это на 1 раз или нет,
т.к. другие скрипты тоже могут использовать сессию.
Код:
<?php
 
class Ticket
{
 
// Набросок.
 
    const LONG 129600;
    
    private $_id;
    
    public function __construct ($var)
    {
        if (isset($_COOKIE[$var])) {
            
            session_name($var);
            session_start();
            
            $this->_id $var;
        }
    }
    
    public function isCorrect ()
    {
        if (isset($_SESSION[$_COOKIE[$this->_id]])) {
            
            return true;
        }
        else {
            
            return false;
        }
    }
    
    public function register ()
    {
        $_SESSION = array();
        session_set_cookie_params(SESSION_EXPIRE,
                                  SESSION_PATH,
                                  SESSION_DOMAIN,
                                  SESSION_SECURE,
                                  SESSION_HTTPONLY);
        session_regenerate_id(true); // если сессия не запущена, то функция сработает, откроет новую сессию?
        $_COOKIE[$this->_id] = session_id();
    }
    
    public function unregister ()
    {
        setcookie($this->_id,
                  null//Session value.
                  0,    //Session expire.
                  SESSION_PATH,
                  SESSION_DOMAIN,
                  SESSION_SECURE,
                  SESSION_HTTPONLY);
        unset($_COOKIE[SESSION_NAME], $_SESSION);
        session_destroy();
    }
}
Добавлено спустя   5 минут  54 секунды:
Можно сказу задать параметры через конструктор или потом в методе указывать...
Добавлено спустя   6 минут  55 секунд:
Или плюнуть на файлы и сделать класс на базе?
Отредактировано tipsun (2012.06.29 12:12)
#89. Gemorroj Off (107)
Administrator
2012.06.29 13:01
файлы в случае с сессиями устроят в 95% случаев, так что замачиваться я бы не стал. либо сразу писать прослойки для работы с сессиями в разных хранилищах.
#90. tipsun Off (19)
Moderator
2012.06.29 13:01
Ну если файлы использовать.
Просто прослойку хочу сделать.
#91. tipsun Off (19)
Moderator
2012.06.29 17:05
Хм. А что мне мешает сделать все без сессии?
В базе есть поле для cookie_id по нему пусть и получают доспуп пользователи. Какого фига сессия нужна там? smile
Чем сессия будет каждый раз open+unserialize лучше уж запрос в базу.
Может понадобиться обычная сессия для captcha только наверно.
#92. tipsun Off (19)
Moderator
2012.06.29 18:06
Либо у меня горячка, либо озарение простых вещей smile
Хотя если файл сессии сохранился, то в принципе все будет быстро...
Код:
<?php
 
//Набросок.
 
//+ SESSION//
//! KEY `session_id`
 
if (isset($_COOKIE[SESSION_NAME])) {
/*
    session_name(SESSION_NAME);
    session_start();
    
    if (! isset($_SESSION[SESSION_NAME])) {
        
        $_SESSION = array();
*/
        $result $db->prepare("SELECT `users`.`user_id`, `users`.`user_title`, `users`.`user_sex`, `users`.`user_name` FROM `users` WHERE `users`.`session_id` = ? AND `users`.`session_expire` > NOW() LIMIT 1;");
        $result->execute(array($_COOKIE[SESSION_NAME]));
        
        if ($result->rowCount()) {
/*
            $_SESSION[SESSION_NAME] = true;
            session_set_cookie_params(SESSION_EXPIRE,
                                      SESSION_PATH,
                                      SESSION_DOMAIN,
                                      SESSION_SECURE,
                                      SESSION_HTTPONLY);
            session_regenerate_id(true);
            $_SESSION += $result->fetch();
*/
            $user $result->fetch();
            /*$result = $db->prepare("UPDATE `users` SET `users`.`session_expire` = NOW() + INTERVAL '" . SESSION_EXPIRE . "' SECOND, `users`.`session_id` = :new WHERE `users`.`session_id` = :old LIMIT 1;");
            $result->execute(array(':old' => $_COOKIE[SESSION_NAME],
                                   ':new' => $_COOKIE[SESSION_NAME] = session_id()));*/
        }
        else {
            
            setcookie(SESSION_NAME,
                      null//Session value.
                      0,    //Session expire.
                      SESSION_PATH,
                      SESSION_DOMAIN,
                      SESSION_SECURE,
                      SESSION_HTTPONLY);
/*          unset($_COOKIE[SESSION_NAME], $_SESSION);
            session_destroy();
*/
        }
  //}
}
//- SESSION//
Добавлено спустя   1 минуту  56 секунд:
Отредактировано tipsun (2012.06.29 18:06)
#93. tipsun Off (19)
Moderator
2012.06.29 18:06
Cookie сгенерировать и засунуть в базу. Срок годности 3 дня, допустим. Или как-то так.
#94. tipsun Off (19)
Moderator
2012.06.30 00:12
Да, на этом форуме вроде, как я посмотрел, такая же схема.
Отредактировано tipsun (2012.06.30 00:12)
#95. tipsun Off (19)
Moderator
2012.06.30 17:05
Если без срока в базе, то можно будет взломать, нет?
Зато намного быстрее работать будет.
#96. WapStyle Off (3)
Участник
2012.07.03 21:09
Выдавай в куки временный хеш...например если чел авторизировался ему в куки хеш..вышел кеш заменяется на любой случайный...если не дурак поймёш
Отредактировано WapStyle (2012.07.03 21:09)
#97. tipsun Off (19)
Moderator
2012.07.03 23:11
WapStyle, спасибо за идею. smile
Добавлено спустя   8 минут  20 секунд:
Так.
У меня, типа smile , есть отдельная таблица с активными/онлайн. Может сделать раздельно?
Там у меня записи не удаляются. (REPLACE).
Можно, в принципе зачищать поля с id=0 т.к. гости его не имеют.
Значит вполне возможен вариант с проверкой юзеров, которые не подавали активности, скажем, 20 часов.

Код:
<?php
 
//+ ACTIVITY//
$qt 'REPLACE `activity` '
    "SET `activity`.`active_id` = '" . ((int) @$user['id']) . "', "
    '`activity`.`active_ip` = ?, '
    '`activity`.`active_browser` = ?, '
    "`activity`.`active_point` = NOW() + INTERVAL '" $ini['activityExpire'] . "' SECOND;";
 
$db->prepare($qt)
   ->execute(array($_SERVER['REMOTE_ADDR'],
                   $_SERVER['HTTP_USER_AGENT']));
//- ACTIVITY//
 
/*
в $ini у меня типа настройки стандартные или замещеные с базы.
Сейчас подумал, что типа зачем вытаскивать настройки, когда наверно там же в запросе можно обратиться к таблице с настройками. Или такого рода настройки вообще в константу? ХЗ.
*/
Отредактировано tipsun (2012.07.03 23:11)
#98. tipsun Off (19)
Moderator
2012.07.03 23:11
Потом еще подумаю.
#99. tipsun Off (19)
Moderator
2012.07.06 14:02
WapStyle, да. Очень хорошее решение.
Запланировать каждую ночь 1 проверку.
У кого есть отметка запомнить, оставлять куку. Другим очищать в базе поле кука_ид. smile
#100. tipsun Off (19)
Moderator
2012.07.06 17:05
Это уже раздел cron наверно. Надо будет почитать что и как там.
#101. tipsun Off (19)
Moderator
2012.07.12 14:02
Чет я не понял что да как там.
Только как задания прописывать понял:
Показать скрытый текст
#102. Gemorroj Off (107)
Administrator
2012.07.12 18:06
ну этого и достаточно.
#103. tipsun Off (19)
Moderator
2012.07.20 14:02
Допустим можно узнать папку с PHP:
Код:
<?php
echo $_ENV['PHPRC'];
Можно узнать путь к файлу исполнения:
Код:
<?php
echo __FILE__;
А куда пихать созданный файл cgi непонятно.

Еще думал насчет другого варианта:
Код:
<?php
 
//Набросок
 
require_once 'cfg.php'//Есть массив $cfg с настройками, котрые могут быть замещены настройками с базы.
 
//$db = DB::singleton();
 
//Add settings//
//$cfg += $db->query('SELECT * FROM `cfg`;')->fetchAll(); 
 
//+ SESSION//
//! KEY `session_id`
 
if (@$_COOKIE[$cfg['cookie_name']]) {
    
    $qt 'SELECT * '
        'FROM `users` '
        'WHERE `users`.`cookie_id` = ? '
        'LIMIT 1;';
    
    $q $db->prepare($qt);
    $q->execute(array($_COOKIE[$cfg['cookie_name']]));
    
    if ($q->rowCount()) {
        
        $user += $q->fetch();
        
        //Regenerate//..............//TIMESTAMP (Не люблю UNIX_TIMESTAMP, хотя было бы куда проще)//
        if (date_format(date_create($user['cookie_regenerate_interval']), 'Ymd') < date('Ymd')) {
            
            $hash md5(microtime());
            
            $db->query('UPDATE `users` '
                       "SET `cookie_regenerate_interval` = NOW() + INTERVAL '"
                       . ((int) $cfg['cookie_regenerate_interval']['value']) . "' "
                       . ((int) $cfg['cookie_regenerate_interval']['format']) // sec.||min.||etc.
                       ", `users`.`cookie_id` = '" $hash "' "
                       "WHERE `users`.`user_id` = '" $user['user_id'] . "' "
                       'LIMIT 1;');
            
            setcookie($cfg['cookie_name'],
                      $_COOKIE[$cfg['cookie_name']] = $hash,
                      $cfg['cookie_expire'],
                      $cfg['cookie_path'],
                      $cfg['cookie_domain'],
                      $cfg['cookie_secure'],
                      $cfg['cookie_httpOnly']);
        }
    }
    else {
        
        setcookie($cfg['cookie_name'],
                  null,
                  0,
                  $cfg['cookie_path'],
                  $cfg['cookie_domain'],
                  $cfg['cookie_secure'],
                  $cfg['cookie_httpOnly']);
        
        unset($_COOKIE[$cfg['cookie_name']], $user);
    }
}
//- SESSION//
И думал может нафиг это все,
использовать стандартный путь.
#104. Gemorroj Off (107)
Administrator
2012.07.20 15:03
$hash = md5(microtime()); // тут microtime массив вернет. а md5 просит строку
лучше замени все это на uniqid() например
ну и так, напомню такой термин - KISS
#105. tipsun Off (19)
Moderator
2012.07.20 16:04
Gemorroj написал:
$hash = md5(microtime()); // тут microtime массив вернет. а md5 просит строку
Код:
<?php // v5.2.12
 
var_dump(micro_time());
//string(21) "0.11501000 1342787062"
#106. Gemorroj Off (107)
Administrator
2012.07.20 16:04
tipsun
да, запамятовал уже( чаще пользуются microtime(true)
#107. tipsun Off (19)
Moderator
2012.07.20 20:08
Gemorroj написал:
ну и так, напомню такой термин - KISS
Это к алгоритму или ко времени относится в данном случае?
#108. tipsun Off (19)
Moderator
2012.07.20 21:09
Надо будет срок_актуальности_печеньки хранить в UNIX_TIMESTAMP.
Отредактировано tipsun (2012.07.21 01:01)
#109. tipsun Off (19)
Moderator
2012.07.22 21:09
Лучше?

Код:
<?php
 
//+ SESSION//
//! KEY `session_id`
 
if (@$_COOKIE[$cfg['cookie_name']]) {
    
    $qt 'SELECT * '
        'FROM `users` '
        'WHERE `users`.`cookie_id` = ? '
        'LIMIT 1;';
    
    $q $db->prepare($qt);
    $q->execute(array($_COOKIE[$cfg['cookie_name']]));
    
    if ($q->rowCount()) {
        
        $user += $q->fetch();
        
        if ($user['cookie_timestamp'] < $_SERVER['REQUEST_TIME']) {
            
            $_COOKIE[$cfg['cookie_name']] = md5(uniqid());
            
            $db->query('UPDATE `users` '
                       "SET `users`.`cookie_timestamp` = '"
                       . ($_SERVER['REQUEST_TIME'] + (int) $cfg['cookie_lifeTime']) . "', "
                       "`users`.`cookie_id` = '" $_COOKIE[$cfg['cookie_name']] . "' "
                       "WHERE `users`.`user_id` = '" $user['user_id'] . "' "
                       'LIMIT 1;');
            
            setcookie($cfg['cookie_name'],
                      $_COOKIE[$cfg['cookie_name']],
                      $cfg['cookie_expire'],
                      $cfg['cookie_path'],
                      $cfg['cookie_domain'],
                      $cfg['cookie_secure'],
                      $cfg['cookie_httpOnly']);
        }
    }
    else {
        
        setcookie($cfg['cookie_name'],
                  null,
                  0,
                  $cfg['cookie_path'],
                  $cfg['cookie_domain'],
                  $cfg['cookie_secure'],
                  $cfg['cookie_httpOnly']);
        
        unset($_COOKIE[$cfg['cookie_name']], $user);
    }
}
//- SESSION//
#110. Gemorroj Off (107)
Administrator
2012.07.23 00:12
лучше. но UPDATE тоже переделай на параметризованный запрос. так же проверяй не только $q->rowCount() но и чтобы execute возвратил true
#111. tipsun Off (19)
Moderator
2012.07.23 00:12
Ok. Спс.
#112. tipsun Off (19)
Moderator
2012.07.26 14:02
Как-то так?
Код:
<?php
 
//DB//
$db DB::singleton();
//COOKIES//
$user = array();
if (@$_COOKIE[INI_COOKIE_NAME]) {
    // INDEX KEY `cookie_id`
    $qt 'SELECT * '
        'FROM `users` '
        'WHERE `users`.`cookie_id` = ? '
        'LIMIT 1;';
    
    $args = array($_COOKIE[INI_COOKIE_NAME]);
    
    $q $db->prepare($qt);
    // Fixed
    if ($q and $q->execute($args) and $q->rowCount()) {
        
        $user $q->fetch();
        
        if ($user['cookie_timestamp'] < $_SERVER['REQUEST_TIME']) {
            
            $_COOKIE[INI_COOKIE_NAME] = md5(uniqid());
            
            $qt 'UPDATE `users` '
                'SET `users`.`cookie_timestamp` = ?, '
                '`users`.`cookie_id` = ? '
                'WHERE `users`.`user_id` = ? '
                'LIMIT 1;';
            
            $args = array($_SERVER['REQUEST_TIME'] + INI_COOKIE_LIFETIME,
                          $_COOKIE[INI_COOKIE_NAME],
                          $user['user_id']);
            
            if ($db->prepare($qt)->execute($args)) {
                
                setcookie(INI_COOKIE_NAME,
                          $_COOKIE[INI_COOKIE_NAME],
                          INI_COOKIE_EXPIRE,
                          INI_COOKIE_PATH,
                          INI_COOKIE_DOMAIN,
                          INI_COOKIE_SECURE,
                          INI_COOKIE_HTTPONLY);
            }
        }
    }
    else {
        
        setcookie(INI_COOKIE_NAME,
                  null,
                  0,
                  INI_COOKIE_PATH,
                  INI_COOKIE_DOMAIN,
                  INI_COOKIE_SECURE,
                  INI_COOKIE_HTTPONLY);
        
        unset($_COOKIE[INI_COOKIE_NAME]);
    }
}
Отредактировано tipsun (2012.07.27 18:06)
#113. Gemorroj Off (107)
Administrator
2012.07.26 15:03
$q в пером запросе тоже проверяй
#114. tipsun Off (19)
Moderator
2012.07.26 15:03
Так вроде проверяется.
Код:
<?php
 
$q $db->prepare($qt);
    
    if ($q->execute($args) and $q->rowCount()) {}
#115. Gemorroj Off (107)
Administrator
2012.07.26 19:07
Код:
<?php
if ($q && $q->execute($args) and $q->rowCount()) {}
Отредактировано tipsun (2012.07.27 04:04)
#116. tipsun Off (19)
Moderator
2012.07.26 19:07
Ого.
Ну да, логично. prepare().
Отредактировано tipsun (2012.07.26 19:07)
#117. tipsun Off (19)
Moderator
2012.07.27 22:10
Я решил fetch() тоже не обременять.
Код:
<?php
    if ($q and
        $q->execute($args) and
        $q->rowCount() and
        $user $q->fetch() and
        // гулять так гулять.
        $user['cookie_timestamp'] < $_SERVER['REQUEST_TIME']) {
        
        $_COOKIE[INI_COOKIE_NAME] = md5(uniqid());
        //...
    }
Отредактировано tipsun (2012.07.27 22:10)
#118. tipsun Off (19)
Moderator
2012.07.30 20:08
habrahabr.ru/post/13726 - хорошая статья.
Добавлено спустя   4 минуты  9 секунд:
- Поле Cookie_timestamp наверно лишнее. Можно и auth_timestamp, время последней авторизации, использовать.
- Привязку к ип попробую прикрутить
- Еще забыл проверять remember - при регенерации печенья чтоб нужный срок действия задать.
#119. Gemorroj Off (107)
Administrator
2012.07.30 21:09
tipsun, 2007 год)
#120. tipsun Off (19)
Moderator
2012.07.30 22:10
Да..., не умею я пользоваться поисковиком. smile
Страниц: 110 11 12 Все
Главная
WEB
PunBB Mod v0.6.2
0.097 s