Порылся по интернету, в итоге ориентируясь на советы собрал вот такой вот код:
читать дальше
<?php
define(TIME_COOKIE, 604800); // воемя жизни кук (неделя)
define(DOMEN, 'domen.com'); // домен
// проверяет, существует ли пользователь в БД
function authLogin($login, $pass)
{
$login = mysql_real_escape_string($login);
$pass = md5($pass);
// делаем запрос к БД
$query = "SELECT `id` FROM `users` WHERE (`login` = '{$login}' AND `pass` = '{$pass}') LIMIT 1";
$sql = mysql_query($query);
// проверяем, найден ли пользователь с таким паролем
if(mysql_num_rows($sql) == 0)
{
$rows = mysql_fetch_assoc($sql);
return intval($rows['id']);
}
else
return false;
}
// проверяет ip
function authIP()
{
// вообще весь IP проверять нежелательно - достаточно только первые цифры
// вынесенно в функцию для возможности последующей модификации
if($_SESSION['ip'] == $_SERVER['REMOTE_ADDR'])
return true;
else
return false;
}
//----------------------------------------------------------------------------------------------
// если ранее сессия запущена не была
// тут два варианта проверки:
// либо (session_id() == '') либо (isset($_COOKIE['PHPSESSID']))
// какой лучше?
if(session_id() == '')
{
// если в куках хранятся логин-пароль
if(isset($_COOKIE['login']) && isset($_COOKIE['pass']))
{
// если логин-пароль правильные
if($id = authLogin($_COOKIE['login'], $_COOKIE['pass']))
{
// здесь можно добавить дополнительную проверку браузера пользователя
// if(isset($_COOKIE['myKey']) && $_COOKIE['myKey'] == md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['HTTP_ACCEPT_CHARSET']))
session_start();
$_SESSION['id'] = $id;
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
// продляем жизнь кукам
setcookie('login', $_COOKIE['login'], time() + TIME_COOKIE, '/', '.'.DOMEN);
setcookie('pass', $_COOKIE['pass'], time() + TIME_COOKIE, '/', '.'.DOMEN);
}
// если логин-пароль неправильные
else
{
// удаляем куки
setcookie('login', '', time() - TIME_COOKIE, '/', '.'.DOMEN);
setcookie('pass', '', time() - TIME_COOKIE, '/', '.'.DOMEN);
// надо ли делать переадресацию?
// header("Location: http://".DOMEN.$_SERVER['REQUEST_URI']);
}
}
// если в куках ничего нет
else
{
// если пользователь пытается авторизироваться
if(isset($_POST['login']) && isset($_POST['pass']))
{
// если такой пользователь найден
if($id = authLogin($_POST['login'],$_POST['pass']))
{
session_start();
$_SESSION['id'] = $id;
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
// устанавливаем куки
// надо ли тут делать проверку post-данных?
setcookie('login', $_POST['login'], time() + TIME_COOKIE, '/', '.'.DOMEN);
setcookie('pass', $_POST['pass'], time() + TIME_COOKIE, '/', '.'.DOMEN);
}
}
else
{
// надо как-то уведомить пользователя
// что введенные данные не верны
}
}
}
// если сессия уже была запущена
else
{
session_start(); // запускаем сессию
if(!authIP()) // если IP не совпадает
{
session_unset(); // уничтожаем переменные
session_destroy(); // уничтожаем сессию
// надо ли здесь чистить куки?
}
}
// -----------------------------------------------------------------------------------------
if(isset($_SESSION['id']))
{
// пользователь авторизировался
}
else
{
// форма авторизации
}
?>
define(TIME_COOKIE, 604800); // воемя жизни кук (неделя)
define(DOMEN, 'domen.com'); // домен
// проверяет, существует ли пользователь в БД
function authLogin($login, $pass)
{
$login = mysql_real_escape_string($login);
$pass = md5($pass);
// делаем запрос к БД
$query = "SELECT `id` FROM `users` WHERE (`login` = '{$login}' AND `pass` = '{$pass}') LIMIT 1";
$sql = mysql_query($query);
// проверяем, найден ли пользователь с таким паролем
if(mysql_num_rows($sql) == 0)
{
$rows = mysql_fetch_assoc($sql);
return intval($rows['id']);
}
else
return false;
}
// проверяет ip
function authIP()
{
// вообще весь IP проверять нежелательно - достаточно только первые цифры
// вынесенно в функцию для возможности последующей модификации
if($_SESSION['ip'] == $_SERVER['REMOTE_ADDR'])
return true;
else
return false;
}
//----------------------------------------------------------------------------------------------
// если ранее сессия запущена не была
// тут два варианта проверки:
// либо (session_id() == '') либо (isset($_COOKIE['PHPSESSID']))
// какой лучше?
if(session_id() == '')
{
// если в куках хранятся логин-пароль
if(isset($_COOKIE['login']) && isset($_COOKIE['pass']))
{
// если логин-пароль правильные
if($id = authLogin($_COOKIE['login'], $_COOKIE['pass']))
{
// здесь можно добавить дополнительную проверку браузера пользователя
// if(isset($_COOKIE['myKey']) && $_COOKIE['myKey'] == md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['HTTP_ACCEPT_CHARSET']))
session_start();
$_SESSION['id'] = $id;
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
// продляем жизнь кукам
setcookie('login', $_COOKIE['login'], time() + TIME_COOKIE, '/', '.'.DOMEN);
setcookie('pass', $_COOKIE['pass'], time() + TIME_COOKIE, '/', '.'.DOMEN);
}
// если логин-пароль неправильные
else
{
// удаляем куки
setcookie('login', '', time() - TIME_COOKIE, '/', '.'.DOMEN);
setcookie('pass', '', time() - TIME_COOKIE, '/', '.'.DOMEN);
// надо ли делать переадресацию?
// header("Location: http://".DOMEN.$_SERVER['REQUEST_URI']);
}
}
// если в куках ничего нет
else
{
// если пользователь пытается авторизироваться
if(isset($_POST['login']) && isset($_POST['pass']))
{
// если такой пользователь найден
if($id = authLogin($_POST['login'],$_POST['pass']))
{
session_start();
$_SESSION['id'] = $id;
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
// устанавливаем куки
// надо ли тут делать проверку post-данных?
setcookie('login', $_POST['login'], time() + TIME_COOKIE, '/', '.'.DOMEN);
setcookie('pass', $_POST['pass'], time() + TIME_COOKIE, '/', '.'.DOMEN);
}
}
else
{
// надо как-то уведомить пользователя
// что введенные данные не верны
}
}
}
// если сессия уже была запущена
else
{
session_start(); // запускаем сессию
if(!authIP()) // если IP не совпадает
{
session_unset(); // уничтожаем переменные
session_destroy(); // уничтожаем сессию
// надо ли здесь чистить куки?
}
}
// -----------------------------------------------------------------------------------------
if(isset($_SESSION['id']))
{
// пользователь авторизировался
}
else
{
// форма авторизации
}
?>
Собственно, какие ошибки я тут допустил и как их избежать?
Что еще можно дополнить?
+ по ходу кода оставил еще несколько вопросов.
P.S. Хотел изначально весь алгоритм выложить ввиде блок-схемы, но понял что это займет черезчур много времени.
P.P.S. Касательно передачи идентификатора сессии через get-запросы, то думаю что лучше вообще этого не делать, так как черезчур легко украсть.