Auteur |
Message |
Jumbot
Forumeur occasionnel
Sexe:
Messages: 15
Localisation: Le Mans
|
Posté le:
Mer 21 Fév 2007 - 12:32 |
|
Bonjour à tous(tes),
Je m'adresse aux développeurs(ses) les plus assidus(es) présents(es) sur le site ^^.
Voila, ma question est très simple (mais impossible de trouver la réponse sur le net):
"Comment faire, en php, pour tester le droit INSERT d'une base de donnée MySQL" ??"
Je précise, que je veux uniquement TESTER !! Il ne s'agit donc pas, d'insérer une valeure, mais uniquement de savoir si j'ai le DROIT de le faire !!
Merci de vos futures réponses
Jumbot |
_________________ Il ne faut pas prendre les gens pour des cons, mais il ne faut pas oublier qu'ils le sont ! |
|
|
|
N'oubliez pas de vous inscrire à la communauté pour participer. Si vous êtes déjà membre, connectez-vous pour faire disparaître ce bandeau publicitaire. |
al3x
Forumeur fréquent
Sexe:
Messages: 74
|
Posté le:
Mer 21 Fév 2007 - 14:04 |
|
Hum as tu le droit de faire un INSERT dans une table et ensuite de vérifier si dans la table concernée il y a la valeur que tu ajoutée ?
Tu pourrais expliquer pourquoi, çà aiderait je pense |
|
|
|
|
Jumbot
Forumeur occasionnel
Sexe:
Messages: 15
Localisation: Le Mans
|
Posté le:
Mer 21 Fév 2007 - 14:24 |
|
Bonjour,
Merci de ta réponse rapide mais ça n'est pas ça mon problème.
Je vais expliquer un peu plus l'objectif de ma question.
Tout le monde ici sait qu'il y a une compétence a couvrir qui est la C37 : Administrer une base de donnée.
Pour couvrir cette compétence, je suis en train de développer (mais je ne suis pas développeur ^^) un portail de gestion (intranet) pour une association.
Dans cette association il y a plusieurs membres actifs (président, secrétaire etc....) et tous n'auront pas les mêmes droits. Certains pourront "SELECT" telles ou telles tables et d'autre pourront "INSERT" ou "UPDATE".
J'ai donc commencé à développer mon portail. Il se présente comme suit :
On se connecte (avec un nom d'utilisateur validée par la BDD) puis, si la connection est acceptée, on arrive à une page avec un panel d'icone servant à administrer les différents modules.
J'ai déjà réussi à afficher/cacher (selon les droits de SELECT) les différentes icones en fonction des droits d'utilisateur.
Lorsque l'utilisateur clique sur l'un des icones, il a ensuite trois choix:
- Consulter
- Ajouter
- Modifier
Pour la consultation c'est facile, si la fonction mysql_query retourne FALSE, c'est que l'utilisateur n'a pas le droit de consultation, donc on affiche pas le lien "Consultation". En revanche, pour l'ajout ou la modification, c'est bien plus compliqué !!
En effet, avec la fonction mysql_query(INSERT INTO 'table' values (...) ), si la fonction retourne TRUE, alors l'insertion est effectué !!!!! MAIS JE NE LE VEUX PAS DANS UN PREMIER TEMPS, puisque je cherche juste a savoir si l'utilisateur aura le droit d'écriture ou non pour afficher/cacher les rubriques "Ajouter" ou "Modifier".
Donc, voila mon problème, il faut que je trouve une autre fonction que mysql_query qui me permettrait uniquement de tester le INSERT ou le UPDATE !!!!
J'ai vraiment besoin de ça, car sinon je ne vois absolument pas comment couvrir la compétence C37 par rapport aux droits d'utilisateurs !
Merci de vos futures réponses
Jumbot |
_________________ Il ne faut pas prendre les gens pour des cons, mais il ne faut pas oublier qu'ils le sont ! |
|
|
|
Vincent
Webmaster
Sexe:
Messages: 5584
Localisation: Montpellier
|
Posté le:
Mer 21 Fév 2007 - 14:24 |
|
Non en fait il veut juste vérifier qu'il a les droits pour faire l'INSERT, mais sans effectuer celui-ci.
Pour vérifier ca, il faut vérifier les droits de l'utilisateur dans la base MYSQL (la base de données qui gère les autres bases et notamment les droits).
Regardes ici :
http://dev.mysql.com/doc/refman/5.0/fr/privileges-provided.html
En gros faut vérifie que ton utilisateur dispose bien des droits INSERT sur la base souhaitée. |
_________________ Hey les amis, pensez à suivre @webig sur Twitter, et pourquoi pas me suivre moi @cybervince |
|
|
|
Jumbot
Forumeur occasionnel
Sexe:
Messages: 15
Localisation: Le Mans
|
Posté le:
Mer 21 Fév 2007 - 14:27 |
|
Bonjour,
Merci Vincent, tu as tout à fait compris ce que je voulais faire !!!!!
Je regarde le lien, et je vous tiens au courant de mes tests !!!
Encore merci
Jumbot. |
_________________ Il ne faut pas prendre les gens pour des cons, mais il ne faut pas oublier qu'ils le sont ! |
|
|
|
Jumbot
Forumeur occasionnel
Sexe:
Messages: 15
Localisation: Le Mans
|
Posté le:
Mer 21 Fév 2007 - 17:51 |
|
Bonjour,
Et bien merci à Vincent, qui m'a bien aidé sur ce coup là
Ce que je voulais faire commence à avoir de l'allure, je pense qu'à ce rythme la j'aurais fini mon portail dans 2 à 3 semaines
Mon problème est donc résolu, encore merci et @ bientôt !
Jumbot |
_________________ Il ne faut pas prendre les gens pour des cons, mais il ne faut pas oublier qu'ils le sont ! |
|
|
|
al3x
Forumeur fréquent
Sexe:
Messages: 74
|
Posté le:
Mer 21 Fév 2007 - 19:06 |
|
Si j'ai bien compris (je viens de me réveiller d'une sieste de 3heures alors dsl mdr), tu veux savoir :
user : Admin => Ecrire / Lecture
user : Secrétaire => Lecture
user : ?? => ?? / ??
C'est bien çà ?
Alors pourquoi ne pas les identifier par un id tout simplement. Sur ton panneau de configuration, tu met un switch ou une condition toute bete qui balance selon les droits vers une page ou une autre. Pour que ce soit plus secure, tu peux utiliser les sessions, ou les cookie.
Comme çà, pas besoin de requete SQL.
Bien sur, ma solution n'est efficasse que SI tu as le choix, car apparament, le C37 est une forme de certification (ouais dsl je ne suis encore qu'au lycée ) et donc tu n'auras peut etre pas le choix, quel bande de tiran les profs |
|
|
|
|
Mingain
Accro à Web-IG
Sexe:
Messages: 185
Localisation: Nîmes
|
Posté le:
Lun 05 Mar 2007 - 12:33 |
|
Code: |
$requete = "INSERT ... nanani nanana";
$query = mysql_query($requete);
if($query) echo"Tu as les droits - la requete fonctionne";
else echo"Tu n'as pas les droits - la requete ne fonctionne pas";
|
Si tu pouvais plus éclairer sur ce problème de "droit". J'ai du mal à saisir ! |
_________________ www.en-camargue.fr : Tourisme et photos en camargue
www.vauclare.fr : Creation de site Web sur mesure dans le gard |
|
|
|
Vincent
Webmaster
Sexe:
Messages: 5584
Localisation: Montpellier
|
Posté le:
Lun 05 Mar 2007 - 14:46 |
|
Mingain a écrit: |
Code: |
$requete = "INSERT ... nanani nanana";
$query = mysql_query($requete);
if($query) echo"Tu as les droits - la requete fonctionne";
else echo"Tu n'as pas les droits - la requete ne fonctionne pas";
|
|
La c'est pas un problème de droits. Tu exécutes carrément la requête pour savoir si elle ne renvoie pas d'erreur. |
_________________ Hey les amis, pensez à suivre @webig sur Twitter, et pourquoi pas me suivre moi @cybervince |
|
|
|
Jumbot
Forumeur occasionnel
Sexe:
Messages: 15
Localisation: Le Mans
|
Posté le:
Lun 05 Mar 2007 - 22:53 |
|
Bonjour à tous,
Je vois que ce "problème de droit SQL" en intrigue quelques uns ^^.
Ce que dis vincent dans son dernier post est tout à fait juste.
En faisant un "INSERT" et en le testant après, c'est trop tard, puisque si la requete abouti, l'insertion est effectuée.
Hors moi ce que je voulais faire, ou plutot, ce que je suis actuellement en train de développer, c'est la possibilité (en fonction des droits SQL) d'avoir accès ou non à certaines catégories sur un portail.
Je vais expliquer clairement comment je procède.
Les connaisseurs des bases de données savent (et justement moi je l'avais remarqué mais je ne voyais pas son utilité) qu'il y a une base de donnée nommée "mysql" qu'il ne faut ABSOLUMENT PAS SUPPRIMER. Evidemment, puisque c'est elle qui gère les privilèges (SELECT, UPDATE, INSERT ......).
Cette bdd est composé de 6 tables nommées ainsi :
- columns_priv : Alors celle là j'ai pas encore bien compris a quoi elle servait ^^
- func : Celle là non plus je ne sais pas encore à quoi elle sert
- host : Contient les droits que les machines qui se connectent a distance ont sur les bdd
- user : Contient les user / mdp associé et les droits "globaux".
- db : Contient les droits que les utilisateurs ont sur les bdd.
- tables_priv : Contient les droits en fonction de l'utilisateur, de la machine de connection, de la bdd et des tables.
Dans l'ordre dans lesquelles je les ai écrites, vous remarquez tout de suite, que plus on "descends" et plus les droits sont "affinés".
P.S : Si tout celà ne vous semble pas clair, sachez qu'il y a bon nombre d'info de disponible sur le net
Donc, dans mon cas, j'utilise une seule tables : tables_priv (c'est la plus "fine" au niveau des droits).
Dans cette table, il y a un champ appelé (aussi) tables_priv, dans lequel sont stockés les droits que l'utilisateur a, en fonction de la table et de la machine avec laquelle il se connecte. Ce champ peut contenir absolument toutes les fonctions qui sont utilisables sur une base de donnée a savoir SELECT, INSERT, UPDATE, DELETE, GRANT etc......
Chacune d'entres elles n'apparaissent que si l'utilisateur disposent du droit en question. Elles sont séparés par des virgules (lorsque l'user a plusieurs droits) comme je l'ai indiqué plus haut.
Voici un exemple d'une fonction que j'utilise pour savoir si mon user a le droit ou non de faire tel ou tel chose:
Citation: |
$select_calend = mysql_query ("SELECT * FROM tables_priv WHERE user='president' AND table_name='calendrier' AND table_priv LIKE '%insert%'");
|
Expliquons un peu cette requete qui permet de savoir si l'utilisateur "president" à droit a "l'insertion" sur la table "calendrier":
Ce qu'il faut savoir, c'est que la function "mysql_query" dans le cas d'un SELECT peut renvoyer en tout est pour tout 3 valeures :
- FALSE : La requete n'a pas abouti (pas les droits / erreur de lecture de la base.....)
- Vide : La requete a abouti, mais la sélection demandée n'a rien renvoyé
- données[i] : Un tableau chargé en mémoire dans lequel il y a les données trouvées dans la bdd.
Dans mon cas, c'est assez suptile. Je sais que si la requete renvoie FALSE (ormis les erreurs de connection à la bdd ....) c'est que l'utilisateur n'a pas accès a la table en question.
En revanche, si la requete ne renvoie rien, c'est que l'utilisateur à bel et bien des droits sur la table en question, mais pas à l'INSERT
Enfin, si la requete renvoie des données, c'est que le user a droit a l'INSERT.
Voici donc pour finir un exemple qui parle de lui même pour savoir si oui ou non, mon user president a droit à l'insertion dans le calendrier (c'est en fait un lien qui s'affiche ou non sur la page et qui donne accès lorsque l'on clic dessus à la page calendrier):
Citation: |
$select_calend = mysql_query ("SELECT * FROM tables_priv WHERE user='president' AND table_name='calendrier' AND table_priv LIKE '%insert%'");
if (mysql_fetch_object($select_calend) != '' && $select_calend != FALSE)
{
echo ("Calendrier");
}
|
Voila, bon, c'est surement très "basique" comme raisonnement, mais je rappel que je ne suis pas développeur, et que ca marche !!!
Je n'hésiterai pas a ajouter que la partie que je vous montre ne contient quasiment aucune sécurité, mais que de mon coté mes pages sont très sécurisés (je pense déjà au petit malin qui irait taper directement l'adresse de la page dans la barre d'adresse ^^).
Je rajouterai un grand MERCI à celui qui m'a permis de réaliser (le premier ??) portail qui réagit VRAIMENT en fonction des utilisateurs CONNUS par la base de donnée, ainsi que des VRAIS DROITS SQL a savoir : Vincent
Merci à lui et à vous tous
Jumbot. |
_________________ Il ne faut pas prendre les gens pour des cons, mais il ne faut pas oublier qu'ils le sont ! |
|
|
|
|