Portail/Blog - Dernier prb: Sécurité, sessions [WIP] - PHP - Programmation
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.
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?
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 ()
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 :
|
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.
Marsh Posté le 31-01-2006 à 11:00:02
ok j'ai fait comme ca:
admin.php >>> include (veriflogin.php)
veriflogin.php
Code :
|
Ca à l'air de marcher.
A plus tard pour mes autres problèmes
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.
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.
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 ^^)
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.
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
Marsh Posté le 01-02-2006 à 07:12:31
au passage faut surtout pas faire ça
Code :
|
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
Enfin je sais pas. Peut-être que ton test
Code :
|
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 :
|
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 :
|
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 :
|
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
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
Marsh Posté le 01-02-2006 à 18:02:49
Alors, c'est mieux ton histoire de login, mais :
Code :
|
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 . 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
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
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)
Marsh Posté le 01-02-2006 à 18:49:22
gnarky a écrit : |
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 ...
Marsh Posté le 01-02-2006 à 19:14:24
chuis malin moi
bon ben c'est comme ca qu'on progresse donc bon... j'continue...
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.
Marsh Posté le 01-02-2006 à 19:20:41
c'est la réponse que je redoutais
j'garde ca pour plus tard, pacque j'y connais strictement rien
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:
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