|
Gestion Admin : votre experience... |
Iniciado por damien.lep, nov., 21 2005 9:35 AM - 10 respostas |
| |
| | | |
|
| |
Publicado em novembro, 21 2005 - 9:35 AM |
Bonjour a tous,
Je developpe actuellement en PHP et MySQL, et je desire ajouter une gestion de l administrateur sur mon site. J ai plusieurs idees mais j ai un gros doute sur leurs degrés de sécurité.
Je pensais faire une page d accueil "spécial admin" avec identifiant, et utiliser le passage de parametre (en definissant chaque page comme procedure). Ce parametre serait donc un booleen, qu est ce qui empeche une personne mal intentionnée d'intercepter ce parametre, de le changer, bref de se mettre lui meme en Admin ...
De plus, si login il y a, enregistrement des données admin il y a egalement. Ce ne peux etre fait en dur dans le code (peu souple et moyen de trouver les pass), ce sera donc dans la base MySQL. Et là probleme, en PHP5, MySQL5 et WebDev je ne peux pas a priori utiliser de mot de pass pour ma base (acces natif MySQL ...), donc ca devrait etre facile de trouver le pass egalement ...
Je sais bien que tous ces elements sont sur un serveur protegé, mais ils doivent bien pouvoir interroger la base de l'extérieur ... De plus comme ce serveur est heberge chez un prestataire, rien ne garantie qu'une personne en locale la bas ne change nos données, puisqu il y n y a pas de mot de pass...
Voila voila si vous aviez des idées, je serais très intéressé... Damien. |
| |
| |
| | | |
|
| | |
| |
Publicado em novembro, 21 2005 - 10:02 AM |
Petite MAJ :
En fait j arrive très bien à définir un mot de pass sous MySQL, mais comme je dois utiliser une SQLConnecte sous WebDev (PHP oblige), je doit mettre le pass en dur dans le code... Il suffit donc d'ouvrir la page PHP correspondante pour voir le pass ...
Je peux creer un utilisateur avec peu de privilèges, mais il pourra toujours me mettre le souc dans ma table produit (puisque l admin doit pouvoir modifier le contenu de la table...)
Comment faire pour que l'on ne puisse pas lire ce pass ?
Voila voila encore une question ... Damien. |
| |
| |
| | | |
|
| | |
| |
Publicado em novembro, 21 2005 - 1:27 PM |
Merci de ta reponse ...
Effectivement le code est en serveur, et donc se retrouve dans un script PHP. Il devrait donc etre invisible de l exterieur, mais pour toute personne qui aurait acces au serveur (localement je veux dire), ce script peut etre recupere et donc on voit le mot de passe dedans ...
De plus je me demande dans quel mesure un hacker pourrait aller fouillé dans les scripts PHP, si c possible ou pas en fait .... (je precise je n ai aucune connaissance en HTML, mais si j ai bien compris le HTML lance des scripts PHP qui sont sur le serveur et non dispo pour les utilisateurs... ca me semble quand meme un peu "lege" comme securite). |
| |
| |
| | | |
|
| | |
| |
Publicado em novembro, 21 2005 - 2:02 PM |
leplaidn a couché sur son écran :
Petite MAJ :
En fait j arrive très bien à définir un mot de pass sous MySQL, mais comme je dois utiliser une SQLConnecte sous WebDev (PHP oblige), je doit mettre le pass en dur dans le code... Il suffit donc d'ouvrir la page PHP correspondante pour voir le pass ...
Je peux creer un utilisateur avec peu de privilèges, mais il pourra toujours me mettre le souc dans ma table produit (puisque l admin doit pouvoir modifier le contenu de la table...)
Comment faire pour que l'on ne puisse pas lire ce pass ?
Voila voila encore une question ... Damien.
je n'ais jamais utilisé webdev pour du php mais ce que tu dis est pour le moins étonnant. Si c'est du code serveur, cela devrait être du script php et donc invisible une fois la page générée ????. C'est sûr que si le password est déclaré ds le source de ta page, c'est pire que tout ! Et il n'y a pas de fatalité à mettre le pass en dur dans le code comme tu dis; cela me parâit meme la dernière chose à faire. Utilise un .ini que tu vas lire pour stocker ces users/mots de passe.
Autre truc aussi, essaie avec les fn crypte/decrypte mais je ne sais pas si cela est opérationnel en mode php.
-- Eric Roumégou Webmaster des wtablettes |
| |
| |
| | | |
|
| | |
| |
Publicado em novembro, 21 2005 - 2:57 PM |
effectivement, d ailleur que ce soit en dur dans la page PHP ou dans un .ini sur le serveur ne change pas grand chose ... Et meme si on crypte le.ini, le mot de pass de cryptage sera forcement dans la page PHP, he he on tourne en rond (meme remarque avec un repertoire avec acces limite).
J ai mis tous les pass dans des procedures globales, elles ne devraient donc pas etre accessibles depuis le web (pas de clic droit source sur la page je veux dire), mais bon .... |
| |
| |
| | | |
|
| | |
| |
Publicado em novembro, 21 2005 - 3:03 PM |
Bonjour
C'est effectivement en dur dans la page PHP et c'est pas top. Je cherche qq chose pour cacher les parametres de la connexion, et donc si ce PB est résolu, pensez à moi. Jean-Daniel
Roumegou Eric avait prétendu :
leplaidn a couché sur son écran : Petite MAJ :
En fait j arrive très bien à définir un mot de pass sous MySQL, mais comme je dois utiliser une SQLConnecte sous WebDev (PHP oblige), je doit mettre le pass en dur dans le code... Il suffit donc d'ouvrir la page PHP correspondante pour voir le pass ...
Je peux creer un utilisateur avec peu de privilèges, mais il pourra toujours me mettre le souc dans ma table produit (puisque l admin doit pouvoir modifier le contenu de la table...)
Comment faire pour que l'on ne puisse pas lire ce pass ?
Voila voila encore une question ... Damien.
je n'ais jamais utilisé webdev pour du php mais ce que tu dis est pour le moins étonnant. Si c'est du code serveur, cela devrait être du script php et donc invisible une fois la page générée ????. C'est sûr que si le password est déclaré ds le source de ta page, c'est pire que tout ! Et il n'y a pas de fatalité à mettre le pass en dur dans le code comme tu dis; cela me parâit meme la dernière chose à faire. Utilise un .ini que tu vas lire pour stocker ces users/mots de passe. Autre truc aussi, essaie avec les fn crypte/decrypte mais je ne sais pas si cela est opérationnel en mode php.
-- Ceci est une signature automatique de MesNews. Site : http://www.mesnews.net |
| |
| |
| | | |
|
| | |
| |
Publicado em novembro, 22 2005 - 10:08 AM |
Voila j ai pas mal reflechi, et j en suis arrive a ce principe :
Pour ce qui est de la base MySQL, j ai cree differents utilisateurs avec des acces restreints et des pass (ils ont au max les droits Select, Insert, Update,Delete). J ai cree dans les procedures globales un outils de connexion a la base MySQL, donc avec les pass en dur. Mais ces pass vont se retrouver dans un script php sur le serveur, et seront donc inaccessible aux utilisateurs (a priori)...
Pour ce qui est de la gestion de l'Admin sur mon site : J utilise une table User dans MySQL (la mienne, pas celle de "mysql") avec les utilisateurs et leurs droits. Une page d acceuil speciale Admin (nommée PageAcceuilAdmin) peut etre lancée directement depuis le naviguateur. Elle demande un login et un pass. Sur validation des infos (apres interrogation de la table user), elle cree un cookie ou j enregistre en crypté le login et pass. Pour crypté cela j utilise un mot de pass formé de l utilisateur local (via sysenvironnement) et de l adresse MAC, le cookie n est donc valide que pour la machine locale avec ce login.
A l ouverture des pages suivantes de mon site je test la presence de ce cookie, si il est present je le decrypte avec le login Windows et l adresse MAC et je verifie la validite du Pass et Login avec la table User, si c bon la page est lancée en mode Admin, sinon en mode normal. Il reste juste a gerer la suppression du cookie pour pouvoir sortir du mode Admin.
Bon voila pour ce qui est du principe. Dans la realite c est un peu plus compliqué : Les fonctions WebDev de cryptage ne fonctionnent pas en PHP, il va donc falloir que je regarde si on peut le faire en code PHP (en vrai PHP je veux dire). De plus je vais devoir crée une fonction pour me retourner l adresse MAC. Le principe : il faudra lancer un IpConfig /All et recuperer l' "Adresse physique" (via un traitement de texte par ex). Malheureusement on ne peut utiliser la fonction LanceAppli, il faudra donc encore passer par du code PHP
Voila il me reste un minimum de boulo donc, si ca vous interesse (et quand j y serai arrive), je mettrai les bouts de code utile... Damien. |
| |
| |
| | | |
|
| | |
| |
Publicado em novembro, 22 2005 - 11:36 AM |
leplaidn avait écrit le 22/11/2005 :
Voila j ai pas mal reflechi, et j en suis arrive a ce principe :
Pour ce qui est de la base MySQL, j ai cree differents utilisateurs avec des acces restreints et des pass (ils ont au max les droits Select, Insert, Update,Delete). J ai cree dans les procedures globales un outils de connexion a la base MySQL, donc avec les pass en dur. Mais ces pass vont se retrouver dans un script php sur le serveur, et seront donc inaccessible aux utilisateurs (a priori)...
Pour ce qui est de la gestion de l'Admin sur mon site : J utilise une table User dans MySQL (la mienne, pas celle de "mysql") avec les utilisateurs et leurs droits. Une page d acceuil speciale Admin (nommée PageAcceuilAdmin) peut etre lancée directement depuis le naviguateur. Elle demande un login et un pass. Sur validation des infos (apres interrogation de la table user), elle cree un cookie ou j enregistre en crypté le login et pass. Pour crypté cela j utilise un mot de pass formé de l utilisateur local (via sysenvironnement) et de l adresse MAC, le cookie n est donc valide que pour la machine locale avec ce login.
tu n'es pas obligé d'utiliser des cookies, une variable booleenne b_admin à 1 suffit. le +gros est de cacher les code d'accés. le code php est invisible en principe. cela dit si tu as une erreur dans ta page tu te retrouve avec le code à l'écran!!!
A l ouverture des pages suivantes de mon site je test la presence de ce cookie, si il est present je le decrypte avec le login Windows et l adresse MAC et je verifie la validite du Pass et Login avec la table User, si c bon la page est lancée en mode Admin, sinon en mode normal. Il reste juste a gerer la suppression du cookie pour pouvoir sortir du mode Admin.
Bon voila pour ce qui est du principe. Dans la realite c est un peu plus compliqué : Les fonctions WebDev de cryptage ne fonctionnent pas en PHP, il va donc falloir que je regarde si on peut le faire en code PHP (en vrai PHP je veux dire). De plus je vais devoir crée une fonction pour me retourner l adresse MAC. Le principe : il faudra lancer un IpConfig /All et recuperer l' "Adresse physique" (via un traitement de texte par ex). Malheureusement on ne peut utiliser la fonction LanceAppli, il faudra donc encore passer par du code PHP
Voila il me reste un minimum de boulo donc, si ca vous interesse (et quand j y serai arrive), je mettrai les bouts de code utile... Damien.
-- Ceci est une signature automatique de MesNews. Site : http://www.mesnews.net |
| |
| |
| | | |
|
| | |
| |
Publicado em novembro, 22 2005 - 12:01 PM |
une page interessante: http://www.siteduzero.com/php/annexes/htaccess.php
Dans son message précédent, leplaidn a écrit :
Voila j ai pas mal reflechi, et j en suis arrive a ce principe :
Pour ce qui est de la base MySQL, j ai cree differents utilisateurs avec des acces restreints et des pass (ils ont au max les droits Select, Insert, Update,Delete). J ai cree dans les procedures globales un outils de connexion a la base MySQL, donc avec les pass en dur. Mais ces pass vont se retrouver dans un script php sur le serveur, et seront donc inaccessible aux utilisateurs (a priori)...
Pour ce qui est de la gestion de l'Admin sur mon site : J utilise une table User dans MySQL (la mienne, pas celle de "mysql") avec les utilisateurs et leurs droits. Une page d acceuil speciale Admin (nommée PageAcceuilAdmin) peut etre lancée directement depuis le naviguateur. Elle demande un login et un pass. Sur validation des infos (apres interrogation de la table user), elle cree un cookie ou j enregistre en crypté le login et pass. Pour crypté cela j utilise un mot de pass formé de l utilisateur local (via sysenvironnement) et de l adresse MAC, le cookie n est donc valide que pour la machine locale avec ce login.
A l ouverture des pages suivantes de mon site je test la presence de ce cookie, si il est present je le decrypte avec le login Windows et l adresse MAC et je verifie la validite du Pass et Login avec la table User, si c bon la page est lancée en mode Admin, sinon en mode normal. Il reste juste a gerer la suppression du cookie pour pouvoir sortir du mode Admin.
Bon voila pour ce qui est du principe. Dans la realite c est un peu plus compliqué : Les fonctions WebDev de cryptage ne fonctionnent pas en PHP, il va donc falloir que je regarde si on peut le faire en code PHP (en vrai PHP je veux dire). De plus je vais devoir crée une fonction pour me retourner l adresse MAC. Le principe : il faudra lancer un IpConfig /All et recuperer l' "Adresse physique" (via un traitement de texte par ex). Malheureusement on ne peut utiliser la fonction LanceAppli, il faudra donc encore passer par du code PHP
Voila il me reste un minimum de boulo donc, si ca vous interesse (et quand j y serai arrive), je mettrai les bouts de code utile... Damien.
-- Ceci est une signature automatique de MesNews. Site : http://www.mesnews.net |
| |
| |
| | | |
|
| | |
| |
Publicado em novembro, 22 2005 - 12:18 PM |
Et bien justement tu soulèves un lièvre ....
J ai eu plusieurs problemes à utiliser une variable globale bAdmin... La variable est d'abord initialisée lors du code de 1er ouverture de PageAcceuilAdmin a false, puis lors de la validation du login et pass (donc false ou true suivant le cas, en code serveur).
J ai pu remarque qu en code naviguateur je recuperais tjrs la bonne valeur. Mais lorsque je passe par un bouton qui envoyait la valeur des champs au serveur (ou execute le code serveur), il considerait toujours bAdmin à False (si tu peux m expliquer ca !).
J ai donc rusé en mettant le test dans le code naviguateur du bouton, et suivant le cas je lance le code serveur de tel ou tel bouton...
Donc pour ouvrir mes pages admins, j ai trois solutions : 1) Soit je cree des pages speciales Admins, et dans le code serveur d'un bouton je lance une page version normale, dans l autre je lance une page version admin. Mais dans ce cas rien n empeche a qqun de taper en dur l url de la page admin et donc d y avoir acces (puisqu il n y a plus de test après ...). Encore faut il connaitre l adresse de la page tu me diras ... Soit !
2) j utilise un parametre pour passer a ma page, par exemple le boolen bLocAdmin. Donc sur un bouton je lance en code serveur PageAffiche(PageProduit,False), sur l autre PageAffiche(PageProduit,True), où True -> mode Admin et PageProduit la page a gerer en mode admin ou normal. Là j ai rencontre deux problème : il passe le parametre dans l url (du genre ?ph=1 ou ?ph=0), il suffit donc de le changer pour avoir le mode admin ! De plus sur clic d un bouton avec code serveur, il perd la valeur du parametre bLocAdmin de la page, et considere alors qu il est a False ! Bizarre ! Du coup je me retrouve en mode normal... A noter je definie le parametre comme ceci : PROCEDURE PageAffiche(bLocAdmin est booléen) -> je ne mets pas de valeur par défo ! (car en général lors d'une reinitialisation il reprend la valeur par défo).
3) j utilise une variable globale définie au début du projet (code serveur initialisation). Curieusement la valeur de cette variable n est jamais conservée, je ne m y suis donc pas fié !
Voila donc tous ceci explique pourquoi je passe par un bon vieux cookie (crypté), qui sera teste a l ouverture de chaque page ! Ceci me semble etre la solution la plus fiable (et la plus sur!). Je viens de finir les procedures de cryptage, j ai en fait utilise des fonctions MySQL (AES_Encrypte) qui marchent tres bien .... |
| |
| |
| | | |
|
| | |
| |
Publicado em novembro, 22 2005 - 4:36 PM |
Ca y est j ai pas mal avance, il ne me reste que la fonction GetMACAdresse a faire...
voila le code et le principe pour ceux que ca interesse (à declarer en code serveur) : *** Fonctions de Gestion du Cryptage 1) GetMacAdresse
FUNCTION GetMacAdress()
RENVOYER "MacAdresse"
et oui elle reste a faire
2) CléCryptage
FUNCTION CléCryptage()
sLogin est une chaîne sLogin = SysEnvironnement("COMPUTERNAME") sLogin = ExtraitChaîne(sLogin, 2, "=")
RENVOYER (GetMacAdress()+sLogin)
A noter que j ai essaye USERNAME a la place de COMPUTERNAME, mais cela ne donnait rien. Donc avec CléCryptage on obtient (dra) un pass pour le cryptage, détermine par la machine locale.
3) CryptageMySQL
FUNCTION CryptageMySQL(sChaine est une chaîne) //Necessite MySQL 4.01 minimum (je crois) sClé,sSql,sChaineCrypte sont des chaînes
sClé=CléCryptage() sSql= "Select AES_ENCRYPT('"+sChaine+"','"+sClé+"')"
SQLExecute(ssql,"Req",True,False) SQLPremier("Req")
sChaineCrypte=SQLCol("Req",1) SQLDéconnecte()
RENVOYER sChaineCrypte
On utilise les fonctions de cryptage de la base MySQL. A Noter, la fonction SQLExecute n est en fait qu une connexion a la base, puis un sqlexec ... (le premier True pour lancer la connexion avec l utilisateur Admin, le deuxieme False pour ne pas se deconnecter apres).
4) DecryptageMySQL
FUNCTION DeCryptageMySQL(sChaine est une chaîne) //Necessite MySQL 4.01 minimum (je crois) sClé,sSql,sChaineDeCrypte sont des chaînes
sClé=CléCryptage() sSql= "Select AES_DECRYPT('"+sChaine+"','"+sClé+"')" SQLExecute(ssql,"Req",True,False) SQLPremier("Req")
sChaineDeCrypte=SQLCol("Req",1) SQLDéconnecte()
RENVOYER sChaineDeCrypte
La même chose mais dans l autre sens. voila nous avons tous le necessaire pour creer nos cookies ...
*** Fonctions de gestion des Cookies : 1) EcritCookie
PROCEDURE EcritCookie(sLogin est une chaîne,sPass est une chaîne) sChaineCryptée, sSql est une chaîne
sSql=sLogin+"@"+sPass sChaineCryptée=CryptageMySQL(ssql) CookieEcrit("BlurpBretagne_456",sChaineCryptée)
Permet de rentrer le login et le pass en crypté dans un cookie.
2)AdminCookieValide
FUNCTION AdminCookieValide() sSql est une chaîne sLogin, sPass sont des chaînes bValide est un booléen=False sChaine,sChaineClair est une chaîne
sChaine=CookieLit("BlurpBretagne_456") sChaineClair=DeCryptageMySQL(sChaine) slogin=SansEspace(ExtraitChaîne(sChaineClair,1,"@")) sPass=SansEspace(ExtraitChaîne(sChaineClair,2,"@"))
sSql="Select Droit From User Where NomUser = '"+sLogin+"' AND Pass = '"+sPass+"'"
SQLExecute(ssql,"Req",True,False) SQLPremier("Req") IF NOT SQL.EnDehors THEN IF SQLCol("Req",1)=1 THEN bValide=True END
RENVOYER bvalide
Cette fonction extrait le pass et le login du cookie, et regarde si le login a les droits administrateur dans la base MySQL.
*** Principe d'utilisation Je pense que vous avez compris : Pour toutes les pages, on creer une variable globale bAdmin (booleen), que l on initialiste à bAdmin=AdminCookieValide(). On fait alors les traitements relatifs a la page et bAdmin. On peut egalement mettre un bouton "Sortir du mode admin", qui execute en code serveur : EcritCookie("","") ; pageatualise(<la page en cours>);
Pour s'enregistrer en mode admin, il suffit de creer une pageAdmin, avec une variable globale bAdmin, un champ de saisie Login et Pass, et un boutonValidation. Dans l'initialisation on ecrit : bAdmin=AdminCookieValide(), avec diverses tests sur les valeurs de bAdmin (par ex si bAdmin alors on rend invisible login et pass qui ne servent plus). Dans le code de 1er lancement, on peut mettre par ex bAdmin=False et EcritCookie("","") pour forcer l entrée en mode non admin. Sur validation, on test les valeurs de login et pass, si elles sont correctes on execute le code suivant (attention le passage par des chaines est important!) :
sSql est une chaîne sLogin est une chaîne=Login..Valeur sPass est une chaîne=Pass..Valeur bAdmin=False sSql="Select Droit From User Where NomUser='"+sLogin+"' AND Pass='"+sPass+"'" SQLExecute(sSql,"Req",True,False) SQLPremier("Req") IF NOT SQL.EnDehors THEN IF SQLCol("Req",1)=1 THEN bAdmin=True EcritCookie(sLogin,sPass) END END
Login="" Pass="" IF NOT bAdmin THEN Info("Mauvais Login ou mauvais Pass, recommencez.") EcritCookie("","") ELSE ModeAdmin..Visible=True GestionPass..Visible=False END
Voila vous savez tout (he he ca m a pris la journee pour un pti truc comme ca, he beh on est pas rendu !) Damien.
(Ps : si un gentille ame a pu faire l adresse MAC en PHP, ca serait genial... je vais quand meme chercher sous google voir !) |
| |
| |
| | | |
|
| | | | |
| | |
|