2008-10-27 81 views
6

我正在編寫PHP代碼,我想使用POST自己傳遞會話標識。我不希望cookie存儲會話,因爲當用戶離開POST週期時它會丟失。如何禁用PHP會話cookie?

PHP在可用時自動設置cookie。我知道可以通過在php.ini中將session.use_cookies設置爲0來更改此行爲。不幸的是,我無法訪問該文件,也不想破壞在同一臺服務器上運行的其他腳本的行爲。

有沒有一種方法來禁用或無效PHP腳本中的會話cookie?由於建議的解決方案不適合我,我在代碼中的位置使用了$ _SESSION = array(),我發現會話應該失效。

回答

6

犯錯它可以通過創建自己的.htaccess文件來覆蓋你的主機的默認設置,這裏有一個很好的教程,如果你還沒有碰過,但 http://www.askapache.com/htaccess/apache-htaccess.html

或如果你太懶惰學習 剛在你的網站目錄下建立一個「的.htaccess」文件(是的這就是文件名),並把下面的代碼

SetEnv session.use_cookies='0'; 
+0

謝謝,不幸的是它不是Apache而是非常老的Netscape服務器.. – ypnos 2008-10-27 23:46:38

28

使用ini_set()

ini_set('session.use_cookies', '0'); 

或者在php.ini文件:

session.use_cookies = 0 
+0

謝謝。這應該可以解決我的問題,但不幸的是,現在PHP停止在腳本執行過程中(即使在html輸出中間)。 – ypnos 2008-10-27 23:39:10

+0

我不會將此標記爲正確的答案,因爲它會使PHP停用。也許是一個PHP的錯誤? – ypnos 2008-10-27 23:52:48

+0

似乎沒有任何反應。 htaccess解決方案爲我工作。 – Heroselohim 2014-10-06 03:44:32

2

你也可以把在.htaccess設置,以便它適用於所有的腳本,否則你需要確保每個請求都調用代碼。

例如,

php_value session.use_cookies 0

-2

這樣做的方法是自己設置會話。

在所有其他文件都包含的中心包含文件中(您確實有其中一個,對嗎?),您需要儘早做一些事情。

if(!array_key_exists('sessionid', $_POST)) { 
    // recreate the sessionid 
    $sessionid = md5(rand().' '.microtime()); // Or something 
} else { 
    $sessionid = $_POST['sessionid']; 

session_id($sessionid); 
session_start(); 

現在你要記住,一旦你開始的形式,你需要包括:

<input type='hidden' name='sessionid'><?= session_id() ?></input> 
2

如果你只需要能夠在給定的時間,使用扎普會話session_destroy()。如果您想徹底結束會話,這裏有一個片段複製/粘貼直出的文檔:

// Initialize the session. 
// If you are using session_name("something"), don't forget it now! 
session_start(); 

// Unset all of the session variables. 
$_SESSION = array(); 

// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (isset($_COOKIE[session_name()])) { 
    setcookie(session_name(), '', time()-42000, '/'); 
} 

// Finally, destroy the session. 
session_destroy(); 
1

我與PHP的成文規定,以摧毀一個會話瓦特/餅乾麻煩。

// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (ini_get("session.use_cookies")) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', time() - 42000, 
     $params["path"], $params["domain"], 
     $params["secure"], $params["httponly"] 
    ); 
} 

這是導致我看到的cookie設置兩次:

Set-Cookie: SESSION_NAME=deleted; expires=Sat, 08-Jan-2011 14:09:10 GMT; path=/; secure 
Set-Cookie: SESSION_NAME=1_4f09a3871d483; path=/ 

如PHP的意見記錄在案,設置cookie值比空(「」)以外的東西擺脫的「刪除「值,但第二個cookie集保留。

要擺脫的是,我不得不添加的代碼上面的建議:

ini_set('session.use_cookies', '0'); 

我沒有看過源處理會話,但我的猜測是的setcookie(...)是繞過會議模塊,所以會議不知道我叫它。所以,在我設置一個已刪除的cookie後,它將設置一個默認的cookie。

我是測試在Mac上:用了Suhosin貼片(CLI)PHP 5.3.6(建:2011年9月8日19點34分○○秒)