10

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

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

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

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

4

6 回答 6

34

使用ini_set()

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

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

session.use_cookies = 0
于 2008-10-27T23:35:13.667 回答
8

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

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

SetEnv session.use_cookies='0';
于 2008-10-27T23:38:32.177 回答
2

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

例如。

php_value session.use_cookies 0

于 2008-10-27T23:40:14.793 回答
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();
于 2008-10-28T19:53:18.777 回答
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 值设置为空 ('') 以外的值会删除“已删除”值,但保留第二个 cookie 集。

为了摆脱这种情况,我不得不添加上面建议的代码:

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

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

我在 Mac 上测试:带有 Suhosin-Patch (cli) 的 PHP 5.3.6(构建时间:2011 年 9 月 8 日 19:34:00)

于 2012-01-08T15:17:45.967 回答
-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>
于 2008-10-28T01:09:51.947 回答