Skjul databaser en bruger ikke har rettighed til , ver 4.x
Hi
Vi har på den skole hvor jeg er ansat, to MySQL-servere kørende. Den ene kører ver. 3.x og den anden er opgraderet til 4.x
PhpMyadmin anvendes i begge tilfælde som værktøj til eleverne.
På den ene (3.x) kan en bruger efter login kun se sine egne databaser, men på 4.x'eren kan brugeren se alle db'er. Brugeren kan kun se tabeller og indhold af egne databaser, men vi ville alligevel gerne kunne skjule de andre databaser for brugeren.
Det er nok dine access priviledges du skal kigge på. Jeg kunne ikke helt forstå hvor mange brugerprofiler du bruger. Har du en brugerprofil til version 3.x og en til 4.x?
Ihvertfald kan du når du opretter en bruger angive hvilke databaser, hun skal have adgang til. Ved så at bruge to eller flere brugere, har du fuld kontrol over hvilke databaser de har adgang til.
Det er forskellige brugere på de to MySQL-installationer.
En Nyoprettet bruger Test, på ver. 4.x har nej i flg. priv. i Users: Select Insert Update Delete Create Drop Reload Shutdown Process File Grant References Index Alter
Alligevel kan han se alle databaser, men ikke tabeller og indhold.
user tabellen er global, det vil sige at indstillinger foretaget her virker på alle databaser. Du er derfor nødt til at give en bruger adgang til databaserne i tabellen db. Prøv at kigge i tabellen db i databasen mysql. Her kan du tilføje database-adgangsprivilegier til hver eneste bruger.
Nej, du skal kun oprette poster med databaser du vil give brugeren adgang til. Hvis brugeren kun er i tabellen db én gang, vil han kun have adgang til den ene database der står nævnt! Du skal ikke oprette brugeren i db for de tabeller han slet ikke har adgang til. Tabellen db indeholder adgangsoplysninger til de tabeller han godt må se, og så kan han ikke se andre.
Nu har jeg så oprette en bruger test i tabellen users men flg: Select: N Insert: N Update: N Delete: N Create: N Drop: N Reload: N Shutdown: N Process: N File: N Grant: N References: N Index: N Alter: N
Og i tabellen db findes han slet ikke.
Alligevel kan han fra f.eks. PhPMyAdmin se alle databaserne. Altså kun navnene, ikke indhold, tabeller og struktur.
Så vidt jeg kan se, er det kun på den MySQL-server der kører ver. 4.x det er sådan. På 3.x'eren vises kun den/de databaser der er adgang til
Jeg har fundet en bedre løsning! Har netop siddet og leget med version 3.23.58 og version 4.0. På version 4.0 kan en bruger åbenbart ikke få vist andre databaser end dem han har adgang til. Mens man i version 3.23.58 får vist det hele.
Der findes heldigvis en løsning på problemet.
Lav en fil der hedder my.cnf og læg den i "C:\" eller "C:\Windows-directory" på windows eller "/etc/" på Unix.
I den fil skal du så sætte safe_show_database til On i stedet for Off. Off er nemlig standard, som du kan se, hvis du skriver SHOW VARIABLES.
Om safe_show_database-indstillingen står der i manualen: "Don't show databases for which the user doesn't have any database or table privileges. This can improve security if you are concerned about people being able to see what databases other users have. See also skip_show_database", http://www.mysql.com/doc/en/SHOW_VARIABLES.html
Det er jo helt klart den mulighed vi skal bruge her :o)
Jeg læste lige dit spm. igen. Og fandt ud af, at du faktisk står med det modsatte problem, nemlig at brugeren på 4.x kan se alle databaser, mens brugeren på 3.x kun kan se sine egne. Men ovenstående løsning burde virke for dem begge.
Der ligger i rod-biblioteket til mysql en samling filer der hedder my-medium.cnf, my-small.cnf osv. På min maskine var de "maskeret" som speed-dialers, men ved at gå ind og slette fil-typen cnf i mappeindstillingerne blev det muligt for mig at læse dem. I de filer kan du se eksempler på hvordan du laver din egen my.cnf-fil.
Du kan starte mysql med --skip_show_database Så er der ingen der kan bruge funktionen SHOW DATABASE, og det er måske ikke helt hensigtsmæssigt?! Jeg har ikke selv prøvet den i praksis ...
I øvrigt forstår jeg ikke hvorfor man har valgt at fjerne safe_show_database, da den jo kunne være enormt smart på et webhotel, hvor det jo ikke kommer brugerne ved, hvilke andre brugere der har databaser på samme webhotel. Hverken Azero, DHT eller Cliche har safe_show_database aktiveret. Det er altså muligt at få vist alle databaser på serveren. Men hos MySQL AB mener man ikke at den er nødvendig mere. Muligvis fordi det nu er indbygget i MySQL 4+.
"SHOW DATABASES lists the databases on the MySQL server host. You can also get this list using the mysqlshow command line tool. In version 4.0.2 you will only see those databases for which you have some kind of privilege, if you don't have the global SHOW DATABASES privilege."
Måske er dit problem så, at alle brugere har global SHOW DATABASES privilegier ved oprettelsen. Har du kopieret mysql-databasen fra version 3.x over til version 4.x eller har du oprettet alle brugerne igen på den nye server?
Kig i tabellen users og kontroller at alle brugere ud over root og superbrugere har følgende rettigheder:
Select_priv: N Insert_priv: N Update_priv: N Delete_priv: N Create_priv: N Drop_priv: N Reload_priv: N Shutdown_priv: N Process_priv: N File_priv: N Grant_priv: N References_priv: N Index_priv: N Alter_priv: N Show_db_priv: N Super_priv: N Create_tmp_table_priv: N Lock_tables_priv: N Execute_priv: N Repl_slave_priv: N Repl_client_priv: N
Kort og godt ingen rettigheder. Ingen andre end root og superbrugere skal have Y i nogen af disse. Disse privilegier skal nemlig sættes i tabellen db! db-tabellen sætter disse indstillinger på per-database-niveau og ikke på overordnet niveau.
Din test-bruger du oprettede før så god nok ud, men kig lige om alle de andre også er ok.
Jeg har lige afprøvet min teori. Jeg lavede en bruger, som havde N i alt ovenstående, undtagen Select_priv. Så brugte jeg FLUSH PRIVILEGES og vupti, blev alle databaser vist for brugeren. Det kunne være løsningen på dit problem.
"Den teori du har afprøvet med N til alt, og så flush privileges, er det ikke lige det modsatte?" Hvad mener du med lige det modsatte? Flush privileges tvinger serveren til at genindlæse alle privilegier, hvilket den ellers ville gøre ved opstart.
Jeg tror de felter du nævner tilhører version 4, men jeg er ikke sikker. Hvis du blot har overført mysql databasen fra din gamle data-mappe til din nye datamappe, så findes disse felter selvfølgelig ikke i din version 4.
Men det har du vel heller ikke gjort vel???!
Jeg har prøvet at finde ud af det med --skip_show_database, og selvom de i manualen skriver at man kan bruge den som en ekstra sikkerhed, så nævner de (eller andre) noget om hvor og hvordan det gøres!
Jamen så har den sikkert også gjort det. Det er da bare underligt, når vi har den samme version og på den samme server.
Men der er noget galt, hvis der er brugere, der står anført i tabellen user, med N til alle privilegier, og i tabellen db slet ikke står anført. Sådanne brugere burde slet ikke have mulighed for at se noget som helst.
Det sidste jeg kan komme på er, at reinstallere mysql og dernæst tilføje hver eneste bruger enkeltvis (hvis der ikke er for mange selvfølgelig).
Men for alt i verden ville jeg undgå at bruge den gamle mysql-database (den med user, db, osv.).
Nu er mit lager af viden desværre ved at være udtømt tror jeg.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.