web-dev-qa-db-fra.com

PHP session sans cookies

Existe-t-il un moyen de lancer une session persistante dans PHP sans placer de cookie de session? Existe-t-il d'autres moyens de maintenir une session sur plusieurs pages, par exemple une solution basée sur une adresse IP?

La raison pour laquelle je pose la question est la suivante: même si la plupart des utilisateurs utilisent des cookies, je souhaite savoir s’il est possible de connecter un système de connexion aux utilisateurs qui sont désactivés (même si j’estime que désactiver les cookies est une paranoïa inutile, personnellement).

52
Delan Azabani

Je ne pense pas que ce soit trop demander à vos utilisateurs d'activer les cookies. Je trouve ça bête quand les gens les éteignent complètement.

Sinon, vous pouvez définir votre session.use_only_cookies sur "0" pour forcer l'annexe d'un identifiant de session aux URL de votre php. Cette approche présente toutefois plusieurs inconvénients. Il s'agit principalement de conserver l'état dans l'URL, par opposition à l'en-tête Cookie. Si un utilisateur copiait et collait l'URL de la page sur laquelle il se trouvait et que quelqu'un d'autre cliquait dessus, il utiliserait 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();
56
PureForm

Vous pouvez définir la valeur ini de session.use_trans_sid sur true afin d'activer l'ajout de l'ID de session à chaque URL. Regardez cela .

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

5
halfdan

Vous pouvez utiliser les identifiants 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 des URL. Les adresses IP peuvent changer lorsque vous vous déplacez avec une carte sans fil et que les serveurs proxy ont la même adresse IP. Il est facilement cassé lorsque vous cliquez sur "une ancienne URL" (avec l'ancien ID de session).

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

Références:

3
Lekensteyn

Vous pouvez créer un enregistrement de base de données ou un fichier temporaire et vérifier $_SERVER vars par rapport à la demande à chaque chargement de page. C'est un risque pour la sécurité, mais avec suffisamment de variables (regardez la liste ici ), vous pouvez avoir l'impression que vous avez eu la chance de détourner jusqu'à détourner votre confiance. vous seul savez à quel point votre application doit être sécurisée.

0
gedq

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

Créez une table mysql avec trois champs: id_session, ip et clé temporaire unique (pour les utilisateurs connectés) ou toute autre condition de votre choix. Désactivez ensuite les cookies de session et use_trans_sid.

alors créez un code pour gérer le comportement de la session basé sur cette nouvelle table!

après session_start(), enregistrez la session_id dans la table, puis recevez-la de la table (par IP et toute autre condition), puis appelez

session_id($in_table_session_id);

pour plus d'informations et le guide complet, voir: https://Gist.github.com/mimrahe/77415f4a9e238c313bbe8c42f8a6b7fe

0
user6558741

La bonne réponse à cette question est NON. L'utilisation d'une combinaison de variables en plus d'un cookie n'est pas sécurisée.

Pensez-y: lorsqu'un utilisateur FIRST demande une page, le serveur l'envoie avec une valeur unique disant "HTTP est sans état, conservez-le afin que je sache que c'est vous" lors de votre prochain appel "". Cela signifie que cette personne, dans ce navigateur (quel que soit l'onglet), en cours d'exécution à ce moment-là, possède un jeton unique.

Si et seulement s’ils se sont connectés avec succès, ce jeton peut désormais être lié à une session côté serveur. Les jetons sont supposés être si longs et aléatoires que personne ne peut les deviner à temps.

Plusieurs navigateurs pourraient utiliser la même adresse IP. Plusieurs personnes peuvent avoir le même agent d'utilisateur EXACT. Un cookie est le seul système de stockage qui fonctionne.

En fait, il existe un autre moyen, qui consiste à ajouter le jeton unique à chaque lien vers le serveur ainsi qu'à tous les appels AJAX, tels que ?PHPSESSID=my-unique-token-189481958 -, mais il est difficile de coder.

0
Oliver Williams

Si je voulais faire cela, j'ajouterais l'identifiant de session dans le code HTML en tant que balise de commentaire, puis utiliserais et configurerais le code PHP pour utiliser l'identifiant de session inclus dans le code HTML. Je pense que ce sera plus pertinent de faire cela au lieu de le faire avec l’utilisateur IP ou d’ajouter l’identifiant de session dans l’URL.

0
Aryan amish