problème variables de cession

Eléphant du PHP | 94 Messages

22 juin 2010, 15:43

Bonjour,

Voilà, pour un domaine réservé, j'appelle une page index.php dans laquelle je demande le nom d'utilisateur et le mot de passe.

Ce formulaire appelle ensuite par "action" une page verif.php qui teste si le nom d'utilisateur et le mot de passe sont bons dans ma base de données. Les deux variables ont été passées par un POST.

Si le résultat est négatif, je retourne à ma première page.

Si le résultat est positif,
j'initialise la cession, et crée des variables $_SESSION contenant entre autres, l'id, le nom d'utilisateur, etc...
Enfin, j'inclus (require_once) une page "menu.php" qui contient les options de menu (pas encore implémentées).

Ma page menu.php commence par un "require_once" qui appelle une page "controle.php" qui contrôle que la cession est bonne dans le cas où l'on appelle directement cette page.

C'est au niveau de mon fichier "controle.php", que ce révèle un problème.
Dans celui-ci, pour l'instant, je n'ai que des tests d'existence des variable $_SESSION que j'ai créé précédemment.

Quand j'arrive sur cette page menu.php, pas de problème; la vérification de la cession est bonne.

Par contre, si j'appelle dans le lien de menu la page paye.php (la seule que j'ai commencée à implémenter), et qui commence par un appel à controle.php, le test échoue; les variables de cession ne sont pas trouvées.

Mon cookie de cession, j'ai vérifié est bien présent.

Par contre, si je relance ma page de demande de nom et mot de passe SANS EFFACER LE COOKIE, et que je refais le trajet, ce coup-ci, ça marche !

Là, j'ai vraiment du mal à comprendre.

Ma page index.php simplifiée, mais très simple :
<html>
<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8">
	<title>BIENVENUE</title>

	<link rel="StyleSheet" type="text/css" href="graphisme/style.css">
</head>

<body>
	<h1>
		SAISIE MOT DE PASSE
	</h1>

	<div class="commentaire">
		Votre mot de passe est personnel, ainsi que votre nom d'identifiant.<br />
		ils ne doivent jamais être communiqué à quiconque<br />
		<br />
		Si vous désirez le changer, contactez-moi. <br />
	</div>
	<br />
	<br />
	<br />
	<br />
	<form method="post" action="verif.php" accept-charset="UTF-8">
		<div class="centrer">
			<h3>ENTREZ VOTRE IDENTIFIANT DE CONNEXION</h3>
			<input name="nom" type="text" size=25 maxlength=25 value =""/>
			<br />
			<br />
			<br />
			<br />
			<h3>ENTREZ VOTRE MOT DE PASSE</h3>
			<input name="saisie" type="password" size=25 maxlegth=25 />
			<br />
			<br />
			<br />
			<br />
			<button type="submit">
				<img src="graphisme/confirmation.gif" alt="ENVOYER">
			</button>
		</div>
	</form>
<body>
</html>
Ma page verif.php :
require_once("graphisme/appel/f_verif.php"); //contient la fonction de vérification dans la bdd et de message d'erreur
//verification identifiant et cle
	if (!isset($_POST["nom"]) || strlen($_POST["nom"]) < 5 || strlen($_POST["nom"]) > 25)
		erreur(1);
	$teste=nettoyage(0, $_POST["nom"]);
	if (strcmp($teste, $_POST["nom"]))
		erreur(2); //cas où des caractères interdits ont été tentés de passer
	
	if (!isset($_POST["saisie"]) || strlen($_POST["saisie"]) < 5 || strlen($_POST["saisie"]) > 25)
		erreur(1);
	$teste=nettoyage(0,$_POST["saisie"]);
	if (strcmp($teste, $_POST["saisie"]))
		erreur(2);
		
	if (!verif_ident($_POST["nom"], $_POST["saisie"])) 
		erreur(1); //fonction présente dans f_verif.php

	//Identification correcte
	session_set_cookie_params(5400,"/","", true);
	$test_session = session_start();
	if (!$test_session) erreur(2); //fin pour cause d'erreur session
	$_SESSION["ident"] = $_POST["nom"];
	$_SESSION["niveau"] = 1; // a modifier ultérieurement pour faire varier les droits
	$_SESSION["ip"] = $_SERVER["REMOTE_ADDR"];
	$_SESSION["motpasse"] = $_POST["saisie"];
	unset ($_POST["nom"], $_POST["saisie"], $identite, $suite);
	$_SESSION["idauto"] = session_id();
	
	require_once ("menu.php"); // j'insere ma page suivante
?>
Ma page menu.php (également très simple et qui fonctionne) :
<?php
	require_once("graphisme/appel/controle.php");
?>
<html>
<head>
<link rel="StyleSheet" type="text/css" href="graphisme/style.css">
<title>Menu</title>
</head>
<body>
	<h1>MENU</h1>
	<div class=elt_menu>
		<h3>Fiches de paye</h3>
		<a href="paye.php?origine=1&option=1">
			Nouvelle fiche de paye<br /><br />
		</a>
		<a href="paye.php?origine=1&option=2">
			Consultation des fiches de paye
		</a>
		<h3>Contrats de travail</h3>
		<a href="contrat.php?origine=1&option=1">
			Nouveau contrat de travail<br /><br />
		</a>
		<a href="contrat.php?origine=1&option=2">
			Consultation des contrats de travail
		</a>
		<h3>Employés</h3>
		<a href="employe.php?origine=1&option=1">
			Saisie d'un nouvel employé<br /><br />
		</a>
		<a href="employe.php?origine=1&option=2">
			Consultation du fichier des employés
		</a>
	</div>

</body>
</html>
Ma page paye.php (qui est à peine commencée) :
<?php
	session_start();
	require_once("graphisme/appel/entete.php");
	require_once("graphisme/appel/controle.php");
/?>
Et enfin ma page controle.php, elle aussi très simple et que j'ai limité pour tenter de cerner le problème :
<?php
/************************
 * Contrôles d'identite *
 ************************/
	if (!isset($_SESSION["ident"]) || !isset($_SESSION["niveau"]) || !isset($_SESSION["ip"]))
		echo ("Zut1"); 
	if (!isset($_SESSION["motpasse"]) || !isset($_SESSION["idauto"]))
		echo ("Zut22");
	if (strcmp($_SESSION["ip"], $_SERVER["REMOTE_ADDR"])) //ip changée entre les deux pages !
		echo ("Zut3"); 
	if (strcmp($_SESSION["idauto"], session_id())) // mauvaise id session
		echo ("Zut5 : ".session_id()); 
	  	
	?>
EDIT : Désolé pour la longueur.

Eléphant du PHP | 94 Messages

22 juin 2010, 17:39

J'avance dans l'incompréhension !

Je m'explique :

J'ai tenté dans mon fichier verif.php de mettre un session_start en début de page; c'est à dire que je me retrouve avec deux session-start dans cette page en différents endroits, alors là, tout marche !

ViPHP
ViPHP | 1996 Messages

22 juin 2010, 20:56

Tu as bien marqué session_start() ? (et pas session-start)
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 94 Messages

22 juin 2010, 23:18

Non, non, c'est bien session_start(), tel qui est écrit dans le bout de code que j'ai mis de verif.php; c'est du copier - coller.

Maintenant, avec ces deux session_start(), ça fonctionne bien, mais je trouve ça bizarre quan même...

ViPHP
ViPHP | 1996 Messages

23 juin 2010, 09:51

Je viens de lire ton fichier verif.php et j'ai vu cela :
$test_session = session_start();
session_start(); est une pseudo fonction i.e. qui doit s'écrire session_start(); toute seule comme une grande. Elle ne retourne rien hormis qu'elle informe PHP que la page utilise les sessions. Donc ta variable $test_session sera NULL. si tu veux tester les sessions écris plutôt :
<?php
session_start(); // toute seul en début de page même si tu pourrait le mettre n'importe où mais toute seule
if (isset($_SESSION))
{
  //test OK
}
else
{
  // TEST PAS OK
}
?>
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Eléphant du PHP | 94 Messages

24 juin 2010, 14:13

Bonjour,

Merci Aureusms; j'ai fait la modification. c'est un truc que j'avais lu je ne sais plus dans quels tutoriels...

Par contre, de nouveau, ça ne fonctionne plus !

Depuis ce matin, lorsque je me connecte pour la première fois, la seconde page ne trouve pas les variables d'identifications, et la deuxième fois, oui (si je n'ai pas effacé le cookie entre temps).

Je n'ai strictement rien changé sur cette page entre hier et aujourd'hui !

C'est un problème qui me bloque depuis maintenant 3 jours; alors si vous avez une idée, je suis preneur.

Merci

Michel

ViPHP
ViPHP | 5462 Messages

24 juin 2010, 14:16

Hello, pendant tes tests met toi en erreur E_ALL | E_STRICT
il te reste de la place sur ton serveur ? ça met déjà arrivée de ne plus avoir de place et les fichier de session ne pouvais pas s'écrire, regarde aussi du coté de
session.gc_probability et session.gc_divisor (tout ca dans ton php.ini)

Eléphant du PHP | 94 Messages

24 juin 2010, 14:32

Hello, pendant tes tests met toi en erreur E_ALL | E_STRICT
il te reste de la place sur ton serveur ? ça met déjà arrivée de ne plus avoir de place et les fichier de session ne pouvais pas s'écrire, regarde aussi du coté de
session.gc_probability et session.gc_divisor (tout ca dans ton php.ini)
E_ALL|E_STRICT, c'est quelle variable ?

Pour la place, pas de problème. C'est mon serveur local, et il n'y a que ça pour l'instant.

Sinon, il y a encore du "nouveau".

Comme je l'ai dit précédemment, ce qui fonctionnait (sans que je comprenne trop pourquoi) ne fonctionnait plus tout à l'heure.

Du coup, j'ai mis dans mon fichier verif.php un "echo" pour savoir si je passait bien par là. Je sauvegarde, je re-tente :

Ca fonctionne de nouveau !

J'ai enlevé mon "echo", et ça fonctionne toujours.
Ça a l'air complètement aléatoire.
Bref, je comprend de moins en moins.

Et comment tester une erreur qui n'arrive plus ? ...

ViPHP
ViPHP | 5462 Messages

24 juin 2010, 14:36

E_ALL | E_STRICT c'est pour error_reporting

fais un petit
var_dump(ini_get('error_reporting'), ini_get('session.gc_probability'), ini_get('session.gc_divisor'));
:wink:

Eléphant du PHP | 94 Messages

24 juin 2010, 14:47

Réponse : 6135, 0 pour session.gc_probably et 100 pour session.gc_division.

ViPHP
ViPHP | 5462 Messages

24 juin 2010, 14:53

Réponse : 6135, 0 pour session.gc_probably et 100 pour session.gc_division.

ton session.gc_probably devrai au moins être a 1, sinon il supprime pas les sessions ca peu créer des confis :wink:

Eléphant du PHP | 94 Messages

24 juin 2010, 15:00

Je vais voir ça, merci.

Mais elle correspond à quoi cette valeur ?

ViPHP
ViPHP | 5462 Messages

24 juin 2010, 15:02

Je vais voir ça, merci.

Mais elle correspond à quoi cette valeur ?
http://fr.php.net/manual/fr/session.con ... robability

:wink:

c'est la chance de supprimer les sessions périmées

Eléphant du PHP | 94 Messages

24 juin 2010, 15:10

Merci.

Par contre, je vois que la valeur par défaut est normalement à 1; et la mienne était à 0, alors que je n'y ais pas touché.

Je suis sous ubuntu, peut-être cela vient-il d'eux ? !

En tous cas, merci, et je re-viendrais appeler à l'aide si ça recommence.

Michel

ViPHP
ViPHP | 5462 Messages

24 juin 2010, 15:14

Merci.

Par contre, je vois que la valeur par défaut est normalement à 1; et la mienne était à 0, alors que je n'y ais pas touché.

Je suis sous ubuntu, peut-être cela vient-il d'eux ? !

En tous cas, merci, et je re-viendrais appeler à l'aide si ça recommence.

Michel
c'est possible, moi avec un install standard de la 5.3 mon session.gc_divisor est à 1000 alors que la valeur par défaut c'est 100