[php/ mysql] Authentification: pb de session

voila par exemple la page du futur compte admin:


<?php
 session_start(); 
  if(isset($_SESSION['login'])) 
  { 
     echo 'Vous êtes logguer!<br>'; 
     echo 'Login : '.$_SESSION['login'].'<br>'; 
	 echo 'Vous etes l\'administrateur de la base';
 	 echo '<a href="ajout.php">ajout utilisateur[/url]';
	 echo '<a href="suppression.php">ajout utilisateur[/url]';
	 echo '<a href="editer.php">Editer les fichiers des utilisateurs[/url]';
	 echo '<a href="modifier.php">Modifier les utilisateurs[/url]';
	 echo '<a href="creer.php">Creer un fichier pour utilisateur[/url]';
   }
	else
	{ 
     echo 'Vous n\'êtes pas logguer<br>'; 
     echo 'Vous pouvez vous logguer ici <a href="extranet.php">Login[/url]'; 
     } 


	echo '<br>';
// on affiche un lien pour terminer une session
print '<a href="logout.php">Se deconnecter[/url]<br>';
?>

puis une des pages, par ex ajout.php:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Ajout utilisateur</title>
</head>

<body>
<form name="form3" method="post" action="">
<table><tr><td>Ajouter un utilisateur:</td></tr>
<tr><td>Login:</td><td> <input name="login" type="text" maxlength="200"></td></tr>
<tr><td>Mot de passe:</td> <td> <input name="mdp" type="text" maxlength="15"></td></tr>
<tr><td>Lien:</td><td><input name="lien" type="text" maxlength="15"></td></tr>
<tr><td><input type="submit" name="Submit" value="Ajouter"></td></tr></table>	        
</form>

<?
 session_start(); 
//requete insertion
 if(isset($_POST['login'])){ $login = $_POST['login'];} 
 if(isset($_POST['mdp'])){ $mdp = $_POST['mdp'];} 
 if(isset($_POST['lien'])){ $lien = $_POST['lien'];} 
			  
    $db = mysql_connect('localhost', 'root', '');
    mysql_select_db('extranet',$db); 
if((isset($login))&&(isset($mdp))&&(isset($lien)))
	{
	// on regarde si le nom existe déjà 
    $sql = "SELECT Login FROM extranet WHERE Login='$login'"; 
    $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());  
     
    // on compte le nombre de résultat 
    $res = mysql_numrows($req); 

    if($res!=0)  // le nom existe déjà, on affiche un message d'erreur 
        { 
        echo '<font color="red">Désolé, mais ce nom d\'utilisateur existe déjà dans notre base.</font>'; 
        } 
    else  // Le nom n'existe pas, on insère les informations du formulaire dans la table 
        {    
		$sql4 = "INSERT INTO extranet VALUES('$login','$mdp','$lien')";
		mysql_query($sql4) or die('Erreur SQL !'.$sql6.'<br>'.mysql_error());  ;
		echo 'L\'utilisateur est ajouté.';
		} 
	}
	mysql_close();
	
	echo '<br>';
// on affiche un lien pour terminer une session
print '<a href="logout.php">Se deconnecter[/url]<br>';

?>

</body>
</html>

cette page ajout.php n a pas de fonction, ms une autre en a une par contre…

j ai rajoute le session_start() ms je sais pas si ca suffit…

ca suffit pas?

Ce message n’était pas conforme aux règles d’utilisation du nouveau forum :

personne?

Le suis suis dsl , mais j’ai une de ses flaime pour lire tous le code , et je comprent pas bien ce qui marche pas …

ben pour une fois, tout marche…
par contre comme j expliquais , je cree un compte admin qui aura acces a certaines pages du site (ajout utilisateur etc…)

c pour ca , je sais pas si je mets un session_start en debut de page, ca suffira a limiter l acces de ces pages a l adiministrateur

heu je suis pas clair?

Je vois pas en quoi le session_start(), peut limiter des page …

ben je sais pas…j essai…
ms apres test effectivement ca limite rien du tout

faut il faire un test avec l id de la session?

aussi j ai remarque que des qu on quitte la page d accueil de lutilisateur (en clair c la page qui son authentification), il se deloggue automatiquement

genre l admin qui a plusieurs operations a faire , il doit aller sur la page page , par ex ajouter un utlisateur ,puis se relogguer pour venir sur la 2eme page, par ex une supression d un utilisateur…

comment eviter ca?
je presume qu il faut integrer quelque part l’ID de la session ds les autres pages non?

Tu fait un champ ‘admin’ dans ta table de membres.
Tu met 1 quand le met est admin , et 0 quand il les pas .
Tu fait un session_start(); sur toutes tes pages.
Dans la page de loggin , tu verifi si le champ ‘admin’ est a 1 ou 0,
si il est a 1, tu fait :
[cpp]
if($data[‘admin’] == 1 )
{
$_SESSION[‘admin’] = 1;
}
[/cpp]
et donc a chaque page qui est restrin aux admin tu fait :
[cpp]
if(!isset($_SESSION[‘admin’]))
{
echo ‘Vous n’ete pas admin
Vous n’avez pas acces a cette page’;
exit;
}
// Ta Page …
[/cpp]

super Pyro tout marche bien merci bien

derniere question (normalement jusqu a la prochaine :)):
comment on fait pour faire un header(“Location”) avec une tempo?

Je pense pas que l’on puisse , utilise le Javascript :

[cpp]

########################################################

$url : URL de redirction.

$tps : Temps en milliseconde avant la redirection.

$msg : Message a afficher lors de la redirection.

########################################################

function redirection($url,$tps,$msg)
{
echo’

';

echo $msg.’
’;
echo ‘Redirection dans : ‘.($tps/1000).’ Secondes
’;
echo ‘Si vous n’ete pas rediriger clique ici[/url].’;
}
[/cpp]

Biensur faire un exit apres la fonction si c’est pour rediriger une personne qui n’est pas admin , sinon elle peut dactiver le Java et ca passera …

eh ben merci bien!!!

tout marche impecc

pour l instant plus de pb particulier :slight_smile:

merci encore

2r1, c’est toujours un plaisir :smiley:

Dsl , erreur de manip , je suis pas sur mon pC … . .

[cpp]<?php
$colname_Recordset1 = “1”;
if (isset($_SESSION[‘login’])) {
$colname_Recordset1 = (get_magic_quotes_gpc()) ? $_SESSION[‘login’] : addslashes($_SESSION[‘login’]);
}
mysql_select_db($database_togolibre, $togolibre);
$query_Recordset1 = sprintf(“SELECT * FROM users WHERE login = ‘%s’”, $colname_Recordset1);
$Recordset1 = mysql_query($query_Recordset1, $togolibre) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
?>

<? // pensez a ouvrir une connexion vers mysql ici // voir les exercices dans le menu de droite pour cela. if(isset($_POST) && !empty($_POST['login']) && !empty($_POST['pass'])) { extract($_POST); // on recupère le password de la table qui correspond au login du visiteur $sql = "select pwd, admin, pseudo from users where login='".$login."'"; $req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error()); $data = mysql_fetch_assoc($req); if($data['pwd'] != $pass) { echo '
Mauvais login / password. Merci de recommencer
'; include('login_membres.php'); // On inclus le formulaire d'identification exit; } else { session_start(); header("Cache-control: private, no-cache"); header("Expires: Mon, 25 Feb 2002 01:00:00 GMT"); header("Pragma: no-cache"); $_SESSION['login'] = $login; $_SESSION['pseudo'] = $pseudo; $_SESSION['admin'] = $admin; // On inclut le formulaire d'identification // ici vous pouvez afficher un lien pour renvoyer // vers la page d'accueil de votre espace membres if($data['admin'] == 1) { echo '
Loguéadmin
'; include('admin.php'); // On inclus le formulaire d'identification exit; } if($data['admin'] == 2) { echo '
Loguémembre
'; include('membre.php'); // On inclus le formulaire d'identification exit; } } } else { echo '
Vous avez oublié de remplir un champ.
'; include('login_membres.php'); // On inclut le formulaire d'identification exit; } ?> <?php mysql_free_result($Recordset1); ?>[/cpp]

et sur ma page à proteger membre (admin=2) j’ai mis:

[cpp]<?php
session_start();
/*
si la variable de session login n’existe pas cela siginifie que le visiteur
n’a pas de session ouverte, il n’est donc pas logué ni autorisé à
acceder à l’espace membres
*/
if(!isset($_SESSION[‘admin’])== 2) {
echo ‘

Vous n’êtes pas autorisé à acceder à cette zone
’;
include(‘login_membres.php’);
exit;
}
?>[/cpp]

sur ma page admin (admin=1) j’ai:

[cpp]<?php
session_start();
/*
si la variable de session login n’existe pas cela siginifie que le visiteur
n’a pas de session ouverte, il n’est donc pas logué ni autorisé à
acceder à l’espace membres
*/
if(!isset($_SESSION[‘admin’]== 1)) {
echo ‘

Vous n’ete pas admin
Vous n’avez pas acces a cette page
’;
include(‘login_membres.php’);
exit;
}
?>[/cpp]

le but étant de créer des niveau d’acces 1 / 2 / 3 etc …

Qui peut m’aider!
J’en peux plus :sweat:

si tu veux proteger toute une page met la dans un repertoire different et colle y un .htaccess…

l’utilisation d’un mecanisme de session ne se justifie vraiment que si tu veux gerer des droits tres variables…

du style lui peux acceder au modif mais lui peu que voir les infos etc… (typique du forum par ex)

t sur que t’as vraiment besoin de niveau d’acces dans la meme page peut pas y avoir plusieurs page differentes ?

Hola comme tu repond vite je my attendez pas ^^
Ben en fait oui les sessions c essentiel le HTaccess nest pas assez souple pour mon projet en terme de creation ou diffusion de pass et surtout de simplicité d’administration ( c un portail avec fort contenu en article)

bon alors je te fais rapido une explication sur la protection de page :

le session_start tu le met systematiquement

je te conseille d’utiliser des petit fichiers .php qui contiennent le code de sécurité que tu met dans un repertoire inc (proteger par .htaccces deny from all)
et tu les include()

laisse tomber les header() machin…

en gros tu fais un select du style

select * from compte where login = ‘".mysql_real_escape_string($_POST[‘login’])."’ and binary password = ‘".mysql_real_escape_string($_POST[‘password’])."’

si ça retourne queleques chose tu fais $_SESSION[‘compte’]=$compte;
sinon tu fait unset($_SESSION[‘compte’]);

ensuite suffit de tester isset($_SESSION[‘compte’]) pour savoir si quelqu un est logé et de testé $_SESSION[‘compte’][‘typecompte’] pour connaitre le type de compte… par ex

[cpp]# <?

// pensez a ouvrir une connexion vers mysql ici

// voir les exercices dans le menu de droite pour cela.

if(isset($_POST) && !empty($_POST[‘login’]) && !empty($_POST[‘pass’])) {

extract($_POST);

// on recupère le password de la table qui correspond au login du visiteur

$sql = “select * from users where login=’”.mysql_real_escape_string($_POST[‘login’] and binary password = ‘".mysql_real_escape_string($_POST[‘pass’])."’";

$req = mysql_query($sql) or die(‘Erreur SQL !
’.$sql.’
’.mysql_error());

$data = mysql_fetch_assoc($req);

if($data[‘pwd’] != $pass) {

echo ‘
Mauvais login / password. Merci de recommencer
’;

include(‘login_membres.php’);

exit;

}

else {

session_start();

$_SESSION[‘login’] = $login;

$_SESSION[‘pseudo’] = $pseudo;

$_SESSION[‘admin’] = $admin;

if($data[‘admin’] == 1) {

echo ‘
Loguéadmin
’;

include(‘admin.php’);

exit;

}

if($data[‘admin’] == 2) {

echo ‘
Loguémembre
’;

include(‘membre.php’);

exit;

}

}

}

else {

echo ‘
Vous avez oublié de remplir un champ.
’;

include(‘login_membres.php’);

exit;

}

?>[/cpp]

ça donnerai ça ?