2009-08-04 5 views
13

Получил это от php.net, но я не уверен, так это, как все уничтожают все сеансы?Это правильный способ уничтожить все данные сеанса в php?

// Unset all Sessions 
$_SESSION = array(); 

if (isset($_COOKIE[session_name()])) { 
    setcookie(session_name(), '', time() -42000, '/'); 
} 

    session_destroy(); 

Будет ли код уничтожать все сеансы? Это самый распространенный способ? как вы, ребята, уничтожаете сеансы php?

О да, кстати, что это такое session_name()? Все имя сеанса? например, $_SESSION['var1'], $_SESSION['var2'], ...?

Мне больше не нужно использовать unset($_SESSION['var1']);?

Какая разница между использованием session_destroy() и unset($_SESSION[])?

+0

Почему вы хотите, чтобы аннулировать все сеансы? – Gumbo

+1

Мне просто интересно узнать о php-сессии и о безопасности вещей :) – bbtang

+0

Это действительно 2 вопроса. – Mez

ответ

21

Сначала вы должны знать, какие сеансы: вы можете рассматривать сеансы как контейнер данных на стороне сервера, связанный со случайным идентификатором, идентификатором сеанса. Этот идентификатор сеанса должен быть предоставлен клиентом, чтобы сервер мог загружать данные, связанные с этим идентификатором сеанса (и, следовательно, на этот сеанс) в переменную $_SESSION. Все в этой переменной $_SESSION также называется переменными сеанса текущего активного сеанса.

Теперь вопросы:

ли код уничтожит все сеансы ?? Это самый распространенный способ? как вы, ребята, уничтожаете сеансы php?

Предоставленный код просто удаляет данные сеанса текущего сеанса. Оператор $_SESSION = array(); просто сбросит переменную сеанса $_SESSION, так что будущий доступ к переменной сеанса $_SESSION не удастся. Но сам сеансовый контейнер еще не удален. Это будет сделано по телефону session_destroy.

Смотрите также Truly destroying a PHP Session?

Ах да, кстати, что это такое session_name() ?? Все имя сеанса? например $ _SESSION ['var1'], $ _SESSION ['var2'] ...?

session_name используется только для идентификации параметра идентификатора сеанса, переданного в файле cookie, запросе URL-адреса или параметре POST.Значение по умолчанию PHP: PHPSESSID. Но вы можете изменить его на все, что захотите.

Мне не нужно использовать unset ($ _ SESSION ['var1']); больше прав ???

№. Начальный $_SESSION = array(); удаляет все данные сеанса.

Какая разница между использованием session_destroy и unset ($ _ SESSION []) ??

session_destroy удалит весь сеанс контейнер во время unset или сбросить переменную $_SESSION будет удален только данные сессии для текущей среды выполнения.

12

Это уничтожает сеанс текущих пользователей, а не все остальные сеансы пользователей.

Попробуйте использовать session_save_path(), чтобы узнать, где хранятся данные сеанса, а затем удалите все файлы там.

+0

Омг, я действительно не понимаю, что это .. Я бы это уничтожил все сессии, потому что в комментарии сказано: // Отменить все переменные сеанса ... sigh .. T_T – bbtang

+2

@bbtang: он уничтожает все переменные сеанса текущего сеанса. – Gumbo

2

session_name() - это имя, которое передано в файле cookie/querystring. Обычно это PHPSESSID, но его можно изменить.

Невозможно уничтожить все сеансы. Как говорит @Marius, вы можете попробовать удалить файлы сеанса с session_save_path(), но это взлом в лучшем случае.

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

2

Чтобы уничтожить одну сессию, вы должны использовать следующее: -

session_destroy(); 

Предполагая, что вы использовали session_start() ранее начала/возобновления сеанса.

Уничтожение всех сеансов действительно зависит от вашей настройки и того, как вы обрабатываете сеансы.

Для большинства установок PHP обработка сеанса выполняется с помощью файлов, поэтому наилучшим способом было бы найти папку, в которой хранятся все сеансы (обычно они встречаются из session_save_path()), и удалять все файлы под этим.

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

Другим способом может быть, чтобы изменить использовать хранимый Sessions - вы можете найти хороший учебник для этого here

2

я знаю, что это старый поток ... но я просто хотел поделиться :)

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

Мой код:

(в основном plaigiarised из http://www.tonymarston.net/php-mysql/session-handler.html#session.handler):

MySQL:

CREATE TABLE `php_session` (
`session_id` varchar(32) NOT NULL default '', 
`user_id` varchar(16) default NULL, 
`date_created` datetime NOT NULL default '0000-00-00 00:00:00', 
`last_updated` datetime NOT NULL default '0000-00-00 00:00:00', 
`session_data` longtext, 
PRIMARY KEY (`session_id`), 
KEY `last_updated` (`last_updated`) 
) 

обработчик сеанса (я положил его в отдельный файл под названием php_session.class.php):

<?php 

class php_Session 
{ 
    // **************************************************************************** 
    // This class saves the PHP session data in a database table. 
    // **************************************************************************** 

    // **************************************************************************** 
    // class constructor 
    // **************************************************************************** 
    function php_Session() 
    { 


    } // php_Session 



    // **************************************************************************** 
    function open ($save_path, $session_name) 
    // open the session. 
    { 
     // do nothing 
     return TRUE; 

    } // open 

    // **************************************************************************** 
    function close() 
    // close the session. 
    { 
     if (!empty($this->fieldarray)) { 
      // perform garbage collection 
      $result = $this->gc(ini_get('session.gc_maxlifetime')); 
//   $result = ini_set('session.gc_maxlifetime',0); 
      return $result;//$result 
     } // if 

     return FALSE; 

    } // close 

    // **************************************************************************** 
    function read ($session_id) 
    // read any data for this session. 
    { 
//  $fieldarray = $this->_dml_getData("session_id='" .addslashes($session_id) ."'"); 
     $fieldarray=array(); 
     $data= mysql_query("select * from php_session where session_id='" .addslashes($session_id) ."'")or die(mysql_error()); 
     while($row = mysql_fetch_array($data)) $fieldarray[]=$row; 
     if (isset($fieldarray[0]['session_data'])) { 
      $this->fieldarray = $fieldarray[0]; 
      $this->fieldarray['session_data'] = ''; 
      return $fieldarray[0]['session_data']; 
     } else { 
      return ''; // return an empty string 
     } // if 

    } // read 

    // **************************************************************************** 
    function write ($session_id, $session_data) 
    // write session data to the database. 
    { 
     if (!empty($this->fieldarray)) { 
      if ($this->fieldarray['session_id'] != $session_id) { 
       // user is starting a new session with previous data 
       $this->fieldarray = array(); 
      } // if 
     } // if 

     if (empty($this->fieldarray)) { 
      // create new record 
      $a = $session_id; 
      $b = date("Y-m-d H:i:s"); 
      $c = date("Y-m-d H:i:s"); 
      $d = addslashes($session_data); 
//   $this->_dml_insertRecord($array); 
      mysql_query("insert into php_session (session_id,date_created,last_updated,session_data) values ('$a','$b','$c','$d')"); 
     } else { 
      // update existing record 
      if (isset($_SESSION['login_id'])) { 
       $a = $_SESSION['login_id']; 
      } // if 
      $b = date("Y-m-d H:i:s"); 
      $c = addslashes($session_data); 
//   $this->_dml_updateRecord($array, $this->fieldarray); 
      mysql_query("update php_session set last_updated='$b',session_data='$c',user_id='$a' where session_id='$session_id'"); 
      $data= mysql_query("select * from php_session where session id='" .addslashes($session_id) ."'"); 
      while($row = mysql_fetch_array($data)) $fieldarray[]=$row; 
      $this->fieldarray = $fieldarray[0]; 
     } // if 

     return TRUE; 

    } // write 

    // **************************************************************************** 
    function destroy ($session_id) 
    // destroy the specified session. 
    { 
     $fieldarray['session_id'] = $session_id; 
     mysql_query("delete from php_session where session_id='$session_id'"); 

     return TRUE; 

    } // destroy 

    // **************************************************************************** 
    function gc ($max_lifetime) 
    // perform garbage collection. 
    { 
     $real_now = date('Y-m-d H:i:s'); 
     $dt1 = strtotime("$real_now -$max_lifetime seconds"); 
     $dt2 = date('Y-m-d H:i:s', $dt1); 

//  $count = $this->_dml_deleteSelection("last_updated < '$dt2'"); 
     mysql_query("delete from php_session where last_updated < '$dt2'"); 
     $count = mysql_affected_rows(); 

     return TRUE; 

    } // gc 

    // **************************************************************************** 
    function __destruct() 
    // ensure session data is written out before classes are destroyed 
    // (see http://bugs.php.net/bug.php?id=33772 for details) 
    { 
     @session_write_close(); 

    } // __destruct 

// **************************************************************************** 
} 
?> 

извините за грязный код.

использовать

ВАЖНО: положить перед вызовом session_start()

require_once 'php_session.class.php'; 
$session_class = new php_Session; 
session_set_save_handler(array(&$session_class, 'open'), 
        array(&$session_class, 'close'), 
        array(&$session_class, 'read'), 
        array(&$session_class, 'write'), 
        array(&$session_class, 'destroy'), 
        array(&$session_class, 'gc')); 

затем позвонить в session_start() и все готово!

С его помощью в mysql вы можете видеть, кто в сети через идентификатор пользователя (который настроен самостоятельно с использованием $ _SESSION), и выполнять функции, такие как их выключение и прочее (для чего они используют его).

0

Если вы хотите, чтобы избежать предупреждения:

Предупреждение: session_destroy(): Пытается уничтожить неинициализированную сессию в ... в строке 18

Не забудьте добавить session_start(); к началу вашего кода. Помимо этого код, который вы предоставили, работает по назначению.

0

Самый простой способ, чтобы не удалить все сеансы сразу, но помните свой последний логин и метки времени сброса сеанса.

//Start your session 
session_start(); 

//Get your stored timestamp of reset 
//(i.e. stored in database) 
$timestamp_reset = ... 

//Get your stored timestamp of your session 
//(i.e. store it in session or database when you log in) 
$timestamp_session = ... 

//See if the login was before the reset timestamp 
if ($timestamp_reset > $timestamp_session) { 
    //Reset you session and go on 
    session_unset(); 
} 

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

Для ваших дальнейших вопросов:

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

имя session_name даст вам имя переменной, используемой php для обмена файлами cookie, вам это не понадобится в большинстве случаев. Код, который используется в вашем примере, очень старый, пожалуйста, не используйте это.

Вам не нужно отключать каждый элемент массива, если вы используете session_destroy или session_unset.

unset ($ _ SESSION) не будет работать.

0

Чтобы удалить все файлы сеансов из PHP, вы можете использовать эту функцию:

<?php 
/** 
* Hack to destroy all PHP session files 
* 
* @param string   $prefixSessionFile Prefix of the session filename 
* @param int|null|false $sessionIdLength Expected Length of the session ID in the session filename. null: Determine automatically. false: do not check 
* 
* @return int Removed sessions 
* @throws Exception 
*/ 
function destroyAllPhpSessionFiles($prefixSessionFile = 'sess_', $sessionIdLength = 26) 
{ 
    if (session_status() === PHP_SESSION_DISABLED) { 
     throw new Exception('Session handling is disabled'); 
    } 
    if ($sessionIdLength === null) { 
     if (session_status() !== PHP_SESSION_ACTIVE) { 
      session_start(); 
     } 
     $sessionIdLength = strlen(session_id()); 
    } 
    // Allow to remove current session 
    session_abort(); 

    // Get session dir 
    if (!$sessionDir = session_save_path()) { 
     if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { 
      // Windows 
      $sessionDir = sys_get_temp_dir(); 
      // If this script is called from a user (example in cmd), but your server uses the system environment variable (system-wide temp dir): 
      //$sessionDir = system('echo %windir%') . DIRECTORY_SEPARATOR . 'Temp'; 
     } elseif (is_dir('/var/lib/php5')) { 
      // Ubuntu or Debian 
      $sessionDir = '/var/lib/php5'; 
     } elseif (is_dir('/var/lib/php/session')) { 
      // RHEL or CentOS 
      $sessionDir = '/var/lib/php/session'; 
     } 
     if (!$sessionDir || !is_dir($sessionDir)) { 
      $sessionDir = sys_get_temp_dir(); 
     } 
    } 

    // Drop session files 
    $files   = scandir($sessionDir); 
    $sessionsDeleted = 0; 
    $prefixLength = strlen($prefixSessionFile); 
    $filenameLength = $prefixLength + $sessionIdLength; 
    foreach ($files AS $file) { 
     if (substr($file, 0, $prefixLength) != $prefixSessionFile) { 
      // Prefix does not fit 
      continue; 
     } 
     if ($sessionIdLength && strlen($file) != $filenameLength) { 
      // Filename length does not fit 
      continue; 
     } 
     $path = $sessionDir . DIRECTORY_SEPARATOR . $file; 
     if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { 
      // Windows 
      exec('DEL ' . $path); 
     } else { 
      // Linux/Unix 
      shell_exec('rm -f ' . $path); 
     } 
     if (is_file($path)) { 
      throw new Exception('Could not delete session file ' . $path); 
     } 
     $sessionsDeleted++; 
    } 
    return $sessionsDeleted; 
} 
Смежные вопросы