2009-08-04 3 views
13

Nhận nó từ php.net, nhưng tôi không chắc đây có phải là cách mọi người phá hủy tất cả các phiên không?Đây có phải là cách thích hợp để tiêu diệt tất cả dữ liệu phiên trong php không?

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

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

    session_destroy(); 

Mã có phá hủy tất cả các phiên không ?? Đó có phải là cách phổ biến nhất? làm thế nào để các bạn tiêu diệt các phiên php?

Oh yeah, btw, cái gì là session_name()? Tất cả tên phiên? ví dụ: $_SESSION['var1'], $_SESSION['var2'], ...?

Tôi không cần sử dụng unset($_SESSION['var1']); nữa?

Sự khác nhau giữa việc sử dụng session_destroy()unset($_SESSION[]) là gì?

+0

Tại sao bạn muốn vô hiệu hóa tất cả các phiên? – Gumbo

+1

Tôi chỉ tò mò về phiên php và những thứ bảo mật :) – bbtang

+0

Đây thực sự là 2 câu hỏi. – Mez

Trả lời

21

Trước tiên, bạn nên biết phiên nào là: Bạn có thể xem phiên là vùng chứa dữ liệu ở phía máy chủ được liên kết với số nhận dạng ngẫu nhiên, ID phiên. ID phiên đó cần được máy khách cung cấp để máy chủ có thể tải dữ liệu được liên kết với ID phiên đó (và do đó đến phiên đó) vào biến số $_SESSION. Mọi thứ trong biến số $_SESSION này còn được gọi là biến phiên của phiên hiện tại đang hoạt động.

Bây giờ câu hỏi của bạn:

Liệu mã sẽ phá hủy tất cả các phiên ?? Đó có phải là cách phổ biến nhất? làm thế nào để các bạn tiêu diệt các phiên php?

Mã được cung cấp chỉ xóa dữ liệu phiên của phiên hiện tại. Câu lệnh $_SESSION = array(); sẽ chỉ cần đặt lại biến phiên $_SESSION để truy cập trong tương lai trên biến phiên $_SESSION sẽ không thành công. Nhưng bản thân vùng chứa phiên không bị xóa. Điều đó sẽ được thực hiện bằng cách gọi số session_destroy.

cũng Truly destroying a PHP Session?

Oh yeah Thấy chưa, btw, session_name đó là những gì() ?? Tất cả tên phiên? ví dụ: $ _SESSION ['var1'], $ _SESSION ['var2'] ...?

session_name chỉ được sử dụng để xác định thông số ID phiên được chuyển trong cookie, truy vấn URL hoặc thông số POST.Giá trị mặc định của PHP là PHPSESSID. Nhưng bạn có thể thay đổi nó thành bất cứ điều gì bạn muốn.

Tôi không cần sử dụng unset ($ _ SESSION ['var1']); còn nữa ???

No. $_SESSION = array(); ban đầu sẽ xóa tất cả dữ liệu phiên.

Sự khác nhau giữa việc sử dụng session_destroy và không được đặt ($ _ SESSION []) ??

session_destroy sẽ xóa container toàn bộ phiên trong khi unset hoặc thiết lập lại biến $_SESSION sẽ chỉ xóa các dữ liệu phiên cho bộ thực thi hiện hành.

12

Điều này chỉ phá hủy phiên người dùng hiện tại, không phải tất cả phiên người dùng khác.

Hãy thử sử dụng session_save_path() để tìm hiểu dữ liệu phiên đang được lưu trữ ở đâu và sau đó xóa tất cả các tệp ở đó.

+0

Omg, tôi thực sự vô tình về nó .. Tôi mặc dù nó sẽ phá hủy tất cả các phiên, cuz trong nhận xét đã nêu: // Bỏ đặt tất cả các biến phiên ... sigh .. T_T – bbtang

+2

@bbtang: Nó phá hủy tất cả các biến phiên của phiên hiện đang hoạt động. – Gumbo

2

session_name() là tên được chuyển trong cookie/chuỗi truy vấn. Thường là PHPSESSID nhưng có thể thay đổi.

Không có cách nào đúng để hủy tất cả các phiên. Như @Marius nói, bạn có thể thử xóa các tập tin phiên từ session_save_path() nhưng đó là một hack tốt nhất.

Hoặc bạn có thể sử dụng session_set_save_handler() để lưu phiên của mình vào nơi nào đó mà bạn có nhiều quyền kiểm soát hơn, chẳng hạn như cơ sở dữ liệu.

2

Để phá hủy một phiên duy nhất, bạn nên sử dụng như sau: -

session_destroy(); 

Giả sử bạn đã sử dụng session_start() để bắt đầu trước đó/tiếp tục một phiên làm việc.

Phá hủy tất cả các phiên thực sự tùy thuộc vào thiết lập của bạn và cách bạn xử lý phiên. Đối với hầu hết các lượt cài đặt PHP, việc xử lý phiên được thực hiện thông qua các tệp, vì vậy cách tốt nhất là tìm thư mục lưu tất cả các phiên (thường được tìm thấy từ session_save_path()) và xóa tất cả các tệp trong đó.

Tôi nghĩ rằng, cách tốt nhất để xử lý việc này có thể là đặt trước dấu thời gian trong mỗi phiên mà bạn tạo. Điều này có nghĩa là sau đó bạn có thể so sánh dấu thời gian đó với một điểm đặt (thời điểm bạn muốn vô hiệu tất cả các phiên) và làm mất hiệu lực phiên nếu nó trước thời gian đó. Điều này cũng có nghĩa là bạn có thể làm những việc như thiết lập một thời gian chờ cụ thể cho một phiên làm việc, vv vv

Một cách khác có thể thay đổi để sử dụng cơ sở dữ liệu phiên lưu trữ - bạn có thể tìm thấy một hướng dẫn tốt cho việc này here

2

i biết đây là một chủ đề cũ ... nhưng tôi chỉ muốn chia sẻ :)

tôi phát hiện ra rằng thay vì sử dụng thư mục tạm thời cho phiên, bạn có thể lưu nó vào cơ sở dữ liệu. về mặt kỹ thuật, quản lý các phiên là có thể.

Mã của tôi:

(chủ yếu là plaigiarised từ 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`) 
) 

xử lý phiên (tôi đặt nó trong một php_session.class.php tập tin riêng biệt gọi là):

<?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 

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

xin lỗi vì mã lộn xộn ở đó.

để sử dụng

QUAN TRỌNG: đặt trước khi gọi 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')); 

sau đó gọi trong session_start() và thực hiện của bạn!

Vì nó trong mysql, bạn có thể xem ai đang trực tuyến thông qua id người dùng (được đặt cho mình bằng $ _SESSION) và thực hiện các chức năng như đăng xuất và công cụ (đó là những gì tôi đang sử dụng).

0

Nếu bạn muốn tránh các cảnh báo:

Cảnh báo: session_destroy(): Đang cố gắng để tiêu diệt phiên uninitialized trong ... trên đường dây 18

Đừng quên để thêm session_start(); vào đầu mã của bạn. Khác với mã bạn cung cấp hoạt động như dự định.

0

Cách đơn giản nhất không phải là để xóa tất cả các phiên cùng một lúc, nhưng nhớ đăng nhập cuối cùng của bạn và dấu thời gian của các thiết lập lại phiên làm việc.

//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(); 
} 

Nó sẽ không xóa tất cả các tệp phiên, nhưng sẽ ngăn các phiên cũ chạy. Và bạn không phải dựa vào bộ thu gom rác. Không tìm thấy câu trả lời tương tự ở đây vì vậy tôi phải thêm câu trả lời này. Chúc một ngày tốt lành.

Để thêm câu hỏi của bạn:

Mã của bạn sẽ chỉ hủy phiên duy nhất của bạn và là cách phổ biến nhất để tôi đăng xuất.

session_name sẽ cung cấp cho bạn tên biến, sử dụng php để trao đổi cookie, bạn sẽ không cần hầu hết thời gian. Mã được sử dụng trong ví dụ của bạn là một mã rất cũ, vui lòng không sử dụng mã này.

Bạn không phải bỏ đặt từng mục mảng bằng cách bỏ đặt nếu bạn sử dụng session_destroy hoặc session_unset.

unset ($ _ SESSION) sẽ không hoạt động.

0

Để loại bỏ tất cả các file phiên từ PHP, bạn có thể sử dụng chức năng này:

<?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; 
}