Session

Eléphant du PHP | 440 Messages

23 juil. 2009, 09:33

Bonjour,

sur une page de connexion, je voudrais éviter que le visiteur entre son login et son mot de passe toutes les 5 minutes, s'il quitte et revient et requitte cette page. Bref, qu'une fois connecté, il soit reconnu pour au moins 30 à 60 minutes.

Je sais que la page doit commencer par ce code :
<?php
	session_start();
?>
Après je ne comprends plus rien aux tutos. Il faut, apparemment, créer une variable. Sûrement même si je veux afficher le pseudo du visiteur et lui dire bonjour par exemple. Mais je ne comprends pas comment.

Autre question, faut-il un répertoire "session" ? Et si oui, où ?

Merci pour votre aide.
Débutant complet en php/mysql. Merci pour votre aide.

Eléphant du PHP | 111 Messages

23 juil. 2009, 10:07

C'est pas très compliqué les sessions, quel que soit le langage :

Sur le serveur, il y a un répertoire qui contient un fichier par utilisateur connecté. Ce fichier porte un numéro "confidentiel".

Sur le pc client, il y a un cookie de session : un petit fichier qui contient le numéro de session à échanger avec le serveur. C'est le lien entre le serveur et le client.

Donc, quand tu utilises des variables de session, tu peux automatiquement les utiliser dans toutes les pages que tu as crées, tant qu'elles commencent par : session_start();

pour créer des variables de session en php, il te suffit de faire :
// exemple
$_SESSION['username'] = 'root';
Si ça sort d'un formulaire :
// nom_utilisateur = nom du champ de formulaire
$_SESSION['username'] = $_POST['nom_utilisateur'];
Il faut faire pareil avec le mot de passe, bien vérifier qu'il correspond au nom d'utilisateur, puis, par exemple, créer une dernière variable de session si l'authentification s'est correctement déroulée :
// seulement si l'authentification est ok
$_SESSION['auth_ok'] = 1;
Pour augmenter la durée de vie des sessions, c'est dans le php.ini :
session_max_lifetime
ou un truc dans ce goût là.

Eléphant du PHP | 440 Messages

23 juil. 2009, 15:44

c'est pas très compliqué !! :oops:

Donc le session_start, je peux le mettre par défaut sur toutes les pages ? Dans le doute ...

Les valeurs (login et mdp) viennent d'une base mysql. Je fais comment pour les récupérer ?
Débutant complet en php/mysql. Merci pour votre aide.

Eléphant du PHP | 111 Messages

23 juil. 2009, 16:22

L'utilisateur qui s'authentifie t'envoie un login et un mot de passe par formulaire.

Tu les récupères avec $_POST

Tu dois comparer ces valeurs avec celles qui existent dans la base de données, dans ta table "users", par exemple.

Pour récupérer ces valeurs, tu le fais avec une requête :

$query = "SELECT * FROM USERS WHERE login = ' " .$_POST['username'] . "' AND mdp = blablabla";

Apprends au passage à bien utiliser les protections sur ce genre de requête (mysql_real_escape_string je crois).

Fais bien attention à penser ta page, avant de la coder . Tu t'en sortiras beaucoup mieux.
Moi j'ai tendance à dessiner les fonctionnalités que je veux sur une page web, c'est généralement beaucoup plus parlant que des lignes de code.

voili voilou ^^

ViPHP
ViPHP | 2291 Messages

23 juil. 2009, 16:48

Salut,

En gros le principe est le suivant :
:arrow: 1- Un formulaire qui récupère les données de connexion.
:arrow: 2- Une requête qui vérifie que le login et pass exist dans ta base.
:arrow: 3- Si ok tu crée tes variables de SESSION.

Et comme je suis de bonne humeur voici un exemple :wink:
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="fr-be" http-equiv="Content-Language" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Connexion</title>
</head>

<body>
<?php
$action_form = (isSet($_GET['action_form'])) ? $_GET['action_form'] : '' ;
switch ($action_form)
  {
	  case 'VERIF_LOGIN':
		         //--> Définition des paramètres de connexion à la base de données.//

				$db_host  = 'localhost';        //-->Serveur sur lequel se trouve le serveur de base de données.//
				$db_login = '';                 //-->Login de connexion à la base de données.//
				$db_pass  = '';                 //-->Passeword de connexion à la base de données.//
				$db_base  = '';                 //-->Base de données.//

			    //--> Fin des paramètres de connexion à la base de données.//


			    //-->Connexion à la base de données.//

			    $sql_db = mysql_connect($db_host, $db_login, $db_pass) or die("<font color='#0000A0'>Erreur MySQL :<br />" . $sql_db .
			    "<br />" . "Impossible d'établir une connexion avec le serveur MySQL</font>");

			    mysql_select_db($db_base) or die("<font color='#0000A0'>Erreur MySQL :<br />" . $db_base . "<br />" .
			    "Impossible d'établir une connexion avec la base " . $db_base . "</font>");

			    //-->Fin de la requête de connexion à la base de données.//

			    $message = (empty($_POST['login'])) ? 'Merci d\'indiquer votre login svp !<br>' : '';
			    $message .= (empty($_POST['pass'])) ? 'Merci d\'indiquer votre mot de passe svp !<br>' : '';
			    echo $message;

			    //-->Récupération des données du formaulaire.--//

			    $login = mysql_real_escape_string($_POST['login']);
			    $pass = mysql_real_escape_string($_POST['pass']);


			    //-->Requête SQL qui va vérifier que le couple existe.--//

			    $sql_verif = "SELECT login, password FROM users WHERE login = '".$login."' AND password = '".md5($pass)."'";
			    $resultat  = mysql_query($sql_verif) or die('Erreur SQL !'.$sql_verif.'<br>'.mysql_error());

			    $login_OK = mysql_num_rows($resultat);
			    $donnees_session= mysql_fetch_array($resultat);

			    //-->Si le couple existe, la connexion est ok.--//
			    if($login_OK == 1)
			     {

			     	echo 'Connexion OK';
			     	//--> Création des variable de session.--//
			     	$_SESSION['login'] = $donnees_session['login'];
			     	//--etc....//
			     	echo '<pre>';
                  print_r($_SESSION);
                  echo '</pre>';
		         }else
		         	{
		         		$NoConnect = ($message == '') ? 'Le couple n\'existe pas' : '' ;
		         		echo $NoConnect;
		         		//-->Redirection ou autre
		         	}



	    break;

	  default;

	  			echo '<form action="form.php?action_form=VERIF_LOGIN" method="post">
							<table style="width: 100%">
								<tbody>
								<tr>
									<td style="width: 108px">Login :</td>
									<td><input name="login" type="text" /></td>
								</tr>
								<tr>
									<td style="width: 108px">Password :</td>
									<td><input name="pass" type="password" /></td>
								</tr>
								<tr>
									<td style="width: 108px">&nbsp;</td>
									<td><input name="Submit1" type="submit" value="soumettre" /></td>
								</tr>
							</tbody>
							</table>
						</form>';

	    break;
 }
?>
</body>

</html>
J'ai fais ça en vitesse, donc c'est une piste essaye de comprendre le principe et ne pas simplement copier coller le code. :wink:
Modifié en dernier par dunbar le 23 juil. 2009, 18:41, modifié 1 fois.
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Eléphant du PHP | 245 Messages

23 juil. 2009, 16:48

session_start(), Cela veut dire que PHP va pouvoir créer puis utiliser les données de la session lés au cookie PHPSESSID lié au site visité.

Il faut la mettre obligatoirement la mettre sur les pages de connexion et de deconnexion.

Sur les autres pages du site, elle permet d'avoir accès aux données stockées. Elle n'est as obligatoire, mais si tu veux faire un script qui ecrit le nom de l'utilisateur sur toute les pages, là, cette fonction devient obligatoire.

On peut parametrer le php.ini pour que les sessions soient plus courtes ou plus longue avec la variable la directive session.gc_maxlifetime du php.ini .

mais leurs durée de vie n'exedera jamais la durée de vie de la session du navigateur.

Pour qu'elle soit plus longue et qu'on soit authentifié par défaut comme sur le site de phpfrance, il faut utiliser des cookies en plus.
Modifié en dernier par enneite le 23 juil. 2009, 16:53, modifié 1 fois.

ViPHP
ViPHP | 2291 Messages

23 juil. 2009, 16:51

En n'oubliant jamais que les cookies n'offre AUCUNE sécurité.
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Eléphant du PHP | 245 Messages

23 juil. 2009, 16:59

il ne faut jamais mettre d'informations confidentielles dans un cookie.

Par contre PHP quand il définit sa session , il cré une cookie dont le contenu est un message crypté qui correspond aux informations stockées sur le serveur.

C'est pour cela que lorsqu'on utilise des données sensibles, il ne faut pas que la durée de vie des sessions soit trop longue et il faut prevoir des script utilisant la fonction session_regenerate_id(); (pas partout car ça redemande des ressources, mais sur les pages de modifications importantes des données de sessions par exemple...)

Eléphant du PHP | 111 Messages

23 juil. 2009, 17:05

Par contre PHP quand il définit sa session , il cré une cookie dont le contenu est un message crypté qui correspond aux informations stockées sur le serveur.
PHP crée sur le serveur un fichier texte accessible uniquement par lui même, et envoie un identifiant de fichier au navigateur client.

Le navigateur client, lui, renvoie à chaque rafraîchissement l'identifiant de session, qui est la référence de fichier dans lequel PHP doit aller chercher les informations.

C'est pas obligé de regénérer l'id de session de l'utilisateur, ou alors il faut le faire sous certaines conditions.

On retrouve ce fonctionnement en J2EE et en C# de toute manière.

Eléphant du PHP | 440 Messages

23 juil. 2009, 18:54

merci pour toutes ces réponses.

Je pensais qu'en mettant
<?php
session_start();
?> 
sur la page de connexion et en se connectant, on pourrait quitter la page et y revenir sans avoir à se reconnecter.

Apparemment ça ne suffit pas !
Débutant complet en php/mysql. Merci pour votre aide.

Eléphant du PHP | 245 Messages

23 juil. 2009, 22:07

ah bah il faut les initialiser quand meme les variables de sessions
session_start();
function test_validite_authentification($login,$mot_de_passe)
{
//... on teste si l'utilisateur est bien inscrit
//...si le mot de passe correspond
//...

}
//ah oui y avait une parenthese! qui manquait! oups!
if(test_validite_authentification($_POST["login"],$_POST["mot_de_passe"])==true)
{
$_SESSION["login"]=$_POST["login"];
$_SESSION["est_authentifie"]="oui";

}
else
{
header("location:formulaire.php?auth=erreur");
}
après elles existerons pour toute a durée de la session du navigateur jusqu'à l'expiration définie dans l php.ini



session_start() sera utile dans tes autres fichiers si tu veux récupérer le login et l'état d'authentification de l'utilisateur de ton site qui navigue dessus, notamment pour faire des tests avant qu'il accede à son compte.
Modifié en dernier par enneite le 24 juil. 2009, 14:57, modifié 1 fois.

Eléphant du PHP | 440 Messages

24 juil. 2009, 09:53

ok je vais essayer ça, merci.

Mais le fichier php.ini (que je n'ai pas !!) doit contenir quoi ?
Débutant complet en php/mysql. Merci pour votre aide.

Eléphant du PHP | 111 Messages

24 juil. 2009, 10:14

Tu peux en faire abstraction pour le moment ...

Eléphant du PHP | 440 Messages

24 juil. 2009, 14:08

il y a un problème. Si je colle ça
<?php
session_start();
function test_validite_authentification($login,$mdp)
{
//... on teste si l'utilisateur est bien inscrit
//...si le mot de passe correspond
//...

}

if(test_validite_authentification($_POST["login"],$_POST["mdp"]==true)
{
$_SESSION["login"]=$_POST["login"];
$_SESSION["est_authentifie"]="oui";

}
else
{
header("location:formulaire.php?auth=erreur");
}
?>
en tête de ma page de connexion, la page ne s'ouvre : problème de syntaxe ligne 12.
Débutant complet en php/mysql. Merci pour votre aide.

ViPHP
ViPHP | 2291 Messages

24 juil. 2009, 14:17

Et le code que j’ai donner plus haut est pas bon :?:
Bin sinon dans ton cas il manque une parenthèse fermante.
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.