web-dev-qa-db-fra.com

PHP Session Destroy on Log Out Button

Je travaille actuellement sur un site qui dispose d'une connexion (nom d'utilisateur et mot de passe) - La protection par mot de passe est effectuée par le système d'exploitation au sein du serveur Web au niveau du dossier appelé royaume au sein du système d'exploitation. Pour l'instant, cela devra faire, jusqu'à ce que nous trouvions un bon système de connexion PHP.

Le code ci-dessous, est basé sur un question précédente sur le débordement de pile.

J'utilise 3 fichiers (voir les extraits de code en bas).

Le processus est le suivant: - Cliquez sur le bouton Connexion sur index.php - Entrez le nom d'utilisateur et le mot de passe pour accéder au fichier d'index authentifié. - Cliquez sur le bouton de déconnexion, qui fait référence au fichier logout.php - il DEVRAIT vider le cache et ramener l'utilisateur à l'index de niveau supérieur.

Cela ne "détruit pas la session" dans le sens où vous n'êtes pas invité à ressaisir le mot de passe lorsque vous y êtes invité, ce qui est essentiellement ce que je veux faire.

Ma connaissance minimale de php me laisse un peu perplexe ici.

index.php (fichier de niveau supérieur avec bouton de connexion)

<?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 (Ce dossier est protégé par mot de passe - contient le fichier d'index avec le bouton de déconnexion qui renvoie au fichier 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

Le dossier protégé par mot de passe a rien à voir avec PHP!

La méthode utilisée est appelée "Authentification de base". Il n'y a aucun moyen de se déconnecter entre les navigateurs, sauf pour demander à l'utilisateur de fermer puis d'ouvrir son navigateur ...

Voici comment vous pouvez le faire dans PHP à la place (supprimez complètement votre authentification de base Apache dans .htaccess ou où que ce soit en premier):

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>';

Évidemment, c'est une implémentation de base très. Vous vous attendriez à ce que les noms d'utilisateur et les mots de passe soient dans une base de données, et non à titre de comparaison codée en dur. J'essaie juste de vous donner une idée de la façon de faire la session.

J'espère que cela vous aidera à comprendre ce qui se passe.

26
user1318194

Donnez d'abord le lien de logout.php page dans ce bouton de déconnexion. Dans cette page, faites le code qui est donné ci-dessous:

Voici le code:

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

Lorsque la session a démarré, la session du dernier utilisateur/actuel a été démarrée, vous n'avez donc pas besoin de déclarer le nom d'utilisateur. Il sera supprimé automatiquement par la méthode session_destroy.

6
Jana

// Connectez - Out

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

?>

2
Iulia