web-dev-qa-db-fra.com

Comment supprimer PHPSESSID sur les ordinateurs clients

MISE À JOUR DU PROBLÈME:

  • Sur certains navigateurs, nous avons deux PHPSESSID.
  • Un PHPSESSID n'est défini par moi nulle part dans mon script
  • Il a l'hôte (au lieu de DOMAIN pour l'ensemble PHPSESSID I) sous www.mywebsite.com
  • J'ai essayé de le supprimer en utilisant setcookie: setcookie ("PHPSESSID", $_COOKIE['PHPSESSID'], time() - 864000, '/', 'www.mywebsite.com'); mais cela échoue.
  • Une tentative de suppression du cookie à l'aide de: setcookie ("PHPSESSID", $_COOKIE['PHPSESSID'], time() - 864000, '/'); entraîne la suppression de PHPSESSID que j'ai défini.
  • J'ai essayé d'utiliser session_name pour renommer la SESSION que j'ai définie. Cela fonctionne, mais mon serveur s'est écrasé plusieurs fois après quelques minutes.
  • Je suis à court d'options.

Je travaille avec PHP sessions sur mon site Web.

Le chemin de la session était/dossier, plus tard j'ai changé pour/pour s'adapter au nouvel objectif.

Maintenant, les anciens utilisateurs ne peuvent pas se connecter.

Il semble qu'ils aient maintenant deux PHPSESSID stockés dans leurs navigateurs - l'un avec chemin/dossier et l'autre /.

Que puis-je faire pour que les anciens utilisateurs puissent se connecter tout en veillant à ce que la session soit sur l'ensemble du site avec "/".

Plus d'informations

Quand j'ai dit deux phpsessionid, reportez-vous à l'image

 the two PHPSESSID

  1. Le login fonctionne si j'utilise

A. session_set_cookie_params(864000, '/cv', '.website.com', 0, 1);

mais ne fonctionne pas si j'utilise:

B. session_set_cookie_params(864000, '/', '.website.com', 0, 1);

  • Si j'utilise la version 2A ci-dessus, la session ne sera disponible que dans/cv et ne sera pas disponible dans d'autres dossiers de sites Web, par exemple. /dossier.

MISE À JOUR SUR LA SUPPRESSION DE PHPSESSID AVEC JAVASCRIPT

  • Quand je lance alert (document.cookie), il affiche tous les cookies sauf le PHPSESSID
  • Par conséquent, toutes les tentatives de suppression du cookie PHPSESSID échouent, alors que d'autres cookies peuvent être supprimés.

MISE À JOUR DE LA SUPPRESSION DE PHPSESSID AVEC PHP

  • Quand je var_dump($_COOKIE['PHPSESSID']); ce qui est retourné est la valeur de PHPSESSID avec le chemin/cv
  • Une tentative de suppression avec setcookie ("PHPSESSID", "", time() - 3600); échoue.
25
Ogugua Belonwu

Je pense que vous mélangez les choses ou que vous devriez aller plus en détail sur votre configuration/problème.

Le chemin de session de PHP est l'emplacement où les données de session sont stockées sur votre serveur, pas le client. Voir la documentation: https://secure.php.net/manual/fr/session.configuration.php#ini.session.save-path

Vous pouvez déplacer ces fichiers et remplacer/conserver en cas de collision comment bon vous semble. Cela n’est quasiment limité que par les permissions de lecture/écriture que vous avez lors de l’accès/déplacement et que votre utilisateur de serveur Web (par exemple Apache ou nginx) ou php-utilisateur dispose pour les lire/écrire à partir du/vers le nouvel emplacement. 

Si par "PHPSESSID dans leur navigateur" vous voulez dire que l'identifiant de session fait partie de vos urls, c'est-à-dire un paramètre différent de PHP, qui devrait être désactivé de toute façon, voir la notice dans la documentation: https://secure.php.net /manual/en/session.configuration.php#ini.session.use-trans-sid

modifier en fonction de votre question mise à jour:

Il existe déjà une solution Nice JS permettant de supprimer l'ancien cookie. J'irais avec ça. si vous ne pouvez pas simplement faire cela, vous pouvez faire une redirection vers /cv avec un script php qui lit le cookie et stocke les données quelque part (une base de données basée par exemple sur le user_id) et expire le cookie. Ensuite, vous pouvez rediriger vers l’ancienne page, rechercher le cookie "/" et restaurer les données. C'est un hack très moche, mais je ne pense pas que vous puissiez obtenir le cookie pour chaque chemin en PHP, car il est côté serveur et basé sur l'identifiant de session fourni par le client (mais je me trompe peut-être).

16
dbrumann

Je voudrais simplement expirer le cookie de /folder. Cela devrait vous laisser avec un seul cookie de session pour /

setcookie('PHPSESSID', '', time() - 86400, '/folder/');
5
Machavity

Vous pouvez modifier le nom du cookie de votre nouvelle session en utilisant session_name () avant session_start () et laisser le problème se résoudre tout seul dans quelques jours.

session_name("SESSION_ID");
session_start();
5
clemens321

Vous devez supprimer un cookie côté client. C'est possible avec javascript. 

Essayez ce javascript sur votre site:

<script type="text/javascript">
     document.cookie = "PHPSESSID=;Path=/cv;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
</script>

Un exemple:

Pour cet exemple, utilisez le site https://developer.mozilla.org/en-US/ .
Si je charge ce site sur les cookies, il y a les entrées suivantes  enter image description here Maintenant, je veux supprimer le cookie avec le nom dwf_section_edit. Pour supprimer ce cookie, je règle la date d'expiration sur le passé. Après que j'exécute 

document.cookie = "dwf_section_edit=;Path=/;expires=Thu, 01 Jan 1970 00:00:01 GMT;";

sur la console, le cookie est absent comme vous pouvez le voir sur l'image suivante (j'ai utilisé le petit bouton de rafraîchissement en bas à gauche du tableau car il n'est que temporaire dans cet exemple)

 enter image description here

Lors du prochain rechargement, je récupère le cookie dans cet exemple, car Mozilla me le rend. Sur votre site, vous n'avez pas à créer l'ancien cookie à nouveau et tout va bien.

3
Sebastian Brosch

J'imagine que votre script ne sait pas quelle session doit être accédée lors de session_start ();

Essayez de spécifier le chemin correct pour la session en utilisant

ini_set('session.cookie_path', '/');

ou

session_start(['cookie_path' => '/']);

en fonction de votre configuration

Si cela ne vous aide pas, je suggérerais d'utiliser session_regenerate_id () qui remplacera l'identifiant de session actuel par un nouvel identifiant et conservera les informations de la session actuelle.

2
Adam Fischer

Si vous envoyez manuellement l'en-tête avec la nouvelle date d'expiration pour le chemin souhaité, le client doit le supprimer.

session_start();
header("Set-Cookie:PHPSESSID=".session_id()."; expires=Sat, 07-Nov-1999 14:58:07 GMT; path=/cv/");

La première fois, vous avez l'ancien chemin du cookie, mais à partir de la deuxième page, seul le cookie dans le chemin / sera stocké et transmis.

Vous pouvez envoyer cet en-tête lorsque vous savez si le client est concerné par ce problème ou si cela dure quelques mois.

0
Luca Rainone

Il est mentionné ici , bien que l'utilisation de session_register () soit déconseillée et que l'utilisation de $ _SESSION soit préférée: -

Si session_start () n'a pas été appelé avant cette fonction, un appel implicite à session_start () sans paramètre sera effectué. $ _SESSION ne reproduit pas ce comportement et nécessite session_start () avant utilisation.

Puis, en utilisant $ _SESSION, ajoutez un fichier JSON avec Auth = True, avec TimeOut = 20 minutes.
Lorsque l'utilisateur se déconnecte ou après l'expiration du délai, définissez Auth = False . Lisez ensuite ce fichier JSON à l'aide de PHP et 

Ensuite, si Auth = False, créez JS en utilisant PHP cet événement OnLoad, document.cookie = 'PHPSESSID' + '=;expires=Thu, 01 Jan 1970 00:00:01 GMT;';

0
SUKUMAR S

Vous pouvez le supprimer en le définissant avec une heure précédente pour qu'il expire:

setcookie('phpsessid','value',time()-1);
0
Waqas Shahid

La solution sera de laisser les utilisateurs accéder au dossier / folder pendant la durée d’expiration de la session. Sur ce chemin, créez un script php pour copier ALL COOKIES de / dossier à / chemin en utilisant setcookie function ( http://php.net/manual /ro/function.setcookie.php

foreach ($_COOKIE as $key => $value) {
    setcookie($key, $value, $expire, "/")
}
// redirect to "/" now. User will be able to login.

Explication supplémentaire: les cookies sont liés à chemin et domaine, c'est important (et par défaut c'est /, mais il semble que ce ne soit pas votre cas). Donc, PHPSESSID depuis le sous-chemin (comme/folder ou/me) n'est pas accessible depuis le parent. Et ils se propagent de parent en enfant. Ainsi, les cookies de / moi sont les mêmes que pour / avec aucun attribut explicite. 

0
vitalii

Fournissez simplement le 4ème argument lorsque vous appelez la fonction setcookie:

setcookie ("PHPSESSID", "", time() - 3600, '/');

Explication

Le 4ème argument de la fonction setcookie() est $path de la session à définir. Et pour cela, "La valeur par défaut est le répertoire actuel dans lequel le cookie est défini.". (Voir: http://php.net/manual/en/function.setcookie.php .) Donc, si vous appelez cette fonction à partir d'un fichier localisant le dossier "/ folder", il essa cookie de ce dossier uniquement. En définissant le $path sur "/", nous demandons à la fonction de supprimer l'id de session du répertoire racine. 

Je l'ai testé et il a supprimé la variable PHPSESSID du cookie avec succès.

Oui, vous devez définir une durée négative pour le cookie afin que le navigateur puisse le supprimer. En outre, nous définissons la valeur stockée sur une chaîne vide, ce qui permet également de supprimer le même cookie ...

Ceci (en haut de votre page) conviendrait, assurez-vous juste de session_start() en premier:

setcookie('PHPSESSID', '', -3600, '/cv');

Cela fonctionne parfaitement sur tous mes domaines, j'ai eu ce problème une fois.

0
Solrac