|
|
|
| Доброго времени суток форумчане, подскажите по механизму сессий
Имеется элементарная форма авторизации на сайте, и если логин и пароль пользователя правильные, то стартуем сессию session_start();
затем в каждом файле где требуется авторизация (помимо проверки авторизационных данных) вставляю:
<?
if (isset($_REQUEST[session_name()]))
{
session_start();
}
?>
|
НО, этого не достаточно, потому что любой НЕ авторизованный пользователь, дописав в URL ?PHPSESSID=ля-ля-ля, выполнит session_start();, чего не очень хотелось бы, дабы не плодить сессионные файлы неавторизованых посетителей
Пробовала так:
<?
if (isset($_REQUEST[session_name()]) && file_exists('папка хранения сессий/sess_'.session_id()))
{
session_start();
}
?>
|
не работает:( как проверять что сессия стартовала именно через форму авторизации? | |
|
|
|
|
|
|
|
для: selma
(30.01.2011 в 06:13)
| | Авторизован или нет, нужно проверять по признаку установленному в сессии, а не по имени сессии. | |
|
|
|
|
|
|
|
для: sim5
(30.01.2011 в 08:33)
| | т.е ? можно поподробней? Вы хотите сказать, нужно при авторизации создавать какую нибудь отдельную сессионную переменную, и уже при ее наличии или отсутсвию стартовать или НЕ стартовать сессию? | |
|
|
|
|
|
|
|
для: selma
(30.01.2011 в 08:46)
| | Если у вас не будет стартована сессия, то никакой сессионной переменной естественно не будет. Ну вы же не будете доверять словам человека, что он хороший лишь только потому, что он назвался Вася? | |
|
|
|
|
|
|
|
для: sim5
(30.01.2011 в 08:55)
| | я это уже проверила опытным путем, объясните что нужно сделать?
-нужно проверять по признаку установленному в сессии, а не по имени сессии
Как? | |
|
|
|
|
|
|
|
для: selma
(30.01.2011 в 09:01)
| | Сессия уже должна быть стартована, и если логин и пароль Yes, устанавливаете признак в ней, что да, yes. Вот по нему и проверяйте. Другими словами этот признак, по которому вы даете разрешение, не пользователь должен вам присылать, а вы устанавливать и контролировать. | |
|
|
|
|
|
|
|
для: sim5
(30.01.2011 в 09:16)
| | Дак суть в том что задумка не скапливать ненужные файлы сессий, а только авторизованных пользователей, вот поэтому при удачной авторизации сессия стартуется...а не просто так
Уважаемый SIM5 я понимаю что большинство вещей в этом мире можно описать словами, но не покажете ли вы примером КАК это осуществить | |
|
|
|
|
|
|
|
для: selma
(30.01.2011 в 09:20)
| | А вам, что лично приходится веником сессии выметать или они портят интерьер квартиры вашей?
Сессии не скапливаются навечно, их удаляет мусорщик, сессия пользователя А никак не мешает сессии пользователя В. В чем может быть тут проблема? | |
|
|
|
|
|
|
|
для: sim5
(30.01.2011 в 09:50)
| | У меня конкретная задача, сохранять сессии только авторизованных пользователей. Если знаете подскажите на примере как это осуществить? | |
|
|
|
|
|
|
|
для: selma
(30.01.2011 в 09:56)
| | Где сохранять? Я понимаю, что в базу поместить, но временный файл...
Имя сессии, как признак авторизации никоим образом нельзя применять. Можно передать некий временный ключ, который после старта сессии удалить, но этот ключ должен храниться на сервере для проверки, а это означает, что нужно писать собственный механизм. Зачем же писать собственный, подменяя уже имеющийся? | |
|
|
|
|
|
|
|
для: sim5
(30.01.2011 в 10:05)
| | Вот что нашла в интернете:
Пример авторизации с помощью сессий
Проиллюстрируем все вышенаписанное небольшим примером:
создадим файл auth.php:
<?
if (isset($_POST['auth_name'])) {
$name=mysql_real_escape_string($_POST['auth_name']);
$pass=mysql_real_escape_string($_POST['auth_pass']);
$query = "SELECT * FROM users WHERE name='$name' AND pass='$pass'";
$res = mysql_query($query) or trigger_error(mysql_error().$query);
if ($row = mysql_fetch_assoc($res)) {
session_start();
$_SESSION['user_id'] = $row['id'];
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
exit;
}
if (isset($_GET['action']) AND $_GET['action']=="logout") {
session_start();
session_destroy();
header("Location: http://".$_SERVER['HTTP_HOST']."/");
exit;
}
if (isset($_REQUEST[session_name()])) session_start();
if (isset($_SESSION['user_id']) AND $_SESSION['ip'] == $_SERVER['REMOTE_ADDR']) return;
else {
?>
<form method="POST">
<input type="text" name="auth_name"><br>
<input type="password" name="auth_pass"><br>
<input type="submit"><br>
</form>
<?
}
exit;
?>
|
//теперь достаточно написать во всех защищаемых скриптах строчку
//require "auth.php";
Заметьте никакого собственного механизма не создано, НО есть одно но
if (isset($_REQUEST[session_name()])) session_start();
|
можно не имея авторизации прописать любое значение идентификатора, и файл сессии создасться...что не приемлемо | |
|
|
|
|
|
|
|
для: selma
(30.01.2011 в 10:13)
| | Вы видимо не так вопрос задали, вам видимо хочется, чтобы у авторизованного пользователя имя сессии было постоянным? | |
|
|
|
|
|
|
|
для: sim5
(30.01.2011 в 10:31)
| | И это тоже:
Я зашла на сайт (Сессия не должна создаваться)
Могу бродить по сайту сколько захочу, НО если я хочу написать сообщение или еще что угодно, необходимо авторизироваться, после авторизации, для меня (как уже авторизованого пользователя) создается сессия, и не изменяется пока я не выйду (уничтожу сессию).
Теперь понятен вопрос?
Все файлы сессий хранятся в определенной папке. (ответ на пост выше) | |
|
|
|
|
|
|
|
для: selma
(30.01.2011 в 10:35)
| | Логин и пароль ОК.
Если не нет имени сессии, запоминаем в базе, иначе извлекаем его.
Удаление существующей сессии и старт новой.
Признак авторизации пишем в сессию.
Продолжаем сессию и проверям признак авторизации. | |
|
|
|
|
|
|
|
для: sim5
(30.01.2011 в 10:45)
| | Можно ли без использования хранения сессий в базе и вообще без собственного механизма? | |
|
|
|
|
|
|
|
для: selma
(30.01.2011 в 10:51)
| | Зачем хранить сессию в базе? Храните имя ее, стартуя под этим именем, если вам так уж надо имя постоянное, этого не достаточно разве для целей ваших. А нет, так и забыли об этом.
Главное, вы должны проверять некий ключ, который указывает, что авторизация прошла, а для этого и нужен механизм хранящий его - сессия. | |
|
|
|