61 votes

Session PHP sans cookies

Existe-t-il un moyen de lancer une session persistante en PHP sans placer de cookie de session ? Existe-t-il d'autres moyens de maintenir une session entre les pages, comme une solution basée sur l'adresse IP ?

La raison de ma demande est que, bien que la plupart des utilisateurs aient activé les cookies, je veux voir s'il existe un moyen pour qu'un système de connexion fonctionne pour ceux qui les ont désactivés (même si je pense personnellement que la désactivation des cookies n'est qu'une paranoïa inutile).

63voto

PureForm Points 590

Je ne pense pas qu'il soit exagéré de demander à vos utilisateurs d'activer les cookies. Je trouve stupide que les gens les désactivent complètement.

Sinon, vous pouvez définir votre session.use_only_cookies à "0" pour forcer l'ajout d'un ID de session aux URL dans votre php. Cette approche présente toutefois plusieurs inconvénients. Principalement celui de conserver l'état dans l'URL, par opposition à l'en-tête du cookie. Si un utilisateur copiait et collait l'URL de la page sur laquelle il se trouve, et que quelqu'un d'autre cliquait dessus, ils utiliseraient tous deux la même session.

<?php
     ini_set("session.use_cookies", 0);
     ini_set("session.use_only_cookies", 0);
     ini_set("session.use_trans_sid", 1);
     ini_set("session.cache_limiter", "");
     session_start();

1 votes

Je crois que l'OP voulait session.use_cookies réglé sur 1

4 votes

Et il convient de noter que ces paramètres ne modifient pas les hyperliens JS et les en-têtes Location dans le code PHP.

0 votes

En effet, qui navigue encore avec les cookies désactivés en 2010 ? Bien que cela soit encore possible, je doute que quiconque le fasse encore ; et donc la question est plutôt académique. (Même les araignées peuvent avoir des cookies maintenant)

6voto

halfdan Points 16440

Vous pouvez définir la valeur ini-Value de session.use_trans_sid à true afin d'activer l'ajout de l'identifiant de session à chaque URL. Jetez un coup d'œil à ce .

Pour des raisons de sécurité, vous devez alors limiter la session à l'IP qui a créé la session. Cela n'est cependant pas parfaitement sûr, car une personne ayant la même IP (derrière un proxy, par exemple) pourrait réutiliser cette même session.

4voto

Lekensteyn Points 22873

Vous pouvez travailler avec les ID de session dans les URL, et désactiver les cookies avec :

ini_set('session.use_cookies', 0);
ini_set('session.use_only_cookies', 0);
ini_set('session.use_trans_sid', 1);
session_start();
// IP check
if($_SESSION['ip_check'] != $_SERVER['REMOTE_ADDR']){
   session_regenerate_id();
   session_destroy();
   session_start();
}
$_SESSION['ip_check'] = $_SERVER['REMOTE_ADDR'];
// session stuff

Remarque : il est fortement déconseillé d'utiliser des identifiants de session dans les URL. Les adresses IP peuvent changer lorsque l'on voyage avec une carte sans fil et les serveurs proxy ont la même adresse IP. Il est facile d'y remédier en cliquant sur une "ancienne URL" (avec l'ancien identifiant de session).

Vous pouvez également être intéressé par la création de votre propre fonction de gestion de session (en conjonction avec une base de données). Vous ignoreriez l'ID de session et le lieriez à l'adresse IP. (voir les exemples dans http://php.net/manual/en/function.session-set-save-handler.php )

Références :

6 votes

La liaison à une adresse IP semble être une mauvaise solution. Certains utilisateurs (d'entreprise ?) peuvent être situés derrière un proxy, où plusieurs utilisateurs peuvent avoir la même adresse IP.

3 votes

@Leander Wooord ! Cela peut conduire à de très mauvaises situations, où l'ensemble de l'entreprise / de la famille / de la résidence étudiante a accès au compte de votre utilisateur.

1 votes

En Allemagne, le plus grand fournisseur d'accès (Telekom) a même son propre proxy que beaucoup de gens utilisent. Ainsi, dans le pire des cas, un réseau de FAI à trous utilisera un seul compte. C'est vraiment ennuyeux car cela rend presque impossible de bannir des adresses IP si l'on ne veut pas se fier à l'en-tête X-HTTP-Forwarded-For.

0voto

Vous pouvez enregistrer l'identifiant de session par IP dans la base de données :

Créez une table mysql avec trois champs : session_id, ip et clé temp unique (pour les utilisateurs connectés) ou toute autre condition que vous souhaitez. Désactivez ensuite les cookies de session et use_trans_sid.

puis faire un code pour gérer le comportement de la session basé sur cette nouvelle table !

après session_start() enregistrer le session_id dans la table et plus tard le recevoir de la table (par IP et toute autre condition) et ensuite appeler

session_id($in_table_session_id);

Pour plus d'informations et un guide complet, voir : https://gist.github.com/mimrahe/77415f4a9e238c313bbe8c42f8a6b7fe

1 votes

Là encore, il s'agit d'une liaison par IP qui n'est pas tout à fait efficace, en particulier pour les domaines dans lesquels plusieurs utilisateurs partagent la même IP (par exemple, les proxys d'universités, d'entreprises ou d'organisations, etc.)

0 votes

@T30 Le lien "pour plus d'informations et un guide complet voir :" est mauvais -- le poster est "mort". Avez-vous un lien pour cela ? Merci de votre compréhension.

0 votes

Non, désolé, une recherche rapide sur archive.org ne donne aucun résultat...

0voto

gedq Points 439

Vous pourriez créer un enregistrement dans la base de données ou un fichier temporaire et vérifier $_SERVER contre la requête à chaque chargement de page. C'est un risque de sécurité, mais avec suffisamment de variables (regardez la liste aquí ), vous pouvez avoir l'impression d'avoir ramené le risque de détournement à un niveau acceptable ; vous seul savez à quel point votre application doit être sécurisée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X