PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WEBDEV 2024 → Gestion Admin : votre experience...
Gestion Admin : votre experience...
Débuté par leplaidn, 21 nov. 2005 09:35 - 10 réponses
Posté le 21 novembre 2005 - 09:35
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.
Posté le 21 novembre 2005 - 10:02
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.
Posté le 21 novembre 2005 - 13:27
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).
Posté le 21 novembre 2005 - 14:02
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
Posté le 21 novembre 2005 - 14:57
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 ....
Posté le 21 novembre 2005 - 15:03
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
Posté le 22 novembre 2005 - 10:08
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.
Posté le 22 novembre 2005 - 11:36
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
Posté le 22 novembre 2005 - 12:01
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
Posté le 22 novembre 2005 - 12:18
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 ....
Posté le 22 novembre 2005 - 16:36
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 !)