Acces page si login définit

Répondre
moogli
le 24/12/2004 à 01:21
moogli
arf je devrait penser a sa avant de taper de poster de 4km smiley

smiley
Il en faut peu pour être heureux !!!!!
phpzenoob
le 24/12/2004 à 23:16
phpzenoob
lut

voci mon code, mais ca ne marche toujours pas, sa dit bienvenue dans ta page perso alors que chu pas logez avec le pseudo webmaster.

index.php


<?php
//Vérification des champs pour la connection
//ensuite tu enregistres tes variables de session si les login et mdp sont Ok
session_start();
$_SESSION['login'] = $login;
$_SESSION['Webmaster'] = true;//si le membre est webmaster si non tu met false
//tu peut utiliser d'autre variable mais évite de mettre le mdp ...
//redirection vers l'espace membre
header('Location: administration.php');
?>


administration.php

<?php
session_start();
if ($login == 'phpzenoob') {
$_SESSION['webmaster'] == true;
echo 'z\'ete pas webmaster oust<br><a href="javascript:history.go;">page précédente</a>';
}
else {
$_SESSION['webmaster'] == false;
echo 'bienvenue dans ta page perso';
}
?>


j'ai relu les cours mais je voit pas comment faire
merci
moogli
le 25/12/2004 à 00:19
moogli
L'erreur vient de là
<?php
$_SESSION['Webmaster'] = true
?>


le true ou false depend de ton membre, donc d'un champ mysql ou du nom de toon memebre directement en dur dans le code

exemple
<?php
if ($login=='phpzenob')
{
$_SESSION['Webmaster'] = true;
}
else {
$_SESSION['Webmaster'] = false;
}
?>


c comme sa sa qu'il te faut placer ta variable de session !

smiley
Il en faut peu pour être heureux !!!!!
JuTs
le 26/12/2004 à 16:27
JuTs
Pour ce qui est des droits droit d'accès j'ai cette fonction

<?php
function VerifDroits($r_user, $r_page)
{
//calcul du décalage à appliquer sur la valeur binaire
$decalage = strlen(decbin($r_page))-1;

//décalge
$test_user = $r_user >> $decalage;
$test_page = $r_page >> $decalage;

//ET binaire
return $test_user & $test_page;
}
?>


Explications :

Les droits sont "stockés" dans une valeure binaire :

webmaster : 100 (4 en décimal)
membre : 010 (2 en décimal)
visiteur : 001 (1 en décimal)

Le premier bit (à droite) indique le droit d'accès aux page de catégorie visiteur (1:oui, 0:non), le deuxième aux pages des membres et le troisième celles du webmaster.

Le utilisateur sont stockés dans une base de donnée :

CREATE TABLE users (
login VARCHAR(100) NOT NULL,
pass CHAR(32) NOT NULL,
droits TINYINT UNSIGNED NOT NULL,
PRIMARY KEY(login)
);

le champ droit contient une valeur binaire (stockée en décimal) indiquant les droit de l'utilisateur.

exemples :

webmaster : 111 (7 en décimal)(un webmaster à un droit d'accès à toutes les pages)
membre :011 (3 en décimal)
visiteur : 001 (1 en décimal)

Exemples du fonctionnement de la fonction :

droits nécessaire pour accéder à la page : 10 (010)
droits de l'utilisateur : 011


//calcul du décalage à appliquer sur la valeur binaire
la longueur (2) - 1 = 1

décalage vers la droite

010 >> 1 = 001
011 >> 1 = 001

//ET binaire
001 & 001 = 1 --> la personne a les droits


exemple 2 :

droits nécessaire pour accéder à la page : 10 (010)
droits de l'utilisateur : 001

décalage vers la droite

010 >> 1 = 001
001 >> 1 = 000

//ET binaire
001 & 000 = 0 --> la personne n'a pas les droits

Remarque : les paramètres de la fonction sont passés en décimal.


Ensuite en haut de chaque page je place cette fonction
<?php
//$r_page : droits nécessaire pour accéder à la page (en décimal)
function SetSession($r_page)
{
session_start();

//si la variable contenant les droits n'est pas définie (personnes non logguée)
//on lui indique les droit d'un visiteur
if(!isset($_SESSION['droits']))
$_SESSION['droits'] = 1;

//si les droits ne sont pas corrects, redirection vers une page d'erreur
if(!VerifDroits($_SESSION['droits'], $r_page))
header("location: page_erreur.php");
}
?>



login.php
<?php
include_once("inc/config.inc.php");
include_once("inc/function.inc.php");
SetSession(1);

$db = mysql_connect("$host","$user","$pass");
mysql_select_db("$bdd", $db);

$req = mysql_query("SELECT * FROM users WHERE login='".$_POST['login']."' AND pass=MD5('".$_POST['password']."')") or die(mysql_error());

if(mysql_num_rows($req) == 0)
{
header("location: page_erreur.php");
}
else
{
$sortie = mysql_fetch_array($req);
$_SESSION['droits'] = $sortie['droits'];
$_SESSION['login'] = $sortie['login'];
header("location: page.php");
}
?>



En espérant que tout ce blabla puisse être utile à qqn

a++
JuTs
moogli
le 26/12/2004 à 16:47
moogli
Salut,

très intérressant, quoique un peut compliqué a mon gout smiley

y a juste un truc qui me soucis => droits nécessaire pour accéder à la page : 10 (010)

alors que tu n'a que 3 niveau de cdroit 1 11 et 111 !!! smiley


et puisque que je rale smiley tu devrait éviter d'utiliser le select * http://frederic.bouchery.free.fr/?2004/10/26/27-La-Guerre-Des-Etoiles et éviter d'utiliser directement $_POST['login'] dans une requete SQL c'est une faille de sécurite assez importante (injection sql assez facile !

si non bon boulot

smiley
Il en faut peu pour être heureux !!!!!
JuTs
le 26/12/2004 à 20:01
JuTs

y a juste un truc qui me soucis => droits nécessaire pour accéder à la page : 10 (010)


Attention, ne pas confondre :

les droits nécessaire pour accéder à la page (1, 10, 100);
les droits des utilisateurs (1, 11, 111).

d'accord, en utilisant seulement 1, 11, 111, ça serait plus simple, un petit & et hop, fini smiley

Mais dans ce cas c'est plus facile si tu veux "moduler" les différents droits (ce droit là, celui-là, mais pas çuilà... smiley).



tu devrait éviter d'utiliser le select *


Je sais, c'est une mauvaise habitude... que j'évite. En fait c'est un script de login écrit il y très très très très longtemps alors que je débutais en php.



éviter d'utiliser directement $_POST['login'] dans une requete SQL c'est une faille de sécurite assez importante (injection sql assez facile


Heu... Tu peux être plus précis (exemple) stp.
C'est déjà mieux qu'un $_GET['login'] smiley



http://frederic.bouchery.free.fr


Hop, dans les favoris
JuTs
moogli
le 26/12/2004 à 20:28
moogli
pour le coup des droit g pas bien pigé ta logique mais c po grave (g laissé mon binaire o vestiaire :) )

pour l'injection sql que tu fasse un $_GET['login'] ou $_POST['login'] sa change pas grand chose. Pour le premier faut bidouiller l'url pour le second ta un formulaire tout bo smiley

pour l'exemple

si tu rentre en login ' OR B BETWEEN A AND C #
et n'importe quoi en mdp tu va avoir une requete comme ceci


SELECT * FROM users WHERE login='' OR B BETWEEN A AND C # ' AND pass=MD5('$_POST['password']')
sachant que le # est le caractère de commentaire en SQL tout ce qu'il y a après sera ignoré donc ta va avoir tout tes tuples de sélectionné.
Ceci fonctionne avec toutes les expression qui réponde vrai comme 1=1 2>1 etc ...

si utilise un addslashes sur t'est données tu va avoir
SELECT * FROM users WHERE login='\' OR B BETWEEN A AND C #' AND pass=MD5('".$_POST['password']."')

Voila donc pourquoi ton système est sensible aux injection sql. N'étant pas spécialiste dans ce genre de chose (suis spécialiste en quelque chose moa :???: ) je te renvoie a google pour plus d'infos

smiley
Il en faut peu pour être heureux !!!!!
JuTs
le 26/12/2004 à 21:03
JuTs
pour les droits, un chtit exemple :

Tu veux qu'une personne ait des droits pour accéder aux pages "webmaster" et "membres" mais pas "visiteur" (complétement absurde puisque le formulaire qui permet d'accéder aux pages "webmaster" et "membres" se trouve sur une page "visiteur"). Dans ce cas ces droits seront 110.

Dans le cas le plus simple (avec 1, 11, 111) tu compare tous les bits. et dans le mien seulement celui correspondant au droit de la page, d'où le décalage à droite pour éliminer les bits qui ne nous intéressent pas.

Pour le $_POST['login'], j'y avais pas pensé, tu fais comment toa smiley
JuTs
JuTs
le 27/12/2004 à 11:38
JuTs
Moogli, t'est mort ?

smiley

pour le $_POST['login'], si je fais
<?php
$req = mysql_query("SELECT login, droits FROM users WHERE login='".addslashes($_POST['login'])."' AND pass=MD5('".$_POST['password']."')");
?>

est-ce que c'est suffisant ?
tu remarqueras que j'ai supprimé le * smiley
JuTs
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours