nord » 2011.02.19 21:32

вобщем меня давно интересует такой вопрос , есть пароль я зашифровал его в md5 потом еще в base64
но если украсть этот хеш то с ним можно зайти спокойно на сайт под чужим паролем
помогите пожалуйста как сделать такую авторизацию правильно и безопасно чтобы при �раже хеша не смогли авторизоваться под чужим паролем?

DarkDaNTe » 2011.02.19 22:00

А как авторизоваться-то? base64 - бред

TLENS » 2011.02.19 23:10

nord
Наоборот надо было сразу в base64 потом в md5
А еще лучше md5(md5($pass))
Добавлено спустя   1 минуту  26 секунд:
А воще зачем ты шифровал его в куку?

Gemorroj » 2011.02.19 23:24

не нужно было тут base64 ни в каком варианте

nord » 2011.02.20 08:18

а как это все правильно сделать дайте маленький пример? Чтобы понять как это работает с куками не работал ни когда

DarkDaNTe » 2011.02.20 17:46

$pass = md5($_POST['pass']);
А дальше setcookie

Gemorroj » 2011.02.20 18:49

вообще, не нужно хранить в куках пароль. там нужно хранить идентификатор сессии. а в самой сессии уже все данные.

TLENS » 2011.02.20 19:19

DarkDaNTe написал:

$pass = md5($_POST['pass']);
А дальше setcookie

И что это будет?
Если я правильно понял ты хочешь записать хеш пароля в куку а потом сравнивать с хешом в базе?
Ни вкоем случае так не делай.
Смысл тогда его хешироват? А нету
Так как если солют базу, ни каким образом нельзя дать доступ к учетке через хеш.
А так просто стоит себе в куку вставить хеш и впирет доступ открыт.
А хотя я думаю если смогут базу слить то и получить доступы не составит труда

nord » 2011.02.21 08:02

Gemorroj написал:

вообще, не нужно хранить в куках пароль. там нужно хранить идентификатор сессии. а в самой сессии уже все данные.

да да оно самое а как это правильно сделать можно поподробнее пожалуйста?

Gemorroj » 2011.02.21 10:29

ну что еще можно рассказать-то? конкретней вопрос задай.

nord » 2011.02.21 10:38

как это делать и как потом это все проверять можно маленький пример пожалуйста?

Gemorroj » 2011.02.21 10:51

Код:

1
span style="color: #0000BB"><?phpsession_start();if (isset($_SESSION['id'])) { echo 'Ваш ID: ' . $_SESSION['id'];} else { echo 'Вы не залогинены.';}
nord » 2011.02.21 12:49

на сессиях я делал авторизацию , и на куках тоже получаеться но журил я хеш возьму  и вставлю на другом компе в оперу то я авторизуюсь под этой учетной записью, или от этого защититься нельзя?

Gemorroj » 2011.02.21 13:02

да, вставишь. защититься можно проверяя IP, Браузер, их сочетание.

nord » 2011.02.21 15:06

а как можно по ip проверить если но динамический?

Gemorroj » 2011.02.21 15:11

никак.

TLENS » 2011.02.21 18:19

Ну можно создать таблицу в её писать id юза и какой нибудь хеш ну и браузер хеш отправить в куку а и после простоя сесии сравнить хеш браузер ну и еще какие то данные это на сколько фантазии хватит и если все сходится авторизовуем ну и меняем хеш.
Добавлено спустя   3 минуты  20 секунд:
Ну я думаю надо по любому и себе делать авто авторизацию а то часто бывало пишу какое то сообщение мучаюсь тут жму отправить а оно мне вы не авторизованы. Жмем назад а кеширование понятно отключено

TLENS » 2011.02.21 18:30

Ну или время жизни сессии поставить на 5 часов

nord » 2011.02.21 21:40

спасибо большое всем за помощь хоть немного разобрался)

Istsam » 2011.02.22 12:52

а можно $pass = md5(base64($_POST['pass']));
Добавлено спустя   1 минуту :
или же

Код:

1
span style="color: #0000BB"><?phpfunction mdQ($var){ return md5(base64_encode($var) . 'MyBlog');}?>
TLENS » 2011.02.22 22:10

Istsam
Ну можно и по ключю
Но base64 там не нужен

Vynderkind » 2011.03.30 03:15

если делать с помощю сесии то авторизация не будет слетать?

Gemorroj » 2011.03.30 08:20

всегда есть вероятность потери сессии (пользователь удалил куку, на сервере что-то случилось с хранилищем сессий...)

НЕЗНАЙКА » 2011.04.01 18:40

Или же место на сервере закончилось! Я у себя в подержку написал о переполнении дык сказали сделаем. Неделю где-то папка сессии растет:-) круто, да?
Я, допустим, делал так: в таблицу юзеров пишу случайный хэш, его же и в сессию + проверка по ip.

tipsun » 2011.04.09 23:57

Я вообще не понимаю что к чему тут, но хочу разобраться :)

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

.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==
Последняя кажется всегда постоянна...

Код:

1
span style="color: #0000BB"><?phpif(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); }?>
Gemorroj » 2011.04.10 00:04

http://php.net/session_start ответы всегда в мануале.
bool session_start ( void )

tipsun » 2011.04.10 00:38

Это кто там такую фигню в посте #25 пишет??! :D

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

Код:

1
span style="color: #0000BB"><?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 13:43

Вот я не пойму, зачем в куки все суют браузеры, ипы... Он же на отдельном компе каждого хранится.
----
Узнал, как можно продлить жизнь файла сессии, просто создать для него отдельную папку и если можно там, где нет доступа.

Код:

1
span style="color: #0000BB"><?phpini_set('session.save_path', $_SERVER['DOCUMENT_ROOT'] .'../sessions/');

Базу не трогать, т.к. все равно с файла вытащить это все быстрее будет, как я понял.

Gemorroj » 2011.04.10 13:51

что за дибилизм, трудно в мануал заглянуть?
http://www.php.net/manual/en/session.co … axlifetime
а save_path только меняет папку для хранения сессий.
Добавлено спустя   1 минуту  23 секунды:
нет, из БД быстрее, особенно когда сессий много. еще быстрее мемкеш.

tipsun » 2011.04.10 13:58

http://habrahabr.ru/blogs/php/28418/ o_O
- - - -
А епт, это для виртуального хостинга.

Gemorroj » 2011.04.10 14:14

там просто проблема с тем, что папка переполнялась.

tipsun » 2011.04.10 14:16

Понял. СПС.
В след раз в ману лезть буду...

tipsun » 2011.04.10 16:14

Вот shit, поговнокодить не дают... http://phpfaq.ru/sessions

Nu3oN » 2011.04.10 21:53

Зачем так мудрить? чем обычный подход к этому делу не устроил?

tipsun » 2011.04.10 23:01

Не, ну там написано типа для гостей не надо сессию начинать, как я понял.
Не надо старые сессии продолжать при получении куков, а стартовать новую с данными юзера.
- - - -
А если так делать, то надо в базу лезть.
И если даже для гостей сессию не начинать, то как captcha будет работать.
В принципе в этой сессии кроме ид, статуса и каптчи ниче не хранится у меня.
- - - -
Я в принципе писал, что пока не разбираюсь в этих делах, но хочу разобраться.
Там пример тоже приводится в конце статьи...

tipsun » 2011.04.11 22:39

Заблудился я совсем...

tipsun » 2011.04.12 14:58

Набросок

Код:

1
span style="color: #0000BB"><?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($query, MYSQL_ASSOC); $_SESSION['id'] = $array['id']; //Из базы будет извлекаться... $_SESSION['team'] = $array['team']; //Из базы будет извлекаться... $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; header('Location: http://'.$_SERVER['HTTP_HOST']); exit; } else { //переадресация на страницу авторизации. } } else { //переадресация на страницу авторизации. } }?>
Gemorroj » 2011.04.12 16:02

перед тем как делаешь session_destroy сделай еще и $_SESSION = null;
и пиши имена функций с маленькой буквы не  Session_Destroy, а  session_destroy.
а вообще не вижу смысла делать session_destroy, а затем сразу же делать session_start.

DarkDaNTe » 2011.04.12 19:22

Код:

1
span style="color: #0000BB"><?phpunset($_COOKIE['PHPSESSID']);?>

и почитай как удалять куки еще

tipsun » 2011.04.12 20:06

Спс всем. Буду еще думать.

Подумал:

Код:

1
span style="color: #0000BB"><?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($query, MYSQL_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.13 18:29

Вот сделал. Подскажите пожалуйста, нет ли ошибок? А то я вот только начал use PDO...

Код:

1
span style="color: #0000BB"><?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ый меняется.

Nu3oN » 2011.04.14 00:04

вместо $db->exec("SET NAMES 'utf8';"); делай так

Код:

1
span style="color: #0000BB"><?php$db = new PDO($host_db, $user, $pass, array(PDO :: MYSQL_ATTR_INIT_COMMAND => 'SET NAMES `utf8`'));?>

Вместо fetch(PDO::FETCH_ASSOC); укажи один раз, и вс =)

Код:

1
span style="color: #0000BB"><?php$db-> setAttribute(PDO :: ATTR_DEFAULT_FETCH_MODE, PDO :: FETCH_ASSOC);?>

Вот это:

Код:

1
span style="color: #0000BB"><?php$stmt = $db -> prepare("...");$stmt -> execute(array(...));$stmt -> closecursor();?>

Сделай как плагинизацию (в котором ты будешь разширять класс пдо) такой метод

Код:

1
span style="color: #0000BB"><?phpclass 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; }}?>

В общем глянь как это в роторе сделано! удобней чем каждый раз это все писать!

tipsun » 2011.04.14 00:09

Спс :)
Как будет время рассмотрю остальную половину сообщения. Под рукой компа нет... С моб не удобно...
Как бы мне снова не заблудиться :)

Gemorroj » 2011.04.14 11:29

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 кодировку можно указвыать прямо в строке подключения

tipsun » 2011.04.14 12:01

Ахринеть, это только сессия! :D

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

Код:

1
span style="color: #0000BB"><?php$time = $_SERVER['REQUEST_TIME']; //Время с запуска страницы$offline = $time - 240; //Лимит тунеянства/////$browser = $_SERVER['HTTP_USER_AGENT'];$ip = $_SERVER['REMOTE_ADDR'];$stat_ip = substr($ip, 0, strrpos($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.17 10:49

Чет мне народ говорит, что говнокод.
Типа по диапазону не стоит проверять, да и если так, то можно через модем билайн зайти, браузер поставить как у жертвы и все...
- - - -
Как тогда сделать?

Gemorroj » 2011.04.17 11:03

я вообще не понимаю, нафига ты что-то мудришь? ты банковскую систему чтоли пишешь? идентифицируй пользователя по сессии и хватит. если пользователь умудрился потерять потерять куки, то ему уже ничто не поможет, ИМХО.

tipsun » 2011.04.17 11:11

Вебмани хотел переплюнуть :D
- - - -
Снова я заблудился.
- - - -
Пофиг на функцию запомнить...
Вот типа авторизовался, побродил.
Вышел кука ид сессии удалилась, она ведь при закрытия браузера удаляется...
И эмм... все?
- - - -

Код:

1
span style="color: #0000BB"><?phpif($_COOKIE['PHPSESSID']) { session_start(); }?>
НЕЗНАЙКА » 2011.04.17 13:02

Зачем вообще на куках делать? Сессия же интереснее  и никто не увидит хэш.

Gemorroj » 2011.04.17 13:43

tipsun написал:

И эмм... все?

http://www.php.net/manual/en/function.s … params.php

tipsun » 2011.04.17 17:45

Nu3oN написал:

В общем глянь как это в роторе сделано! удобней чем каждый раз это все писать!

Да, спс, шикарно. И в конце разъединяет.
- - - -
Правда я пока и применять, и сам писать класс наверно не буду.
Я и в классы плохо понимаю и pdo только начал осваивать.

tipsun » 2011.09.13 21:55

Gemorroj написал:

tipsun написал:

И эмм... все?

http://www.php.net/manual/en/function.s … params.php

Код:

1
span style="color: #0000BB"><?phpif (isset($_COOKIE['PHPSESSID'])) { session_set_cookie_params(1440, '/', '.'.$_SERVER['HTTP_HOST'], false, true); session_start(); }?>
WapStyle » 2011.09.13 23:45

Шифруй пароли с мусором
md5($_POST['pass'].'мусор');

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

$pass = $_POST['pass'].'мусор';
if($pass == $user['pass']) echo 'ok'; else echo 'иди нах';

Gemorroj » 2011.09.13 23:51

это называется "соль", а не мусор)

WapStyle » 2011.09.13 23:52

Гемор её поразному можно назвать ))

TLENS » 2011.09.13 23:53

Я вобще не пойму зачем шифровать.

DarkRiDDeR » 2011.09.14 08:46

Ну кто-то спёр базу, допустим, а там пороли. Дык зашифрованные ещё надо расшифровать, а это большие проблемы, и если ещё получится это сделать.

Gemorroj » 2011.09.14 08:58

DarkRiDDeR, тут есть проблема с тем, что соль, как правило, хранится рядом с паролями. И при брутфорсе ее так же можно смешивать.

DarkRiDDeR » 2011.09.14 13:23

Ну соль сильно не будет влиять на усложнение расшифровки, к тому же, если удасться расшифровать пару паролей, у них будет одинаковый конец - соль, хотя... Я думаю md5 хватит. Ну я использую md5(sha1()),  пусть расшифровывают, это намного труднее, чем всякие соль.

tipsun » 2011.09.14 23:28

WapStyle написал:

Шифруй пароли с мусором
md5($_POST['pass'].'мусор');

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

$pass = $_POST['pass'].'мусор';
if($pass == $user['pass']) echo 'ok'; else echo 'иди нах';

Это при сохранении в базу?
Я без соли сохранял.

При авторизации:
Ник / Пароль
Проверка в базе
1 Все совпадает, даем сессию занося туда ид/уровень (везде где надо проверка на сущ. сессии).
Хотя можно и в шапке сделать проверку. Или функцию сделать.
0 Просим повторить ввод данных.

TLENS » 2011.09.15 01:31

Но зачем расшифровывать, если можно просто вставить в заголовок c куками и произвести авторизацию.
Я имею в виду шифровать пароль для записи в куку

Gemorroj » 2011.09.15 08:32

это да, частая ошибка.

DarkRiDDeR » 2011.09.15 09:30

Ну я про куки не говорил, в куки пароль воопще незачем пихать, хоть зашифрованны, хоть незашифрованный. Для авторизации существуют сесси, они для этого и созданы, и нечего делать авторизацию на куках: возможностей меньше и защита меньше.

tipsun » 2011.10.08 21:25

Или я снова, как всегда, не понимаю сути, или...

Все таки так, потому что это будет в шапке. А параметры мы задали в авторизации.

Код:

1
span style="color: #0000BB"><?php if (isset($_COOKIE['PHPSESSID'])) { session_start(); } ?>

А так, при авторизации, если юзер нажмет запомнить.
Только вот сейчас вопрос возник, если юзер использовал сессию до истечения срока, например в 1 минуту, то удаление файла сессии снова отложится на 1440 сек или нет?

Код:

1
span style="color: #0000BB"><?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();?>
WapStyle » 2011.10.08 23:13

Давать пасс в куку (даже шифрованный) не есть айс. Как делаю я
1. При авторизации(успешной) в базу записыватся хеш(рандомный) для определённого юзера и этот же хеш даётся юзеру в куку
2. Если юзер покинул сайт (нажал выход) идёт уничтожение куки у юзера и смена хеш в базе на рандомный.
3. Пароль узнать невозможно и сменить тоже, даже если авторизация была успешной(если каким то макаром удалось своровать действуюбщий хеш), т.к. при смене попросит вести старый пароль.
Отсюда имеем у юзера нет хеша, а если он его сохранил он всёравно не подойдёт, т.к. при выходе скрипт скрипт сам поменял хеш. Если юзер боиться что его акк взломали просто нужно нажать выход и заново авторизироваться(хеш будет изменён)

Ну как так ))

tipsun » 2011.10.09 14:10

tipsun написал:

... Только вот сейчас вопрос возник, если юзер использовал сессию до истечения срока, например в 1 минуту, то удаление файла сессии снова отложится на 1440 сек или нет?

Время отсчитывается от последнеого обращения посетителя т.е. это время доступа к файлу, а не создания.

tipsun » 2012.02.10 12:11

С механизмом запоминания наверно можно так поступить:
- при авторизации пользователь указывает сайту "запомни меня".
- сайт создает обычную сессию + куку, имя которой заносится в базу.
Если есть PHPSESSID у пользователя, значит не надо проверять куку.
Другое дело, если PHPSESSID есть, а файл сессии удалился...
Наверно проверить по куке и сгенерировать новый PHPSESSID.
Это я только сейчас додумался, точнее сама в голову пришла идея.
Хотя давно все так делают :D 100%

Gemorroj » 2012.02.10 17:49

можно еще при "запомни меня" время жизни сессии принудительно ставить большое.

tipsun » 2012.02.10 21:37

Получается session_id() в базу надо будет заносить.
Код напишу, выложу.

tipsun » 2012.02.10 23:19

Насчет сроков не посмотрел. Ну регерится с теми же сроками или нет.
Остальное за файлом/механизмом авторизации.

Код:

1
span style="color: #0000BB"><?phpif (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 { //отрубить сессию, может быть. } }}
Gemorroj » 2012.02.11 09:56

$_COOKIE['PHPSESSID'] - лучше не использовать дефолтовое название, а ставить свое

tipsun » 2012.02.11 12:59

Код:

1
span style="color: #0000BB"><?phpdefine('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_NAME, null, $_SERVER['REQUEST_TIME'] - 1); //Доконца не понял че там этот session_destroy(); делает. //Как я понял: не очищает массив сессии, и не удаляет куку. } }}
Gemorroj » 2012.02.11 13:25

да и не SID тоже, лучше подгонять под конкретный проект. на вапинете скажем, сессия SID может ставится и в блогах и на форуме. в таком случае они будут перезаписывать друг друга.
лучше называть что-то типа wapinet_blog, wapinet_forum и т.д.

tipsun » 2012.02.13 15:42

Чет не удаляется печенюха с "лисы".

Простая сессия, кука пропадает после закрытия браузера.
Чет она не удаляется. Видимо только при закрытии браузера only.
Или все-таки можно удалить?

Код:

1
span style="color: #0000BB"><?phpdefine('SESSION_NAME', 'SID');$_ = session_get_cookie_params();//setCookie(SESSION_NAME, null, $_SERVER['REQUEST_TIME'] - 1);setCookie(SESSION_NAME, null, $_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 секунд:
Все, я понял в чем дело. :)

Код:

1
2
3
echo '<pre>';
print_r(session_get_cookie_params());
echo '</pre>';
tipsun » 2012.02.13 18:21

И зачем session_get_cookie_params() вообще нужна, если она нифига не работает...
Можно как-то о куке которая у браузера узнать побольше?
- - - -
Точнее работает, когда указано явно session_set_cookie_params() или через ini_set() наверно.

Gemorroj » 2012.02.13 18:26

tipsun написал:

И зачем session_get_cookie_params() вообще нужна, если она нифига не работает...

работает в соответствии с документацией.
на серверных языках о куках особо инфы не получить. видимо.

tipsun » 2012.02.14 00:34

Код:

1
span style="color: #0000BB"><?phpdefine('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 00:44

Ну можно довести сохранение файла сессии до 60*60*6 = 6 часов или сделать 12 часов, не знаю.
Вероятность ошибочного присвоения метки (запомнить) будет меньше, наверно...

tipsun » 2012.02.14 14:56

Вроде, готово.

Код:

1
span style="color: #0000BB"><?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 Driversession_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.29 16:10

В базе нужно будет помимо `session_id` сделать еще `session_expire`, а то кука удалится, а поле в базе с этим `session_id` будет активна.
Мне так кажется.

tipsun » 2012.03.04 03:01

Код:

1
span style="color: #0000BB"><?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:39

Вопрос, как лучше?
Средствами MySQL пользоваться NOW(), INTERVAL или средствами php?

Gemorroj » 2012.03.04 12:39

ключ с session_expire вероятно лучше убрать
Добавлено спустя    14 секунд:
лучше mysql

tipsun » 2012.03.04 12:40

Ок. Спс.

tipsun » 2012.03.04 13:36

Код:

1
span style="color: #0000BB"><?php-- нетWHERE `session_expire` > NOW() AND `session_id` = ?-- даWHERE `session_id` = ? AND `session_expire` > NOW()
tipsun » 2012.03.09 01:14

Только сейчас додумался, что можно пароль и потом проверить. Вот дурья башка.
Обычно с запросом проверяется.

Код:

1
span style="color: #0000BB"><?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($getName, md5($getPassword))); // Теперь вы пользователь. exit('3');}else { // Нет такого пользователя. // Или имя пользователя занято. // Или не нажали кнопку. if (isSet($_GET['auth'])) exit('4'); else if (isSet($_GET['save'])) exit('5'); else exit('6');}
tipsun » 2012.06.29 10:57

Хотел в класс запихать код для старта сессии при получении печеньки и при присутствии/отсутствии файла сессии, но чет не знаю как практичней.
Не хочу трогать базу, ну через конструктор заносить сингтон базы.
Я за независимость :)
Просто почитал чуть про хороший код. И типа лучше всего, когда класс не зависит от другого класса/кода.
Добавлено спустя   1 минуту  9 секунд:
Сейчас наброски скину.

tipsun » 2012.06.29 12:24

Еще думал, как принимать тучу параметров печенья.
Была мысль о ini_set()
Но потом подумал, это на 1 раз или нет,
т.к. другие скрипты тоже могут использовать сессию.

Код:

1
span style="color: #0000BB"><?phpclass 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 секунд:
Или плюнуть на файлы и сделать класс на базе?

Gemorroj » 2012.06.29 13:11

файлы в случае с сессиями устроят в 95% случаев, так что замачиваться я бы не стал. либо сразу писать прослойки для работы с сессиями в разных хранилищах.

tipsun » 2012.06.29 13:17

Ну если файлы использовать.
Просто прослойку хочу сделать.

tipsun » 2012.06.29 17:07

Хм. А что мне мешает сделать все без сессии?
В базе есть поле для cookie_id по нему пусть и получают доспуп пользователи. Какого фига сессия нужна там? :)
Чем сессия будет каждый раз open+unserialize лучше уж запрос в базу.
Может понадобиться обычная сессия для captcha только наверно.

tipsun » 2012.06.29 18:09

Либо у меня горячка, либо озарение простых вещей :)
Хотя если файл сессии сохранился, то в принципе все будет быстро...

Код:

1
span style="color: #0000BB"><?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:26

Cookie сгенерировать и засунуть в базу. Срок годности 3 дня, допустим. Или как-то так.

tipsun » 2012.06.30 00:44

Да, на этом форуме вроде, как я посмотрел, такая же схема.

tipsun » 2012.06.30 17:08

Если без срока в базе, то можно будет взломать, нет?
Зато намного быстрее работать будет.

WapStyle » 2012.07.03 21:21

Выдавай в куки временный хеш...например если чел авторизировался ему в куки хеш..вышел кеш заменяется на любой случайный...если не дурак поймёш

tipsun » 2012.07.03 23:21

WapStyle, спасибо за идею. :)
Добавлено спустя   8 минут  20 секунд:
Так.
У меня, типа :) , есть отдельная таблица с активными/онлайн. Может сделать раздельно?
Там у меня записи не удаляются. (REPLACE).
Можно, в принципе зачищать поля с id=0 т.к. гости его не имеют.
Значит вполне возможен вариант с проверкой юзеров, которые не подавали активности, скажем, 20 часов.

Код:

1
span style="color: #0000BB"><?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:41

Потом еще подумаю.

tipsun » 2012.07.06 14:38

WapStyle, да. Очень хорошее решение.
Запланировать каждую ночь 1 проверку.
У кого есть отметка запомнить, оставлять куку. Другим очищать в базе поле кука_ид. :)

tipsun » 2012.07.06 17:49

Это уже раздел cron наверно. Надо будет почитать что и как там.

tipsun » 2012.07.12 14:55

Чет я не понял что да как там.
Только как задания прописывать понял:

Показать/Скрыть
[* m] [* h] [* d] [* m] [* y] /phpPath/ /scriptPath/

Gemorroj » 2012.07.12 18:40

ну этого и достаточно.

tipsun » 2012.07.20 14:35

Допустим можно узнать папку с PHP:

Код:

1
span style="color: #0000BB"><?phpecho $_ENV['PHPRC'];

Можно узнать путь к файлу исполнения:

Код:

1
span style="color: #0000BB"><?phpecho __FILE__;

А куда пихать созданный файл cgi непонятно.

Еще думал насчет другого варианта:

Код:

1
span style="color: #0000BB"><?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//

И думал может нафиг это все,
использовать стандартный путь.

Gemorroj » 2012.07.20 15:57

$hash = md5(microtime()); // тут microtime массив вернет. а md5 просит строку
лучше замени все это на uniqid() например
ну и так, напомню такой термин - KISS

tipsun » 2012.07.20 16:25

Gemorroj написал:

$hash = md5(microtime()); // тут microtime массив вернет. а md5 просит строку

Код:

1
span style="color: #0000BB"><?php // v5.2.12var_dump(micro_time());//string(21) "0.11501000 1342787062"
Gemorroj » 2012.07.20 16:50

tipsun
да, запамятовал уже( чаще пользуются microtime(true)

tipsun » 2012.07.20 20:14

Gemorroj написал:

ну и так, напомню такой термин - KISS

Это к алгоритму или ко времени относится в данном случае?

tipsun » 2012.07.20 21:06

Надо будет срок_актуальности_печеньки хранить в UNIX_TIMESTAMP.

tipsun » 2012.07.22 21:07

Лучше?

Код:

1
span style="color: #0000BB"><?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//
Gemorroj » 2012.07.23 00:02

лучше. но UPDATE тоже переделай на параметризованный запрос. так же проверяй не только $q->rowCount() но и чтобы execute возвратил true

tipsun » 2012.07.23 00:07

Ok. Спс.

tipsun » 2012.07.26 14:38

Как-то так?

Код:

1
span style="color: #0000BB"><?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]); }}
Gemorroj » 2012.07.26 15:36

$q в пером запросе тоже проверяй

tipsun » 2012.07.26 15:39

Так вроде проверяется.

Код:

1
span style="color: #0000BB"><?php$q = $db->prepare($qt); if ($q->execute($args) and $q->rowCount()) {}
Gemorroj » 2012.07.26 19:24

Код:

1
span style="color: #0000BB"><?phpif ($q && $q->execute($args) and $q->rowCount()) {}
tipsun » 2012.07.26 19:54

Ого.
Ну да, логично. prepare().

tipsun » 2012.07.27 22:31

Я решил fetch() тоже не обременять.

Код:

1
span style="color: #0000BB"><?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.30 20:48

habrahabr.ru/post/13726 - хорошая статья.
Добавлено спустя   4 минуты  9 секунд:
- Поле Cookie_timestamp наверно лишнее. Можно и auth_timestamp, время последней авторизации, использовать.
- Привязку к ип попробую прикрутить
- Еще забыл проверять remember - при регенерации печенья чтоб нужный срок действия задать.

Gemorroj » 2012.07.30 21:57

tipsun, 2007 год)

tipsun » 2012.07.30 22:38

Да..., не умею я пользоваться поисковиком. :)