我正在编写PHP代码,我希望自己使用POST传递会话ID。我不希望cookie存储会话,因为它会在用户退出POST周期时丢失。
PHP会自动设置cookie。我了解到可以通过在session.use_cookies
中将php.ini
设置为0来更改此行为。不幸的是,我无权访问该文件,我也不想破坏在同一台服务器上运行的其他脚本的行为。
有没有办法在PHP脚本中禁用或取消会话cookie?
编辑:由于建议的解决方案对我不起作用,我在代码中的位置使用$ _SESSION = array(),我发现会话应该无效。
答案 0 :(得分:31)
答案 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>