OVH Cloud OVH Cloud

Souci avec les sessions

9 réponses
Avatar
Arnaud
Bonjour,

Nous développons une appli. en PHP 5 pour un de nos clients.
Le souci rencontré, est que la validation du login+password fonctionne
mais une fois redirigé vers menu.php, ce dernier redirige à nouveau vers
index.php.

Voici le code utilisée sur la page d'index (formulaire login) et qui
fonctionne bien :

ini_set('session.gc_maxlifetime',600);
ini_set('session.gc_probability',1);
ini_set('session.gc_divisor',1);
session_start();
$_SESSION['nom'] = $row->nom;
$_SESSION['prenom'] = $row->prenom;
session_write_close();
@odbc_free_result($sql_result);
@odbc_close($connection);
header('Location: menu.php');
Exit;

Voici celui utilisé dans le fichier menu.php :

session_start();
if(isset($_SESSION['nom']) && (!empty($_SESSION['nom'])))
{
echo "Bonjour ".$_SESSION['prenom']." ".$_SESSION['nom'];
}
else
{
header('Location: index.php');
Exit;
}

Que dois-je faire pour qu'une fois l'authentification réussie
(index.php), je suis sur à 100% de rester sur menu.php, bref que ma
session soit bien créee.

D'avance merci, Arnaud.

9 réponses

Avatar
Olivier Miakinen
Bonjour,


Nous développons une appli. en PHP 5 pour un de nos clients.
Le souci rencontré, est que la validation du login+password fonctionne
mais une fois redirigé vers menu.php, ce dernier redirige à nouveau vers
index.php.


Il suffirait de ne faire aucune redirection et de n'utiliser que des
include() ou require(). Histoire de livreur de machine à laver, tout ça...

http://groups.google.fr/groups?as_q=livreur&as_ugroup=fr.comp.lang.php&as_uauthors=john+gallet

Voici le code utilisée sur la page d'index (formulaire login) et qui
fonctionne bien :

ini_set('session.gc_maxlifetime',600);
ini_set('session.gc_probability',1);
ini_set('session.gc_divisor',1);
session_start();
$_SESSION['nom'] = $row->nom;
$_SESSION['prenom'] = $row->prenom;


D'où vient $row ?

session_write_close();
@odbc_free_result($sql_result);
@odbc_close($connection);
header('Location: menu.php');


Beurk. Cf. plus haut l'histoire du livreur de machine à laver.
Au passage, le contenu d'un champ Location doit être une URL
*complète* « http://www.example.com/chemin_complet/menu.php »
et pas juste « menu.php ».

Exit;


Avec un E majuscule ?

Voici celui utilisé dans le fichier menu.php :

session_start();
if(isset($_SESSION['nom']) && (!empty($_SESSION['nom'])))
{
echo "Bonjour ".$_SESSION['prenom']." ".$_SESSION['nom'];
}
else
{
header('Location: index.php');


Mêmes remarques.

Exit;


Même remarque.

}

Que dois-je faire pour qu'une fois l'authentification réussie
(index.php), je suis sur à 100% de rester sur menu.php, bref que ma
session soit bien créee.


Le seul moyen d'être sûr à 100 % de rester sur menu.php, c'est de ne pas
en partir avec des allers-retours inutiles « serveur->client->serveur ».
Donc, pas de header('Location: ...'), uniquement des require().

Cordialement,
--
Olivier Miakinen

Avatar
Philippe Le Van
Nous développons une appli. en PHP 5 pour un de nos clients.
Le souci rencontré, est que la validation du login+password fonctionne
mais une fois redirigé vers menu.php, ce dernier redirige à nouveau
vers index.php.
[...]


Bonjour,

ça m'intriguait ton histoire, j'ai testé le code quasiment tel quel (mon
code complet en bas du message) et chez moi ça marche nickel (testé
5 ou 6 fois...)

j'ai peur qu'il faille chercher ton problème ailleurs que dans le bout de
code que tu nous as envoyé...

Cordialement
Philippe Le Van

----- index.php ---
<?php
if (count($_POST) > 0) {
ini_set('session.gc_maxlifetime',600);
ini_set('session.gc_probability',1);
ini_set('session.gc_divisor',1);
session_start();
$_SESSION['nom'] = $_POST["nom"];
$_SESSION['prenom'] = $_POST["prenom"];
session_write_close();
@odbc_free_result($sql_result);
@odbc_close($connection);
header('Location: menu.php');
Exit;
}
?>
<form action="<?php echo $_SERVER["REQUEST_URI"]; ?>" method="post">
nom:<input name="nom"><br>
prénom:<input name="prenom"><br>
<input type="submit" value="ok">
</form>
----- menu.php -----
<?php
session_start();
if(isset($_SESSION['nom']) && (!empty($_SESSION['nom'])))
{
echo "Bonjour ".$_SESSION['prenom']." ".$_SESSION['nom']."<br>";
}
else
{
header('Location: index.php');
Exit;
}
?>
Je suis dans menu

----- mes headers pendant l'opération ------
(je les ai un peu écrèmés pour qu'ils soient plus lisibles...)
+++GET 2369+++
GET /Tutoriaux/test/ HTTP/1.1
Host: localhost
Cookie: PHPSESSIDb0181c5bb0939156a4389cb896a1e8d

+++RESP 2369+++
HTTP/1.1 200 OK
Date: Fri, 28 Jul 2006 10:03:04 GMT
+++CLOSE 2369+++

+++GET 2370+++
POST /Tutoriaux/test/ HTTP/1.1
Host: localhost
Referer: http://localhost/Tutoriaux/test/
Cookie: PHPSESSIDb0181c5bb0939156a4389cb896a1e8d
Content-Type: application/x-www-form-urlencoded
Content-Length: 22
Connection: keep-alive
Posting 22 bytes...

+++RESP 2370+++
HTTP/1.1 302 Found
Date: Fri, 28 Jul 2006 10:03:18 GMT
Server: Apache/2.0.58 (Win32) PHP/5.1.4
X-Powered-By: PHP/5.1.4
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: menu.php
Content-Length: 0
Content-Type: text/html; charset=ISO-8859-1
+++CLOSE 2370+++

+++GET 2371+++
GET /Tutoriaux/test/menu.php HTTP/1.1
Host: localhost
Referer: http://localhost/Tutoriaux/test/
Cookie: PHPSESSIDb0181c5bb0939156a4389cb896a1e8d

+++RESP 2371+++
HTTP/1.1 200 OK
Date: Fri, 28 Jul 2006 10:03:18 GMT
+++CLOSE 2371+++

Avatar
David JOURAND
Bonjour,

ça m'intriguait ton histoire, j'ai testé le code quasiment tel quel (mon
code complet en bas du message) et chez moi ça marche nickel (testé
5 ou 6 fois...)

j'ai peur qu'il faille chercher ton problème ailleurs que dans le bout de
code que tu nous as envoyé...


Le support des cookies par le client ?

--
David Jourand

Avatar
Arnaud
Nous développons une appli. en PHP 5 pour un de nos clients.
Le souci rencontré, est que la validation du login+password fonctionne
mais une fois redirigé vers menu.php, ce dernier redirige à nouveau
vers index.php.
[...]



Bonjour,

ça m'intriguait ton histoire, j'ai testé le code quasiment tel quel (mon
code complet en bas du message) et chez moi ça marche nickel (testé
5 ou 6 fois...)

j'ai peur qu'il faille chercher ton problème ailleurs que dans le bout de
code que tu nous as envoyé...


Merci pour la pertinence de ta remarque. J'ai plutot fait comme indiqué
dans le thread, à savoir un require. C'est il est vrai plus pratique que
d'utiliser un "Location".

Arnaud


Avatar
Arnaud
Bonjour,
Le support des cookies par le client ?



En vigueur sur mon poste de test.

Arnaud.

Avatar
Eric

Bonjour,

ça m'intriguait ton histoire, j'ai testé le code quasiment tel quel (mon
code complet en bas du message) et chez moi ça marche nickel (testé
5 ou 6 fois...)


Ca nous est arrivé sur un poste de test dans un de nos
dévellopements, qui tournait sur EasyPHP (donc sous Windows), le
propriétaire de l'ordi n'avait rien trouvé de mieux que de supprimer
des DLL qu'il jugeait inutile...
On a lui réinstallé EasyPHP, et ça marchait (c'était sous PHP4,
mais il ne doit pas y avoir de différence notable avec PHP5 de se
coté là.)

Autre problème possible, l'impossibilité de créer le fichier de
session.

Avatar
motton75
Eric wrote:

Autre problème possible, l'impossibilité de créer le fichier de
session.


Vecu : si l'hebergeur est Free.fr, par exemple, il faut juste creer le
repertoire session (ou sessions avec un s je ne sais plus) a la racine
pour pouvoir utiliser les sessions.

Vecu encore : il faut proteger ce repertoire (interdire le listage)
avec le .htaccess (sinon, n'importe qui peut recuperer les variables de
session de n'importe qui, et donc plein d'infos confidentielles !)

Avatar
Steuf

Vecu : si l'hebergeur est Free.fr, par exemple, il faut juste creer le
repertoire session (ou sessions avec un s je ne sais plus) a la racine
pour pouvoir utiliser les sessions.


Chez Free session_start vous insulte si le répertoire existe pas.


Vecu encore : il faut proteger ce repertoire (interdire le listage)
avec le .htaccess (sinon, n'importe qui peut recuperer les variables de
session de n'importe qui, et donc plein d'infos confidentielles !)


Normalement c'est protégé par défaut chez free, mais deux précaution
valent mieux qu'une ;)

Exemple : http://extantpc.free.fr/sessions

--

Steuf,
Site dédié au développement WEB : http://www.exinsidephp.com

Avatar
Thief13
Bonjour, Le support des cookies par le client ?



En vigueur sur mon poste de test.

Arnaud.


Y a t il un ob_start sur une des page où la session s'initialise ? ça
pourrait être la cause du problème !