使用Apache表单身份验证的PHP注销

时间:2019-04-16 14:37:07

标签: php apache session forms-authentication

我将Apache用作Web服务器。 它设置为使用

进行表单身份验证
<form method="POST">
  Username: <input type="text" name="httpd_username" value="" />
  Password: <input type="password" name="httpd_password" value="" />
  <input type="submit" name="login" value="Login" />
</form>

我无法登录,并且$_SERVER['PHP_AUTH_USER']设置正确。 凭据的后端是MySQL数据库。

我的问题是我受保护页面的注销过程。 我确实在附近挖了挖矿,对此有一个共识:

function logout() {
    // if ($debug) { echo "Logging out...<br />"; }
    echo "Logging out...<br />";
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
    $_SESSION = array();
    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params["path"], $params["domain"],
            $params["secure"], $params["httponly"]
        );
        // if ($debug) { echo "Session params: "; print_r($params); echo "<br />"; }
        echo "Session params: "; print_r($params); echo "<br />";
    }
    session_unset();
    session_destroy();
    $is_https = isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1)
        || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https';
    $url = ($is_https ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'];
    header("Location: {$url}");
}

不幸的是,这对我来说不起作用,我的会话仍然非常活跃。

我尝试取消设置($ _SERVER ['PHP_AUTH_USER']);但这也没有区别。

作为记录,print_r(session_get_cookie_params());给了我这个:

Array ( [filemanager] => Array ( [logged] => testuser ) )
auth_users: Array ( [0] => testuser ) 

我必须丢失一些东西,但是呢?

[更新]

非常仔细地查看浏览器端正在创建的内容,我发现有一个名为“ session”的cookie,该cookie是通过成功登录创建的。 如果我手动删除该Cookie,则会话结束,并且我必须重新登录。那就是我需要删除的cookie。 我尝试了setcookie("session","",time()-3600);unset($_COOKIE['session']);,但是都没有用;我想太容易了...

我到底该如何删除该东西?

注意:运行print_r($_COOKIE);时,它位于:Array ( [session] => 79Faq7Mn3pEmTflhKWNLE5khuWX3aNF9hT3Q8AApX9VNwFKqnU6m0ii/UXCvQ4rP16DSJb7OJj2cpcrqg0U9AXxVYrsf8/NHJ9jyZGTM9nY1jPA2R3mINJyoTf991qDApoS2/0zWCuw= [fm_cache] => 1 [fileexchanger] => psrfekv0il94e1589ge0lkkoul )

[更新2]

实际上,我可以从我的PHP代码中删除Cookie名称“会话” ... 事实是,如果我刷新页面,则cookie会以不同的ID立即返回。 该会话cookie实际上是在页面之外创建的,就好像我将print_r($_COOKIE);作为PHP文件中的第一行代码一样,我可以看到“会话” cookie在那里。

我只能看到的解释是它来自Apache。 这是从我的网站配置文件中获得的

 <Directory "/var/www/html/pathtofolder/">
    DirectoryIndex index.html
    AuthFormProvider dbd
    AuthType form
    AuthName "Restricted Server"
    Session On
    SessionCookieName session path=/
    SessionCryptoPassphrase secret
    AuthDBDUserPWQuery "SELECT password FROM table WHERE username = %s"
    ErrorDocument 401 /login.html
    Require valid-user
</Directory>

我检查了一下,SessionCookieName session path=/是创建该“会话” cookie的那个。 如果我将这一行注释掉,则简单的session_destroy();会将我注销。 再说一次,这也太简单了,因为现在,每次我单击链接,提交表单,重新加载时,无论如何,我都将重定向到登录页面。

任何帮助将不胜感激。

0 个答案:

没有答案