Вы не зашли.
#1.
nord
Off
(1)
Участник
2011.02.19 21:09
вобщем меня давно интересует такой вопрос , есть пароль я зашифровал его в md5 потом еще в base64
но если украсть этот хеш то с ним можно зайти спокойно на сайт под чужим паролем
помогите пожалуйста как сделать такую авторизацию правильно и безопасно чтобы при �раже хеша не смогли авторизоваться под чужим паролем?
Отредактировано nord (2011.02.19 21:09)
А как авторизоваться-то? base64 - бред
#3.
TLENS
Off
(14)
Moderator
2011.02.19 23:11
nordНаоборот надо было сразу в base64 потом в md5
А еще лучше md5(md5($pass))
Добавлено спустя 1 минуту 26 секунд: А воще зачем ты шифровал его в куку?
не нужно было тут base64 ни в каком варианте
#5.
nord
Off
(1)
Участник
2011.02.20 08:08
а как это все правильно сделать дайте маленький пример? Чтобы понять как это работает с куками не работал ни когда
$pass = md5($_POST['pass']);
А дальше
setcookie
вообще, не нужно хранить в куках пароль. там нужно хранить идентификатор сессии. а в самой сессии уже все данные.
#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 написал:
вообще, не нужно хранить в куках пароль. там нужно хранить идентификатор сессии. а в самой сессии уже все данные.
да да оно самое а как это правильно сделать можно поподробнее пожалуйста?
ну что еще можно рассказать-то? конкретней вопрос задай.
#11.
nord
Off
(1)
Участник
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
на сессиях я делал авторизацию , и на куках тоже получаеться но журил я хеш возьму и вставлю на другом компе в оперу то я авторизуюсь под этой учетной записью, или от этого защититься нельзя?
да, вставишь. защититься можно проверяя IP, Браузер, их сочетание.
#15.
nord
Off
(1)
Участник
2011.02.21 15:03
а как можно по ip проверить если но динамический?
#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
спасибо большое всем за помощь хоть немного разобрался)
а можно $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)
если делать с помощю сесии то авторизация не будет слетать?
всегда есть вероятность потери сессии (пользователь удалил куку, на сервере что-то случилось с хранилищем сессий...)
Или же место на сервере закончилось! Я у себя в подержку написал о переполнении дык сказали сделаем. Неделю где-то папка сессии растет:-) круто, да?
Я, допустим, делал так: в таблицу юзеров пишу случайный хэш, его же и в сессию + проверка по ip.
ДАУН-Данная Аватара Унаследована Незнайкой
Я вообще не понимаю что к чему тут, но хочу разобраться

- С чего вообще ты это взял?
- Ну вот:
.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)
Это кто там такую фигню в посте #25 пишет??!

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)
Вот я не пойму, зачем в куки все суют браузеры, ипы... Он же на отдельном компе каждого хранится.
----
Узнал, как можно продлить жизнь файла сессии, просто создать для него отдельную папку и если можно там, где нет доступа.
Код:
<?php |
ini_set('session.save_path', $_SERVER['DOCUMENT_ROOT'] .'../sessions/'); |
Базу не трогать, т.к. все равно с файла вытащить это все быстрее будет, как я понял.
Отредактировано tipsun (2011.04.10 13:01)
там просто проблема с тем, что папка переполнялась.
Понял. СПС.
В след раз в ману лезть буду...
#34.
Nu3oN
Off
(11)
Moderator
2011.04.10 21:09
Зачем так мудрить? чем обычный подход к этому делу не устроил?
Я буду лучше голоден, но между креслом и рулем и на дороге.
Не, ну там написано типа для гостей не надо сессию начинать, как я понял.
Не надо старые сессии продолжать при получении куков, а стартовать новую с данными юзера.
- - - -
А если так делать, то надо в базу лезть.
И если даже для гостей сессию не начинать, то как captcha будет работать.
В принципе в этой сессии кроме ид, статуса и каптчи ниче не хранится у меня.
- - - -
Я в принципе писал, что пока не разбираюсь в этих делах, но хочу разобраться.
Там пример тоже приводится в конце статьи...
Отредактировано tipsun (2011.04.10 23:11)
Набросок
Код:
<?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 |
{ |
//переадресация на страницу авторизации. |
} |
} |
?> |
Отредактировано tipsun (2011.04.12 15:03)
перед тем как делаешь session_destroy сделай еще и $_SESSION = null;
и пиши имена функций с маленькой буквы не Session_Destroy, а session_destroy.
а вообще не вижу смысла делать session_destroy, а затем сразу же делать session_start.
Код:
<?php |
unset($_COOKIE['PHPSESSID']); |
?> |
и почитай как удалять куки еще
Спс всем. Буду еще думать.
Подумал:
Код:
<?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.12 22:10)
Вот сделал. Подскажите пожалуйста, нет ли ошибок? А то я вот только начал 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); укажи один раз, и вс

Код:
<?php |
$db-> setAttribute(PDO :: ATTR_DEFAULT_FETCH_MODE, PDO :: 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; |
} |
} |
|
?> |
В общем глянь как это в роторе сделано! удобней чем каждый раз это все писать!
Я буду лучше голоден, но между креслом и рулем и на дороге.
Спс

Как будет время рассмотрю остальную половину сообщения. Под рукой компа нет... С моб не удобно...
Как бы мне снова не заблудиться
Отредактировано tipsun (2011.04.14 12:12)
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.6Implemented FR #47802 (Support for setting character sets in DSN strings). (Kalle)
так, к сведению, начиная с PHP 5.3.6 кодировку можно указвыать прямо в строке подключения
Ахринеть, это только сессия!

Надо более компактно и логично сделать...
Код:
<?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.16 18:06)
Чет мне народ говорит, что говнокод.
Типа по диапазону не стоит проверять, да и если так, то можно через модем билайн зайти, браузер поставить как у жертвы и все...
- - - -
Как тогда сделать?
Отредактировано tipsun (2011.04.17 10:10)
я вообще не понимаю, нафига ты что-то мудришь? ты банковскую систему чтоли пишешь? идентифицируй пользователя по сессии и хватит. если пользователь умудрился потерять потерять куки, то ему уже ничто не поможет, ИМХО.
Вебмани хотел переплюнуть

- - - -
Снова я заблудился.
- - - -
Пофиг на функцию запомнить...
Вот типа авторизовался, побродил.
Вышел кука ид сессии удалилась, она ведь при закрытия браузера удаляется...
И эмм... все?
- - - -
Код:
<?php |
|
if($_COOKIE['PHPSESSID']) |
{ |
session_start(); |
} |
|
?> |
Отредактировано tipsun (2011.04.17 12:12)
Зачем вообще на куках делать? Сессия же интереснее и никто не увидит хэш.
ДАУН-Данная Аватара Унаследована Незнайкой
Nu3oN написал:
В общем глянь как это в роторе сделано! удобней чем каждый раз это все писать!
Да, спс, шикарно. И в конце разъединяет.
- - - -
Правда я пока и применять, и сам писать класс наверно не буду.
Я и в классы плохо понимаю и pdo только начал осваивать.
Код:
<?php |
|
if (isset($_COOKIE['PHPSESSID'])) { |
|
session_set_cookie_params(1440, '/', '.'.$_SERVER['HTTP_HOST'], false, true); |
session_start(); |
} |
|
?> |
Шифруй пароли с мусором
md5($_POST['pass'].'мусор');
а потом проверяй пароль но подставляя мусор который ты заранее подставляеш
$pass = $_POST['pass'].'мусор';
if($pass == $user['pass']) echo 'ok'; else echo 'иди нах';
это называется "соль", а не мусор)
Гемор её поразному можно назвать ))
#56.
TLENS
Off
(14)
Moderator
2011.09.13 23:11
Я вобще не пойму зачем шифровать.
Ну кто-то спёр базу, допустим, а там пороли. Дык зашифрованные ещё надо расшифровать, а это большие проблемы, и если ещё получится это сделать.
Отредактировано DarkRiDDeR (2011.09.14 08:08)
DarkRiDDeR, тут есть проблема с тем, что соль, как правило, хранится рядом с паролями. И при брутфорсе ее так же можно смешивать.
Ну соль сильно не будет влиять на усложнение расшифровки, к тому же, если удасться расшифровать пару паролей, у них будет одинаковый конец - соль, хотя... Я думаю md5 хватит. Ну я использую md5(sha1()), пусть расшифровывают, это намного труднее, чем всякие соль.
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)
Ну я про куки не говорил, в куки пароль воопще незачем пихать, хоть зашифрованны, хоть незашифрованный. Для авторизации существуют сесси, они для этого и созданы, и нечего делать авторизацию на куках: возможностей меньше и защита меньше.
Или я снова, как всегда, не понимаю сути, или...
Все таки так, потому что это будет в шапке. А параметры мы задали в авторизации.
Код:
<?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)
Давать пасс в куку (даже шифрованный) не есть айс. Как делаю я
1. При авторизации(успешной) в базу записыватся хеш(рандомный) для определённого юзера и этот же хеш даётся юзеру в куку
2. Если юзер покинул сайт (нажал выход) идёт уничтожение куки у юзера и смена хеш в базе на рандомный.
3. Пароль узнать невозможно и сменить тоже, даже если авторизация была успешной(если каким то макаром удалось своровать действуюбщий хеш), т.к. при смене попросит вести старый пароль.
Отсюда имеем у юзера нет хеша, а если он его сохранил он всёравно не подойдёт, т.к. при выходе скрипт скрипт сам поменял хеш. Если юзер боиться что его акк взломали просто нужно нажать выход и заново авторизироваться(хеш будет изменён)
Ну как так ))
tipsun написал:
... Только вот сейчас вопрос возник, если юзер использовал сессию до истечения срока, например в 1 минуту, то удаление файла сессии снова отложится на 1440 сек или нет?
Время отсчитывается от последнеого обращения посетителя т.е. это время доступа к файлу, а не создания.
Отредактировано tipsun (2011.10.09 14:02)
С механизмом запоминания наверно можно так поступить:
- при авторизации пользователь указывает сайту "запомни меня".
- сайт создает обычную сессию + куку, имя которой заносится в базу.
Если есть PHPSESSID у пользователя, значит не надо проверять куку.
Другое дело, если PHPSESSID есть, а файл сессии удалился...
Наверно проверить по куке и сгенерировать новый PHPSESSID.
Это я только сейчас додумался, точнее сама в голову пришла идея.
Хотя давно все так делают

100%
можно еще при "запомни меня" время жизни сессии принудительно ставить большое.
Получается session_id() в базу надо будет заносить.
Код напишу, выложу.
Насчет сроков не посмотрел. Ну регерится с теми же сроками или нет.
Остальное за файлом/механизмом авторизации.
Код:
<?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)
$_COOKIE['PHPSESSID'] - лучше не использовать дефолтовое название, а ставить свое
Код:
<?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_NAME, null, $_SERVER['REQUEST_TIME'] - 1); |
//Доконца не понял че там этот session_destroy(); делает. |
//Как я понял: не очищает массив сессии, и не удаляет куку. |
} |
} |
} |
Отредактировано tipsun (2012.02.11 13:01)
да и не SID тоже, лучше подгонять под конкретный проект. на вапинете скажем, сессия SID может ставится и в блогах и на форуме. в таком случае они будут перезаписывать друг друга.
лучше называть что-то типа wapinet_blog, wapinet_forum и т.д.
Чет не удаляется печенюха с "лисы".
Простая сессия, кука пропадает после закрытия браузера.
Чет она не удаляется. Видимо только при закрытии браузера only.
Или все-таки можно удалить?
Код:
<?php |
define('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 секунд: Все, я понял в чем дело.

Код:
echo '<pre>'; |
print_r(session_get_cookie_params()); |
echo '</pre>'; |
Отредактировано tipsun (2012.02.13 15:03)
И зачем
session_get_cookie_params() вообще нужна, если она нифига не работает...
Можно как-то о куке которая у браузера узнать побольше?
- - - -
Точнее работает, когда указано явно
session_set_cookie_params() или через
ini_set() наверно.
Отредактировано tipsun (2012.02.13 18:06)
tipsun написал:
И зачем session_get_cookie_params() вообще нужна, если она нифига не работает...
работает в соответствии с документацией.
на серверных языках о куках особо инфы не получить. видимо.
Код:
<?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)
Ну можно довести сохранение файла сессии до 60*60*6 = 6 часов или сделать 12 часов, не знаю.
Вероятность ошибочного присвоения метки (запомнить) будет меньше, наверно...
Отредактировано tipsun (2012.02.14 00:12)
Вроде, готово.
Код:
<?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)
В базе нужно будет помимо `session_id` сделать еще `session_expire`, а то кука удалится, а поле в базе с этим `session_id` будет активна.
Мне так кажется.
Отредактировано tipsun (2012.02.29 16:04)
Код:
<?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)
Вопрос, как лучше?
Средствами MySQL пользоваться NOW(), INTERVAL или средствами php?
ключ с session_expire вероятно лучше убрать
Добавлено спустя 14 секунд: лучше mysql
Код:
<?php |
|
-- нет |
WHERE `session_expire` > NOW() AND `session_id` = ? |
|
-- да |
WHERE `session_id` = ? AND `session_expire` > NOW() |
Отредактировано tipsun (2012.03.04 13: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($getName, md5($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)
Хотел в класс запихать код для старта сессии при получении печеньки и при присутствии/отсутствии файла сессии, но чет не знаю как практичней.
Не хочу трогать базу, ну через конструктор заносить сингтон базы.
Я за независимость

Просто почитал чуть про хороший код. И типа лучше всего, когда класс не зависит от другого класса/кода.
Добавлено спустя 1 минуту 9 секунд: Сейчас наброски скину.
Еще думал, как принимать тучу параметров печенья.
Была мысль о 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)
файлы в случае с сессиями устроят в 95% случаев, так что замачиваться я бы не стал. либо сразу писать прослойки для работы с сессиями в разных хранилищах.
Ну если файлы использовать.
Просто прослойку хочу сделать.
Хм. А что мне мешает сделать все без сессии?
В базе есть поле для cookie_id по нему пусть и получают доспуп пользователи. Какого фига сессия нужна там?

Чем сессия будет каждый раз open+unserialize лучше уж запрос в базу.
Может понадобиться обычная сессия для captcha только наверно.
Либо у меня горячка, либо озарение простых вещей

Хотя если файл сессии сохранился, то в принципе все будет быстро...
Код:
<?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)
Cookie сгенерировать и засунуть в базу. Срок годности 3 дня, допустим. Или как-то так.
Да, на этом форуме вроде, как я посмотрел, такая же схема.
Отредактировано tipsun (2012.06.30 00:12)
Если без срока в базе, то можно будет взломать, нет?
Зато намного быстрее работать будет.
Выдавай в куки временный хеш...например если чел авторизировался ему в куки хеш..вышел кеш заменяется на любой случайный...если не дурак поймёш
Отредактировано WapStyle (2012.07.03 21:09)
WapStyle, спасибо за идею.
Добавлено спустя 8 минут 20 секунд: Так.
У меня, типа

, есть отдельная таблица с активными/онлайн. Может сделать раздельно?
Там у меня записи не удаляются. (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)
WapStyle, да. Очень хорошее решение.
Запланировать каждую ночь 1 проверку.
У кого есть отметка запомнить, оставлять куку. Другим очищать в базе поле кука_ид.
Это уже раздел cron наверно. Надо будет почитать что и как там.
Чет я не понял что да как там.
Только как задания прописывать понял:
Допустим можно узнать папку с PHP:
Код:
<?php |
echo $_ENV['PHPRC']; |
Можно узнать путь к файлу исполнения:
А куда пихать созданный файл 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// |
И думал может нафиг это все,
использовать стандартный путь.
$hash = md5(microtime()); // тут microtime массив вернет. а md5 просит строку
лучше замени все это на uniqid() например
ну и так, напомню такой термин -
KISS
Gemorroj написал:
$hash = md5(microtime()); // тут microtime массив вернет. а md5 просит строку
Код:
<?php // v5.2.12 |
|
var_dump(micro_time()); |
//string(21) "0.11501000 1342787062" |
tipsunда, запамятовал уже( чаще пользуются microtime(true)
Gemorroj написал:
ну и так, напомню такой термин - KISS
Это к алгоритму или ко времени относится в данном случае?
Надо будет срок_актуальности_печеньки хранить в UNIX_TIMESTAMP.
Отредактировано tipsun (2012.07.21 01:01)
Лучше?
Код:
<?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// |
лучше. но UPDATE тоже переделай на параметризованный запрос. так же проверяй не только $q->rowCount() но и чтобы execute возвратил true
Как-то так?
Код:
<?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)
$q в пером запросе тоже проверяй
Так вроде проверяется.
Код:
<?php |
|
$q = $db->prepare($qt); |
|
if ($q->execute($args) and $q->rowCount()) {} |
Код:
<?php |
if ($q && $q->execute($args) and $q->rowCount()) {} |
Отредактировано tipsun (2012.07.27 04:04)
Ого.
Ну да, логично. prepare().
Отредактировано tipsun (2012.07.26 19:07)
Я решил 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)
habrahabr.ru/post/13726 - хорошая статья.
Добавлено спустя 4 минуты 9 секунд: - Поле Cookie_timestamp наверно лишнее. Можно и auth_timestamp, время последней авторизации, использовать.
- Привязку к ип попробую прикрутить
- Еще забыл проверять remember - при регенерации печенья чтоб нужный срок действия задать.
Да..., не умею я пользоваться поисковиком.
Страниц:
1 …
10 11 12 Все