如何禁用PHP会话cookie?

10

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

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

有没有一种方法可以在PHP脚本中禁用或使会话cookie无效?

编辑:由于所提出的解决方案对我不起作用,我在代码中找到应该使会话无效的位置处使用了$_SESSION = array()

7个回答

36
使用 ini_set()
ini_set('session.use_cookies', '0');

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

session.use_cookies = 0

谢谢。这应该解决我的问题,但不幸的是,现在PHP会在脚本执行中间停止(甚至在HTML输出的中间)。 - ypnos
我不会将此标记为正确答案,因为它使 PHP 无效。也许是 PHP 的 bug? - ypnos
似乎没有任何反应。htaccess解决方案对我有用。 - Heroselohim

8
您可以通过创建自己的 .htaccess 文件来覆盖主机的默认设置。如果您还没有接触过,请参考这个很棒的教程: http://www.askapache.com/htaccess/apache-htaccess.html 如果您懒得学习,只需在站点目录下创建一个名为 ".htaccess" 的文件,并放入以下代码即可:
SetEnv session.use_cookies='0';

哦,谷歌总是我们的好朋友 ^_^ 告诉我服务器的名字,我会尝试在那里找到答案,嘿嘿嘿 - lock
你也可以尝试在session_start()调用后执行header_remove('Set-Cookie')。 - Jonny Nott

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

2

我在处理 PHP 中使用 cookie 销毁会话的文档方法时遇到了问题。

// 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值设置为除了空字符串('')之外的其他值可以去掉"deleted"值,但第二个设置的cookie仍然存在。

要完全摆脱它,我必须添加上面建议的代码:

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

我还没有查看会话处理的源代码,但我猜测setcookie(...)正在绕过会话模块,因此会话不知道我是否调用了它。因此,在我设置删除的cookie之后,它正在设置默认cookie。

我在Mac上进行测试:PHP 5.3.6 with Suhosin-Patch(cli)(built:Sep 8 2011 19:34:00)


2

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

例如:

php_value session.use_cookies 0


谢谢,不幸的是该网站正在运行Netscape服务器!:( - ypnos

1

如果您在一个已经定义了会话/头文件的应用程序位置的设置中,您也可以使用此代码块删除Set-Cookie HTTP头文件。

header_remove("Set-Cookie");

-4

做到这一点的方法是自己设置会话。

在所有其他文件都包含的中央包含文件中(您肯定有一个,对吧?),您需要尽早完成一些事情。

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>

这是一个非常糟糕的想法,仅使用传递的sessionid会使您容易受到会话固定攻击的影响。而且它并没有禁用PHP的cookie机制。 - hotzen
1
在评论旧答案时存在风险:回答者可能已经忘记了为什么以那种方式回答。 - staticsan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接