Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: $_REQUEST[session_name()]
 
 автор: selma   (30.01.2011 в 06:13)   письмо автору
 
 

Доброго времени суток форумчане, подскажите по механизму сессий

Имеется элементарная форма авторизации на сайте, и если логин и пароль пользователя правильные, то стартуем сессию 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();
  }
?>

не работает:( как проверять что сессия стартовала именно через форму авторизации?

  Ответить  
 
 автор: sim5   (30.01.2011 в 08:33)   письмо автору
 
   для: selma   (30.01.2011 в 06:13)
 

Авторизован или нет, нужно проверять по признаку установленному в сессии, а не по имени сессии.

  Ответить  
 
 автор: selma   (30.01.2011 в 08:46)   письмо автору
 
   для: sim5   (30.01.2011 в 08:33)
 

т.е ? можно поподробней? Вы хотите сказать, нужно при авторизации создавать какую нибудь отдельную сессионную переменную, и уже при ее наличии или отсутсвию стартовать или НЕ стартовать сессию?

  Ответить  
 
 автор: sim5   (30.01.2011 в 08:55)   письмо автору
 
   для: selma   (30.01.2011 в 08:46)
 

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

  Ответить  
 
 автор: selma   (30.01.2011 в 09:01)   письмо автору
 
   для: sim5   (30.01.2011 в 08:55)
 

я это уже проверила опытным путем, объясните что нужно сделать?
-нужно проверять по признаку установленному в сессии, а не по имени сессии
Как?

  Ответить  
 
 автор: sim5   (30.01.2011 в 09:16)   письмо автору
 
   для: selma   (30.01.2011 в 09:01)
 

Сессия уже должна быть стартована, и если логин и пароль Yes, устанавливаете признак в ней, что да, yes. Вот по нему и проверяйте. Другими словами этот признак, по которому вы даете разрешение, не пользователь должен вам присылать, а вы устанавливать и контролировать.

  Ответить  
 
 автор: selma   (30.01.2011 в 09:20)   письмо автору
 
   для: sim5   (30.01.2011 в 09:16)
 

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

Уважаемый SIM5 я понимаю что большинство вещей в этом мире можно описать словами, но не покажете ли вы примером КАК это осуществить

  Ответить  
 
 автор: sim5   (30.01.2011 в 09:50)   письмо автору
 
   для: selma   (30.01.2011 в 09:20)
 

А вам, что лично приходится веником сессии выметать или они портят интерьер квартиры вашей?
Сессии не скапливаются навечно, их удаляет мусорщик, сессия пользователя А никак не мешает сессии пользователя В. В чем может быть тут проблема?

  Ответить  
 
 автор: selma   (30.01.2011 в 09:56)   письмо автору
 
   для: sim5   (30.01.2011 в 09:50)
 

У меня конкретная задача, сохранять сессии только авторизованных пользователей. Если знаете подскажите на примере как это осуществить?

  Ответить  
 
 автор: sim5   (30.01.2011 в 10:05)   письмо автору
 
   для: selma   (30.01.2011 в 09:56)
 

Где сохранять? Я понимаю, что в базу поместить, но временный файл...
Имя сессии, как признак авторизации никоим образом нельзя применять. Можно передать некий временный ключ, который после старта сессии удалить, но этот ключ должен храниться на сервере для проверки, а это означает, что нужно писать собственный механизм. Зачем же писать собственный, подменяя уже имеющийся?

  Ответить  
 
 автор: selma   (30.01.2011 в 10:13)   письмо автору
 
   для: 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(); 

можно не имея авторизации прописать любое значение идентификатора, и файл сессии создасться...что не приемлемо

  Ответить  
 
 автор: sim5   (30.01.2011 в 10:31)   письмо автору
 
   для: selma   (30.01.2011 в 10:13)
 

Вы видимо не так вопрос задали, вам видимо хочется, чтобы у авторизованного пользователя имя сессии было постоянным?

  Ответить  
 
 автор: selma   (30.01.2011 в 10:35)   письмо автору
 
   для: sim5   (30.01.2011 в 10:31)
 

И это тоже:

Я зашла на сайт (Сессия не должна создаваться)
Могу бродить по сайту сколько захочу, НО если я хочу написать сообщение или еще что угодно, необходимо авторизироваться, после авторизации, для меня (как уже авторизованого пользователя) создается сессия, и не изменяется пока я не выйду (уничтожу сессию).
Теперь понятен вопрос?

Все файлы сессий хранятся в определенной папке. (ответ на пост выше)

  Ответить  
 
 автор: sim5   (30.01.2011 в 10:45)   письмо автору
 
   для: selma   (30.01.2011 в 10:35)
 

Логин и пароль ОК.
Если не нет имени сессии, запоминаем в базе, иначе извлекаем его.
Удаление существующей сессии и старт новой.
Признак авторизации пишем в сессию.
Продолжаем сессию и проверям признак авторизации.

  Ответить  
 
 автор: selma   (30.01.2011 в 10:51)   письмо автору
 
   для: sim5   (30.01.2011 в 10:45)
 

Можно ли без использования хранения сессий в базе и вообще без собственного механизма?

  Ответить  
 
 автор: sim5   (30.01.2011 в 10:58)   письмо автору
 
   для: selma   (30.01.2011 в 10:51)
 

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

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования