[WIP] Portail/Blog - Dernier prb: Sécurité, sessions

Portail/Blog - Dernier prb: Sécurité, sessions [WIP] - PHP - Programmation

Marsh Posté le 31-01-2006 à 01:19:51    

Salut salut.
Je code un site (essentiellement pour progresser en programmation php/css).
http://ouafouaf9.free.fr/  
 
EDIT - 1 février
 
Dernière version:
http://ouafouaf9.free.fr/_WAFBLOG/v0.01-a2/
 
Mise en page CSS, sécurisation par session.
Le contenu n'est pas php dynamique, c'est juste un contenu exemple ;)
 
Pb actuel: architecture, sécurité.
 
Voir les derniers posts
 
Fin edit
 
Ancien post:
 
J'en suis à la création de ma page d'administration sécurisée.
(cliquez sur le bouton admin)
La page admin est en include à l'intérieur de la page index.php
 
Le code est simple, donc j'vais pas m'étendre:
 

Code :
  1. admin.php
  2. <?php include('login.php'); ?>
  3. Mode Admin.


 
 

Code :
  1. login.php
  2. <?php
  3. // -----------------------------------
  4. // Vérification d'éxistence d'une session  
  5. // -----------------------------------
  6. if (!isset($pseudo) && !isset($ip))
  7. {
  8. session_destroy();
  9. ?>
  10. <h1>Veuillez vous connecter...</h1>
  11. ~~~( ici le formulaire )~~
  12. <?php
  13. exit();
  14. }
  15. ?>


 
 
Le problème est simple: à cause de ce exit() le footer n'apparait pas.
J'ai réfléchi mais j'trouve pas de solution pour y remédier, sans avoir à chambouler le tout (j'ai pas envie de mettre le footer en include).
y a t'il une altérnative à la fonction exit() qui me permette de recracher la suite de la page index.php ?
 
merchi


Message édité par gnarky le 01-02-2006 à 15:10:28
Reply

Marsh Posté le 31-01-2006 à 01:19:51   

Reply

Marsh Posté le 31-01-2006 à 01:34:49    

tu utilise pas exit(), et tu fais une vérification pour que tes fonctions nécessitant une authentification ne s'exécutent pas si t'es pas connecté.
Les fonctions ne nécessitant pas d'etre connecté fonctionnent alors normalement, y compris celle balançant ton footer.
 

Reply

Marsh Posté le 31-01-2006 à 02:46:59    

hmmm
j'ai beau y réflechir, je comprend pas bien ton conseil djebel1.
 
Les pages sécurisés par session affichées en pseudo frame, c'est encore un peu compliqué pour mon petit cerveau.
 
Pour l'instant la solution que j'utilise c'est donc d'appeler le fichier login.php en début de page sécurisé, et celui-ci affiche un formulaire de login si la session n'est pas validée.
 
Ce ne me donne pas satisfaction, ou alors j'm'y prend mal.
Quel système pourrais-je utiliser sinon?

Reply

Marsh Posté le 31-01-2006 à 02:55:37    

Pour exemple, ce que je fais perso :
A chaque utilisateur j'associe un niveau de sécurité dans la base de données.
A chaque page de mon site j'associe un niveau de sécurité requis pour voir la page (niveau 0 = tout le monde peut la voir).
 
Ensuite, toutes mes pages appellent une classe qui fait 2 choses :  
- elle affiche les éléments communs à toute page (menu, formulaire de login, doctype, footer, etc)
- elle vérifie le niveau de sécurité de l'utilisateur. Si il a un niveau suffisant pour voir la page, alors on va lancer les actions requises. Sinon, quedalle.
 
Comme ça j'ai pas de problème de pages "malformées" (sans footer dans ton cas), ni problème de sécurité.
 
Après c'est ma méthode, je dis pas que c'est une bonne méthode, j'en sais rien. Juste pour te dire que normalement, tu as pas vraiment besoin de exit() ou de die ()


Message édité par Djebel1 le 31-01-2006 à 02:56:43
Reply

Marsh Posté le 31-01-2006 à 10:46:56    

oui, je vois un peu mieux.
 
cependant, j'aimerais rester à mon système actuel.
voici en simplifiant:
 
index.php  
 

Code :
  1. <div id="top"><?php include (top.php) ?></div>
  2. <div id="page">
  3. <?php
  4. if (isset ($_GET['page']))
  5. {
  6.  $FichierInclude = "includes/".$_GET['page'].".php";
  7.  if (file_exists($FichierInclude))
  8.   {
  9.    include ($FichierInclude);
  10.   }
  11.  else
  12.   {
  13.    include('includes/accueil.php');
  14.   }
  15. }
  16. else
  17. {
  18.  include('includes/accueil.php');
  19. }
  20. ?>
  21. </div>
  22. <div id="footer><?php include (footer.php) ?>


 
Je voudrais que les pages incluses s'affichent de toute facon, et que si la page est privé et l'utilisateur non loggué, à la place de la page s'affichent un formulaire de login.
 
Y doit y avoir un moyen simple pour rediriger les utilisateurs non loggués vers login.php tout en ce que cette page login soit en include de l'index, non?
 
ptet une redirection vers index.php?login serait la solution...
Enfin la j'pars à la fac, je verrai ce soir ;)
 
Merci pour tes conseils, et merci aux autres de me donner des conseils aussi svp, pour me sortir de la mouise.

Reply

Marsh Posté le 31-01-2006 à 11:00:02    

ok j'ai fait comme ca:
 
admin.php >>> include (veriflogin.php)
 
veriflogin.php  

Code :
  1. if (!isset($pseudo) && !isset($ip))
  2. {
  3. session_destroy();
  4. <META HTTP-equiv="refresh" content=0;URL=http://ouafouaf9.free.fr/index.php?page=login>
  5. }


 
Ca à l'air de marcher.
A plus tard pour mes autres problèmes ;)

Reply

Marsh Posté le 31-01-2006 à 17:41:12    

personnellement j'aime pas trop faire ça, parce que tu es redirigé quand pas connecté, certes, mais je me dis que peut-être un pti malin peut accéder aux données que tu veux protéger (je sais pas, avec un navigateur bidouillé, un truc comme ça).
 
Enfin là c'est de la parano surement infondée de ma part, mais bon, une fonction protégée pour moi, elle ne s'execute pas si tu es pas authentifié, point barre.

Reply

Marsh Posté le 31-01-2006 à 17:56:55    

Djebel1 > Je suis d'accord avec toi. Si on ne veut pas afficher des données, il ne faut surtout pas les afficher.
Une balise meta de redirection ou de rafraichissement ne fera que rigoler les aspirateurs de sites réglés pour ne pas en tenir compte.
 
PS : Et en plus avec certains navigateurs, un refresh réglé à 0 seconde = aucun refresh. Netscape 4.x en fait parti.

Reply

Marsh Posté le 31-01-2006 à 18:10:20    

Ha voilà j'avais bien le souvenir qu'une meta refresh c'était pas le pied (merci ce forum ^^)

Reply

Marsh Posté le 31-01-2006 à 19:38:33    

bon j'ai fait des essais cet aprèm.
 
http://ouafouaf9.free.fr/_WAFBLOG/v0.01-exercice-01
 
dites moi cque vous en pensez.
Plusieurs défauts:
 
- Lorsqu'on se délog, après le refresh vers la page d'accueil, le userlevel ne s'affiche pas '( "Salut visiteur de level , log toi donc." au lieu de " Salut visiteur de level 0, log toi donc." ).
 
- J'aimerais que lorsque l'on essaye de se connecter à une page interne (comme http://ouafouaf9.free.fr/_WAFBLOG/ [...] /login.php ), on soit automatiquement redirigé vers l'index. Comment faire?
J'ai essayé d'inclure la page d'identification de session à toutes les pages, ca permet de sécuriser l'affichage direct des pages, mais ca peut poser problème dans le cadre des pseudo frames (exemple avec le footer, qui me chie un cake pour ouvrir la session).
 
Humm je crois que c'est tout.


Message édité par gnarky le 31-01-2006 à 19:52:41
Reply

Marsh Posté le 31-01-2006 à 19:38:33   

Reply

Marsh Posté le 31-01-2006 à 19:42:43    

oui quand je dis dites moi cque vous en pensez, si je montre pas les sources ca parait idiot :/
seuleument si je montre toutes les sources ca en fait un peu beaucoups qd meme...
disons que si vous voyez des failles/problèmes évidents, merci de me le dire ;)

Reply

Marsh Posté le 01-02-2006 à 07:12:31    

au passage faut surtout pas faire ça

Code :
  1. $FichierInclude = "includes/".$_GET['page'].".php";


Là ça veut dire qu'on pourra inclure la page que l'on veut en la tapant dans l'url, y compris une page extérieure à ton site, pouvant exécuter de vilaines actions  :non:
 
Enfin je sais pas. Peut-être que ton test

Code :
  1. if (file_exists($FichierInclude))

est suffisant, mais je n'en suis pas certain, les experts de ce forum te le diront. (je pense que file_exists doit etre vrai même si le fichier est sur un serveur distant, mais j'en sais rien et j'ai la flemme de matter dans la doc là)
 
Le mieux, c'est quand même de faire un test sur $_GET['page']

Code :
  1. switch ($_GET['page'])
  2. {
  3. case 'mapage' :
  4. case 'autre' :
  5.   $FichierInclude= "includes/".$_GET['page'].".php";
  6.   break ;
  7. default :
  8.   $FichierInclude= 'includes/acceuil.php';
  9.   break ;
  10. }


Message édité par Djebel1 le 01-02-2006 à 07:25:04
Reply

Marsh Posté le 01-02-2006 à 14:37:53    

merci Djebel pour tes conseils.
 
J'ai changé la sécurité, en fait j'ai quasiment tout changé.
 
Voici la page d'authentification:
 

Code :
  1. <?php
  2. session_start();
  3. include ("config.php" );
  4. if(!isset($_SESSION['name'])) {
  5. $_SESSION['userlevel'] = 0;
  6. }
  7. else {
  8. $_SESSION['name'] = $name;
  9. $sql = "select * from w_users where name='".$name."'";
  10. $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
  11.   $data = mysql_fetch_assoc($req);
  12.  
  13. $_SESSION['userlevel'] = $data['level'];
  14. }
  15. ?>


 
J'ai viré les pseudo frames, donc y a une page index.php et une page admin.php, avec pour les deux la page d'authentification en include.
 
J'utilise ainsi la variable $userlevel pour afficher ou non, à base de:
 

Code :
  1. <?php
  2. if ($userlevel == 9) {
  3. ?>
  4. <h1>Bienvenue, grand Admin de level <?php echo $userlevel; ?> !!</h1>
  5. <?php
  6. }
  7. else {
  8. ?>
  9. <!--
  10. ~~~~~~~~~~~~~~~~~
  11. Formulaire Login
  12. ~~~~~~~~~~~~~~~~~
  13. -->


 
Ca vaut quoi point de vu sécu?
 
http://ouafouaf9.free.fr/_WAFBLOG/v0.01-a2/
 
pour jeter un oeil à la page.
D'ailleurs si vous pouviez me dire cque vous en pensez, d'un point de vu de la mise en page. Le PHP n'est pas mis en place, le contenu est seuleument à titre d'exemple évidement.
 
merchi


Message édité par gnarky le 01-02-2006 à 15:07:49
Reply

Marsh Posté le 01-02-2006 à 14:54:57    

J'ai changé le titre du thread, pacque vu que je bosse pas mal les problèmes changent ;)
la balise WIP (work in progress) me semble appropriée.
 
Au dela de mes interrogation sur la sécurité de mon système (voir post du dessus), je m'interroge quand à l'architecture de mon site en général.
 
Je voudrais un script clair, mais j'ai peur que ca soit délicat.
 
Serais-ce une bonne idée de répartir les pages?
par exemple si je fais un calendrier > inc.calendar.php, si je fais un menu d'administration > inc.admin_menu.php , vous croyez que c'est mieux?
 
Ou bien autre exemple: est-ce une bonne idée de gérer la reception des formulaire POST dans la même page que le formulaire?
Pour la page admin.php, par exemple, il y a deja le formulaire de login et sa réponse.
Alors avec tous les formulaires qu'il y aura au final pour poster/éditer/configurer la page, ca risque de faire un énorme bordel...
 
J'ai beau être débutant, ca m'ennuierai de faire une première version fouillie pour devoir tout refaire ensuite, alors j'voudrais directement faire une belle architecture... mais c'est plus facile a dire qu'à faire  :cry:  :sweat:


Message édité par gnarky le 01-02-2006 à 15:02:09
Reply

Marsh Posté le 01-02-2006 à 18:02:49    

Alors, c'est mieux ton histoire de login, mais :

Code :
  1. #
  2. else {
  3. #
  4.     $_SESSION['name'] = $name;
  5. #
  6.     $sql = "select * from w_users where name='".$name."'";
  7. #
  8.     $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
  9. #
  10. #
  11. $data = mysql_fetch_assoc($req);
  12. #
  13.     $_SESSION['userlevel'] = $data['level'];
  14. #
  15. }


Stocke le niveau de sécurité de l'utilisateur dans une variable de session, au moment où tu vérifies que son mot de passe est correct. T'auras pas besoin de réinterroger la base à chaque page vue.
En passant, ne fais pas "Select * " quand tu as juste un champ à ramener. Dans ton cas, un "Select level" aurait suffit.
 
Pour l'architecture de ton site, je te conseille l'excellent post de FlorentG : http://forum.hardware.fr/hardwaref [...] 7425-1.htm
 
Je te préviens, c'est assez hard quand tu débutes. Il m'a fallut pas mal de temps pour appréhender ce post  :D. Y a pas mal de sites qui parlent de ce modèle de conception, ils m'ont bien aidé en complément de ce post (ça par exemple http://www.microsoft.com/france/ms [...] s-mvc.html )
FlorentG  a aussi mis des liens dans son post


Message édité par Djebel1 le 01-02-2006 à 18:07:58
Reply

Marsh Posté le 01-02-2006 à 18:38:02    

oui le thread de FlorentG j'ai essayé de le lire il y a quelques jours, mais hmmm, meme avec tout le café et toute la concentration du monde, j'avais l'impression de lire de l'hebreux ;)
 
C'est sur que j'ai encore beaucoups de chemin à faire.
 
Sinon, pour le stockage du level dans la session, c'est ce qui se passe. C'est vrai que c'est idiot d'aller rechercher dans la bdd le level à chaque chargement de la page.
J'vais voir pour corriger ça.
C'était dans un soucis de sécurité que je voulais pour chaque page vérifier la session.
 
Où est la limite entre excès et laxisme dans ce cas :/

Reply

Marsh Posté le 01-02-2006 à 18:39:58    

au fait, la version 0.01 alpha 3 est en préparation (wahou).
 
http://ouafouaf9.free.fr/_WAFBLOG/v0.01-a3
 
le login fonctionne, ainsi que le menu personnalisé et la page admin.
on peut tester avec
admin/admin (level 9)
user/user (level 5)

Reply

Marsh Posté le 01-02-2006 à 18:49:22    

gnarky a écrit :


C'était dans un soucis de sécurité que je voulais pour chaque page vérifier la session.
 
Où est la limite entre excès et laxisme dans ce cas :/


Bah le truc, c'est que faut considérer tes variables de session fiables à un moment je pense.  
 
SI un hacker vole la session d'un utilisateur connecté. Bah ça, à moins de faire une connection SSL y a pas grand chose à faire.  
Tu peux juste vérifier que l'IP de l'utilisateur a pas changé au cours de la session (et encore, je sais plus où j'ai lu que avec AOL tu changeais d'IP presque à chaque page vue, je sais pas si c'est vrai), ou vérifier que son navigateur a pas changé au cours de la session, ou stocker dans une variable de session la date de derniere activité pour l'auto-deconnecter après un certain temps.
 
Tout ça pour dire, de toute façon si un de tes utilisateurs se fait voler sa session tu l'as dans le baba. Il est facile de contourner une vérif basée sur l'IP ou le navigateur. Donc soit tu considères que tes variables de session sont fiables une bonne fois pour toute, soit tu fais du SSL
 
De toute façon dans ton cas, la vérification d'une des variables de session étant basée ... sur une autre variable de session ...  :whistle:


Message édité par Djebel1 le 01-02-2006 à 18:50:31
Reply

Marsh Posté le 01-02-2006 à 19:14:24    

[:haribo71]
 
chuis malin moi  :pt1cable:  :pt1cable:  
 
bon ben c'est comme ca qu'on progresse donc bon... j'continue...
 
 :jap:  
 
Donc je vire cette requete sql et je place le $userlevel une fois pour toute dans la session.
 
Une autre question:  
 
comment empecher n'importe qui d'ouvrir les pages contenues dans un rép (/inc par exemple)? Sans bien sur en empecher les inclusions prévues par le script.
 

Reply

Marsh Posté le 01-02-2006 à 19:19:25    

htacces

Reply

Marsh Posté le 01-02-2006 à 19:20:41    

c'est la réponse que je redoutais  :whistle:  
 
j'garde ca pour plus tard, pacque j'y connais strictement rien :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed