代码之家  ›  专栏  ›  技术社区  ›  ypnos

如何禁用PHP会话cookie?

  •  7
  • ypnos  · 技术社区  · 16 年前

    我正在编写PHP代码,希望通过post自己传递会话ID。我不希望cookie存储会话,因为当用户退出后循环时,它会丢失。

    PHP会自动设置可用的cookie。我知道通过设置 session.use_cookies 到0英寸 php.ini . 不幸的是,我没有访问该文件的权限,我也不想破坏在同一服务器上运行的其他脚本的行为。

    有没有一种方法可以禁用或作废PHP脚本中的会话cookie?

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

    6 回复  |  直到 9 年前
        1
  •  7
  •   lock    16 年前

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

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

    SetEnv session.use_cookies='0';
    
        2
  •  30
  •   superhero    9 年前

    使用 ini_set() :

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

    或者在php.ini文件中:

    session.use_cookies = 0
    
        3
  •  2
  •   DreamWerx    16 年前

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

    如。

    php值会话。使用cookies 0

        4
  •  2
  •   caiosm1005 Andrew Hare    12 年前

    如果您只需要能够在给定的时间Zap会话,请使用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();
    
        5
  •  1
  •   Michael Shebanow    12 年前

    我在使用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。

    我正在使用suhosin补丁(cli)在mac:php 5.3.6上进行测试(构建时间:2011年9月8日19:34:00)

        6
  •  -2
  •   staticsan    16 年前

    这样做的方法是自己设置会话。

    在中央包含文件中,所有其他文件都包含(您确实有其中一个文件,对吗?)你需要尽早做一些实际的事情。

    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>