système d'administration sécurisée

Moderator: Mod

système d'administration sécurisée

Postby HACKIRA » Thu Feb 25, 2010 9:40 pm

Bonjour a tous,
Je souhaiterais faire un système d'administration protégée (au max si possible) pour une boutique en ligne (future).
J'ai commencé par essayer les sessions, mais c'est assez complexe et sur les tutos que j'ai regarder je trouve ca très vague comme explications.
J'ai ensuite essayer de passer par les cookies mais j'ai l'impression que c'est pas beaucoup sécurisé.
j'ai pondu ce bout de code la :
[code:1:5d8c6cce51]<?php
// Démarrage de la session
session_start();
?>

<?php
if(isset($_SESSION['login']))
{
mysql_connect("Localhost","root","");//connexion a la base de données
mysql_select_db("users");//selection de la base users
$comparaison_mot_de_passe = mysql_query("Select * from utilisateur where Identifiant='$_POST[login]' and MDP='$_POST[mdp]'") or die(mysql_error());
mysql_close();//deconnexion de mysql
//si tout est bon on inclue la page d'administration
include ('administration.php');

//code pour les membres

// identification de l'utilisateur
$user = $_SESSION['login'];

// informations pour l'utilisateur
}
else
{
// Code pour les non-membres
echo 'Bonjour cher visiteur vous devez vous identifier pour pénétrer dans l\'administration';
echo '<a href="formulaire.php"> Retour</a>';
}
?>[/code:1:5d8c6cce51]

il s'agit d'essai d'utilisation des sessions seulement les explications que j'ai vu sur les tutos sont resté assez vague donc si une âme charitable pouvais m'aider ca serais sympa :)
Merci d'avance
HACKIRA
Projets
 
Posts: 17
Joined: Thu Apr 09, 2009 10:25 am

Postby Manu404 » Thu Feb 25, 2010 11:01 pm

Deux trois trucs qui me font un peux peur. Le nom de ta DB, compte tu utiliser les DB de cette manière ? une DB User, une DB articles etc ??
Fait plustot une DB <nom_du_site/portail> et dans cette db un tables user.
Ensuite utilise les vues.
Bon le code. Tu teste la présence du variable de session. Ce qui veux dire que les membres enregistré mais non admin auront acces a l'execution du code pour la verif de l'admin.
Ensuite, tu fait ta request SQL mais tu ne verifie a aucun moment son resultat. Pas de If sur le retour de la request SQL... Donc n'importe qui, a condition qu'il soit membre, fera un include de admin.php.
Ensuite, dans ta request, verifie les données qui te sont trasnmises en moyen de regex afin d'eviter les 'xxx or 1=1' et autres injections de bases SQL.
Par contre un bon reflexe, tu ferme ta connection SQL. Par contre, ne ferme ta connection SQL que en fin d'instruction. si tu as 10 request à faire, ne co/deco pas 10 fois ^^
Et enfin, je ne comprend pas ce que tu fait avec l'instruction après le indlude...
Sliim, tu es dev php/web, que rajouterais-tu ?
User avatar
Manu404
 
Posts: 2219
Joined: Tue Feb 26, 2008 3:44 pm
Location: ::1:

Postby HACKIRA » Fri Feb 26, 2010 8:57 am

bon bah déjà merci manu pour toute ces précisions ca va me permettre d'avancer un temps soi peu :)

Pour le nom de la db c'est juste pour tester je me doute bien que ca serait trop simple a trouver lol :)

pour la vérification admin il va falloir que je teste un peu partout si il y a des droits admin donc car il est vrai que je ne vérifie rien pour le moment :)

pour les injections SQL il va falloir que j'apprenne les instructions POSIX pour faire le regex et de ce que j'ai vu c'est assez complexe en soi donc je vais pour le moment m'arrêter à la page d'administration et à ses vérifications.

Pour ce qui est de l'instruction après le include il fait partie de la base du code que j'ai pris sur internet (structure d'une page avec session) et donc il s'agit juste d'un oublie de ma part il faut que je l'enlève car cela définissait normalement l'utilisateur ayant rentré un pseudo, et aucun contrôle n'était fait.
HACKIRA
Projets
 
Posts: 17
Joined: Thu Apr 09, 2009 10:25 am

Postby Sliim » Fri Feb 26, 2010 11:36 am

Salut,

[quote:dd23d78d6c]Je souhaiterais faire un système d'administration protégée (au max si possible) pour une boutique en ligne (future). [/quote:dd23d78d6c]
Sans vouloir te démotiver, un site e-commerce se vend dans les 10aines de milliers d'euros, donc je te laisse imaginer le taf que ça représente et les qualifications requises. Il serait peut être plus raisonnable de penser à un site basique, un minimum dynamique pour commencer ;).

Cela dit, manu a déjà fait un bon rapport au niveau du code que tu as posté :P.

En ce qui concerne les sessions / cookies, les sessions vont te permettre de gérer les users connectés ou non, stocker leurs droits etc..
Imaginons une table `users` (très basique) :
[quote:dd23d78d6c]| id | name | password | level |[/quote:dd23d78d6c]

Beh genre quand l'user se connectera, tu iras chercher les variables contenue dans le tableau $_POST (méthode post et non get hein, pas question de voir le mot de passe dans l'url ;)) Tu testeras ses données envoyées en faisant bien attention à ce que les injections de codes soient impossible et ensuite tu les enregistres dans ta session.

exemple de récupération de données :
[i:dd23d78d6c]connexion.php[/i:dd23d78d6c]
[code:1:dd23d78d6c]
<?php
session_start();
if(key_exists('name', $_POST){
$name = addslashes(htmlentities($_POST['name']));
$password = md5($_POST['password']);

$query = 'SELECT * FROM `users` WHERE `name`=' . $name;

mysql_connect('hostDb','userDb','mdpDb') or die('Impossible de se connecter au serveur de base de données');
mysql_select_db('users') or die('Impossible de se connecter à la base de données');

$resultQuery = mysql_query($query);
if(mysql_num_rows($resultQuery) == 1){
$data = mysql_fetch_assoc($resultQuery);
//Maintenant que l'user c'est identifié, on enregistre ses infos dans les sessions
if($password == $data['password']){
//Connexion ok
$_SESSION['user']['id'] = $data['id'];
$_SESSION['user']['name'] = $data['name'];
$_SESSION['user']['level'] = $data['level'];
}
else
//Mauvais mot de passe
}
else
echo 'connexion échouée';

mysql_close();
}
else
//Aucune demande de connexion n'a été envoyé
[/code:1:dd23d78d6c]

Ça en gros c'est pour la connexion.

Ensuite une fois connecté, pour vérifier son niveau d'autorisation d'accès au site on utilise le champ `level` de la table `users` donc la valeur de $_SESSION['user']['level']

[code:1:dd23d78d6c]
<?php
session_start();
if(isset($_SESSION['user']['level']){
switch($_SESSION['user']['level']){
case 1:
//Accès admin
break;
case 2:
//Accès user basique
break;
}
else
/Accès visiteur
[/code:1:dd23d78d6c]

Voilà à peu près, ces exemples de code sont tappés vite fais dans le textarea du forum donc je ne garantie pas le fonctionnement du copier/coller. Mais au niveau du principe c'est ça :P.

Après les cookies, ils peuvent être utiles, dans le cadre d'un site e-commerce, pour le panier de l'utilisateur par exemple. Utiliser les sessions auraient pour conséquences de perdre le panier si l'user venait à fermer son navigateur. Avec les cookies, ils sont stockés sur la machine cliente et donc sont récupérés à chaque fois que l'user va sur ton site (à condition que l'user ne les ait pas supprimé). Même après un BSOD l'utilisateur pourra retrouver son panier tel qu'il était lorsqu'il a quitté ^^.

Donc voilà, session, cookie, deux choses utiles mais à utiliser intelligement et avec modération. Il faut bien analyser les besoins avant de se lancer ;). En ce qui concerne les connexions utilisateurs, c'est la plupart du temps les sessions qui sont utilisées (voir tout le temps). Le panier d'un user on utilisera plutôt les cookies pour la raison évoquée ci-dessus. Pour les autres fonctionnalité de ton site il faudra que tu y réfléchisse :P.

++
[u:dd23d78d6c]Sliim[/u:dd23d78d6c]
Last edited by Sliim on Fri Feb 26, 2010 4:02 pm, edited 1 time in total.
User avatar
Sliim
Site Admin
 
Posts: 1177
Joined: Fri May 16, 2008 12:53 pm

Postby HACKIRA » Fri Feb 26, 2010 12:37 pm

OUAAAHHH !!!! lol ca c'est de l'explication claire et concise :) merci sliim
Pour le fonctionnement je pense que j'ai compris et donc dans le cas d'un e-commerce il vaut mieux utiliser les sessions pour les connexions user et les cookies pour le panier.

Pour ce qui est de l'e-commerce je n'y suis pas encore lol j'en suis très très loin, il s'agit juste pour le moment de faire la partie administration et connexion clients :)
On va y aller petit a petit :D

pour se qui est de la connexion je préfère le $_POST car ça n'apparait pas dans l'url et ca serais trop dangereux en $_GET

Pour ce qui est de ton exemple c'est le plus parlant de tout ceux que j'ai put voir c'est très intéressant de voir ça comme ca :)

J'ai quand même une petite question pour la vérification du niveau d'autorisation tu met ça dans un fichier a part ou dans le même fichier ca peut le faire ?
HACKIRA
Projets
 
Posts: 17
Joined: Thu Apr 09, 2009 10:25 am

Postby Sliim » Fri Feb 26, 2010 3:58 pm

Tu as raisons pour $_POST ;), mais c'est pas pour autant qu'il faut laisser $_GET de côté, il a ses avantages aussi (comme le passage de paramètres via un simple lien, pas obligé de passer par un formulaire) ;).

En ce qui concerne ta question je sais pas si j'ai vraiment compris. Je vais essayer de répondre quand même.

Je suppose que les fichiers dont tu parles sont les fichiers php de ton site. En fait c'est à toi de voir comment tu organises ton arborescence de fichier.

En fait mon premier segment de code correspond à la connexion au site. Donc tu peux créer un fichier spécifique à la connexion, par exemple connexion.php, que tu appelleras lors du submit du formulaire.
L'autre segment de code correspond à la vérification du niveau d'autorisation. Ce code peut être intégré dans chaque fichier qui requiert cette vérification ou alors si tu ne souhaites pas dupliquer ton code (chose que je conseil, et je ne suis pas le seul ici :P) tu peux faire un truc du genre :

[i:9003fca45f]levelAccess.php[/i:9003fca45f]
[code:1:9003fca45f]
<?php
session_start();

$admin = false;
$member = false;
$visitor = false;

if(isset($_SESSION['user']['level']){
switch($_SESSION['user']['level']){
case 1:
$admin = true;
break;
case 2:
$member = true;
break;
}
else
$visitor = true;
[/code:1:9003fca45f]

Tac, maintenant que tu as ce fichier, tu peux l'inclure dans toute les pages où il faut vérifier le niveau d'accès de l'utilisateur.

Par exemple une page d'administration tu fera ça :

[i:9003fca45f]admin.php[/i:9003fca45f]
[code:1:9003fca45f]
<?php
include('levelAccess.php');
if($admin){
//L'utilisateur est un admin, on autorise donc l'affichage de la page
}
else
exit('Vous n\'avez pas accès à cette page!');
[/code:1:9003fca45f]

Ce n'est qu'un exemple, il y a bien sûr d'autre façon de procéder, mais avec cette méthode le code de [i:9003fca45f]levelAccess.php[/i:9003fca45f] est unique, et donc si tu as besoin de le modifier tu auras moins de galère car tu n'auras qu'un fichier à modifier au lieu de toute tes page admin par exemple. Moins tu duplique ton code, moins tu galères par la suite pour faire des modifs ;).

Voilà si je n'ai pas répondu à ta question dis le moi ^^. Si tu as d'autres question n'hésites pas ;).

++
[u:9003fca45f]Sliim[/u:9003fca45f]
User avatar
Sliim
Site Admin
 
Posts: 1177
Joined: Fri May 16, 2008 12:53 pm

Postby HACKIRA » Sat Feb 27, 2010 6:30 pm

Et bien en fait tu as parfaitement répondu a ma question :)
je te remercie de tout ces détails :)
Le exit c'est pour éviter que du code php ne s'exécute encore après la vérification il me semble car je n'ai jamais vu cette commande la dans un tutoriel ...
HACKIRA
Projets
 
Posts: 17
Joined: Thu Apr 09, 2009 10:25 am

Postby Sliim » Mon Mar 01, 2010 10:05 am

Yep, exit() stop le script php, donc tout ce qui se passe derrière (ou est censé se passer) n'a pas lieu.
Un site utile pour les fonctions php : php.net.
Genre tu as besoin d'info sur la fonction exit :
http://www.php.net/exit ;)

++
[u:e87c01186f]Sliim[/u:e87c01186f]
User avatar
Sliim
Site Admin
 
Posts: 1177
Joined: Fri May 16, 2008 12:53 pm


Return to Php

Who is online

Users browsing this forum: No registered users and 1 guest

cron