2012-05-12 3 views
8

J'ai actuellement le code suivant pour CHAQUE page sur mon site Web. S'il vous plaît quelqu'un pourrait-il confirmer si c'est une bonne pratique pour démarrer et continuer une session PHP?Session PHP rapide et efficace

//************************************************************ 
//Session Settings 
//************************************************************ 

$session_name = 'PHPSESSID'; 
$session_exp_time = 10000; 

$previous_name = session_name($session_name); 

//Set garbage collection parameters 
ini_set('session.gc_maxlifetime', $session_exp_time); 
ini_set('session.gc_probability', '1'); 
ini_set('session.gc_divisor', '100'); 

ini_set('session.name', $session_name); 
ini_set('session.cookie_domain', ''); //Session set to not be available to subdomains 
ini_set('session.cookie_lifetime', 0); 

//Set the session cookie parameters 
session_set_cookie_params($session_exp_time, '/', ''); 

//Start or continue a session... 
@session_start(); 

if (isset($_COOKIE[$session_name])) 
setcookie($session_name, $_COOKIE[$session_name], 2147483647, ''); 

Veuillez noter que ce script est inclus dans CHAQUE page.

Une autre question connexe:

Dois-je mettre une session personnalisée chemin de sauvegarde ou devrais-je utiliser la session par défaut du serveur chemin de sauvegarde? Quels sont les avantages et inconvénients? D'après ce que je comprends, si vous ne définissez pas un chemin de sauvegarde de session personnalisé, alors il est possible que vous ayez un conflit sur un hébergement partagé? S'il vous plaît aidez à éclairer.

Merci d'avance!

+1

Avez-vous accès au fichier php.ini du serveur? Ou supporte-t-il les fichiers .htaccess? Si oui, beaucoup de ces entrées ini peuvent aller. –

+1

Vous pouvez également insérer cela dans un fichier php inclus de sorte que vous n'incluez le fichier qu'à chaque fois et pas à chaque fois. À moins que vous ne le fassiez déjà. Et comme @Jack dit php.ini ou htaccess sont d'autres endroits où vous pouvez ajouter ce code. Cependant, si vous le placez dans son propre fichier php et que vous l'incluez une fois par page, vous ferez 1 changement dans un fichier et il sera automatiquement mis à jour partout où le fichier est référencé. – Danny

Répondre

5

Plusieurs de vos instructions impliquent des paramètres de configuration de session; ceux-ci peuvent généralement être déplacés dans le php.ini du serveur ou dans le niveau supérieur .htaccess (Apache).

session.name = PHPSESSID 
session.gc_maxlifetime = 10000 

session.gc_probability = 1 
session.gc_divisor = 1000 

session.cookie_domain = 
session.cookie_path =/
session.cookie_httponly = 1 
session.cookie_lifetime = 0 

Vous ne devriez pas faire durer les sessions aussi longtemps que vous (expiration en 2038); les sessions sont normalement perpétuées avec des cookies de session (qui durent jusqu'à ce que le navigateur soit fermé, techniquement). Si vous souhaitez implémenter une fonctionnalité "remember me", je vous suggère d'ajouter cela au-dessus de vos sessions, comme expliqué ici: http://jaspan.com/improved_persistent_login_cookie_best_practice

Je trouve important de faire la distinction entre le démarrage d'une nouvelle session et la reprise d'une session existante, en particulier dans les cas où les sessions sont créées uniquement dans le cadre d'un processus de connexion. Lorsqu'une session ne peut pas être reprise, quelque chose s'est mal passé et l'utilisateur doit être redirigé vers la page de connexion (ou page d'accueil).

PHP ne comprend pas cette différence, session_start créera automatiquement une session si elle n'est pas là, et pire, si un ID de session arbitraire est donné; Ce dernier permet les attaques d'adoption de session comme indiqué ici: http://gihyo.jp/dev/serial/01/php-security/0025 - il est en japonais, vous devrez le traduire avec votre navigateur.

Pour savoir si une session peut être reprise, vous devez amorcer chaque nouvelle session en ajoutant une clé spéciale (par exemple, $_SESSION['_id'] = session_id()). Si cette clé est trouvée, la session existe déjà et vous pouvez la reprendre; sinon, la session n'existait pas ou quelqu'un essayait de vous donner un mauvais identifiant.

Pour commencer une nouvelle session, vous devez d'abord voir si elle peut être reprise; sinon, vous utilisez session_regenerate_id(true) pour modifier l'ID de session (ce qui rend plus difficile le piratage d'une session par un attaquant). Enfin, les chemins de sauvegarde de session sur un serveur partagé peuvent être écrits dans votre propre dossier personnel, mais cela n'a de sens que si votre hôte partagé s'exécute avec un utilisateur dédié par hôte virtuel (par exemple, suexec). Sinon, pour protéger votre session des attaques de surveillance, vous devrez encoder les données de session (et peut-être aussi les clés). Découvrez l'extension mcrypt: http://sg.php.net/mcrypt - vous devriez être en mesure de trouver des exemples en ligne. J'espère que cela répond plus ou moins à votre question. Faites-moi savoir si vous pensez que quelque chose ne va pas.

+0

Merci d'avoir pris le temps de m'aider, Jack. Appréciez beaucoup. J'ai du mal à savoir si la session peut être reprise ou non. J'ai essayé d'utiliser: if (session_id() == '') pour voir si la session a commencé, mais elle retourne toujours TRUE, même si la session a déjà commencé? –

+0

Vous pouvez toujours appeler session_start(), puis rechercher une clé dans cette session comme décrit, c'est-à-dire isset ($ _ SESSION ['_ started']) –