如何禁用PHP会话cookie?

时间:2008-10-27 23:33:26

标签: php session

我正在编写PHP代码,我希望自己使用POST传递会话ID。我不希望cookie存储会话,因为它会在用户退出POST周期时丢失。

PHP会自动设置cookie。我了解到可以通过在session.use_cookies中将php.ini设置为0来更改此行为。不幸的是,我无权访问该文件,我也不想破坏在同一台服务器上运行的其他脚本的行为。

有没有办法在PHP脚本中禁用或取消会话cookie?

编辑:由于建议的解决方案对我不起作用,我在代码中的位置使用$ _SESSION = array(),我发现会话应该无效。

6 个答案:

答案 0 :(得分:31)

使用ini_set()

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

或者在你的php.ini文件中:

session.use_cookies = 0

答案 1 :(得分:7)

错误可以通过创建自己的.htaccess文件来覆盖主机的默认设置,如果你还没有触及它,这是一个很棒的教程 http://www.askapache.com/htaccess/apache-htaccess.html

或者如果你懒得学习 只需在您的站点目录中创建一个“.htaccess”文件(是的,这是文件名)并放置以下代码

SetEnv session.use_cookies='0';

答案 2 :(得分:2)

您也可以将该设置放在.htaccess中,以便它适用于所有脚本,否则您需要确保在每个请求上调用代码。

例如

php_value session.use_cookies 0

答案 3 :(得分: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();

答案 4 :(得分: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(...)绕过了session模块,所以session不知道我调用了它。因此,在设置已删除的Cookie后,它会设置默认Cookie。

我在mac上测试:PHP 5.3.6与Suhosin-Patch(cli)(内置:2011年9月8日19:34:00)

答案 5 :(得分:-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>