web-dev-qa-db-ja.com

PHP [ログアウト時にセッションを破棄]ボタン

現在、ログインしているサイト(ユーザー名とパスワード)で作業しています-パスワード保護は、OS内のレルムと呼ばれるフォルダーレベルのWebサーバー内のオペレーティングシステムによって実行されます。現時点では、適切なPHPログインシステムを見つけるまで、これを行う必要があります。

以下のコードは、 スタックオーバーフローに関する前の質問 に基づいています。

3つのファイルを使用しています(下部のコードスニペットを参照)。

プロセスは次のとおりです。-index.phpで[ログイン]ボタンをクリックします-ユーザー名とパスワードを入力して、認証インデックスファイルにアクセスします。 -logout.phpファイルを参照するログアウトボタンをクリックします-キャッシュをクリアし、ユーザーをトップレベルのインデックスに戻す必要があります。

プロンプトが表示されたときにパスワードの再入力を求められないという意味では、「セッションを破棄する」ことはありません。これは基本的に私がしたいことです。

私のPHPに関する最低限の知識は、ここで少し困惑させられます。

index.php(ログインボタン付きのトップレベルファイル)

<?php session_start(); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Test</title>
</head>
<body>
<a href="authenticate/index.php">Log In Btn</a>
</body>
</html>

authenticate/index.php(このフォルダはパスワードで保護されています-logout.phpファイルにリンクするログアウトボタンのあるインデックスファイルが含まれています)

<?php session_start(); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Log out</title>
</head>
<body>
<a href="logout.php">Log Out Btn</a>
</body>
</html>

authenticate/logout.php

<?php   
session_start(); //to ensure you are using same session
session_destroy(); //destroy the session
header("location:/index.php"); //to redirect back to "index.php" after logging out
exit();
?>
11
fitzilla

パスワードで保護されているフォルダーには、PHPでnothingと関係があります!

使用されている方法は「基本認証」と呼ばれます。ユーザーにブラウザを閉じてから開くように要求する以外に、ブラウザから「ログアウト」するクロスブラウザの方法はありません...

代わりにPHPでそれを行う方法は次のとおりです(.htaccessまたは最初の場所でApacheの基本認証を完全に削除します):

login.php:

<?php
session_start();
//change 'valid_username' and 'valid_password' to your desired "correct" username and password
if (! empty($_POST) && $_POST['user'] === 'valid_username' && $_POST['pass'] === 'valid_password')
{
    $_SESSION['logged_in'] = true;
    header('Location: /index.php');
}
else
{
    ?>

    <form method="POST">
    Username: <input name="user" type="text"><br>
    Password: <input name="pass" type="text"><br><br>
    <input type="submit" value="submit">
    </form>

    <?php
}

index.php

<?php
session_start();
if (! empty($_SESSION['logged_in']))
{
    ?>

    <p>here is my super-secret content</p>
    <a href='logout.php'>Click here to log out</a>

    <?php
}
else
{
    echo 'You are not logged in. <a href="login.php">Click here</a> to log in.';
}

logout.php:

<?php
session_start();
session_destroy();
echo 'You have been logged out. <a href="/">Go back</a>';

明らかにこれはvery基本的な実装です。ユーザー名とパスワードは、ハードコードされた比較としてではなく、データベース内にあることが期待されます。私はあなたにセッションのことをする方法のアイデアを提供しようとしています。

これが何が起こっているのかを理解するのに役立つことを願っています。

26
user1318194

まず、そのログアウトボタンにlogout.phpページのリンクを指定します。そのページで、以下に示すコードを作成します。

コードは次のとおりです。

<?php
 session_start();
 session_destroy();
?>

セッションが開始されると、最後/現在のユーザーのセッションが開始されているため、ユーザー名を宣言する必要はありません。 session_destroyメソッドによって自動的に削除されます。

6
Jana

// ログアウト

if(isset($_GET['logout'])) {
    session_destroy();
    unset($_SESSION['username']);
    header('location:login.php');
}

?>

2
Iulia