Hur hindrar man användare på MySQL att se vissa tabeller?

Permalänk

Hur hindrar man användare på MySQL att se vissa tabeller?

Hej!

Detta är en enkel fråga, men jag hittar inget svar. Om jag har en användare som är icke-admin på min MySQL server. Jag vill att denna användare skall endast kunna se vissa tabeller när användaren kör kommandot:

SHOW TABLES;

Med detta kommandå så visas alla tabeller i ett schema som man har anslutit till. Jag vill hindra vissa användare att schemat ska inte ens synas för vissa användare.

Hur kan jag få denna möjlighet att bli verklig i min MySQL databas?

Permalänk
Vila i frid

https://dev.mysql.com/doc/refman/8.0/en/roles.html

Enklast/säkrast är nog att enbart tillåta åtkomst till DB'n via Stored Procedures så att medskickade argument kan "tvättas".

Permalänk
Medlem

Är det viktigt att användaren inte kan se tabellen? Det är ju tämligen trivialt att endast ge en användaren läs eller skrivrättigheter till specifika tabeller. Men minns ej om dom blir dolda.

Skickades från m.sweclockers.com

Permalänk

@petabyte:

Det är viktigt att det måste vara dolt. Jag har byggt ett program som scannar dessa tabeller och varje användare ska ha rätt att skanna vissa tabeller.

Permalänk
Medlem

@heretic16: Jag är lite osäker på ditt svar, är det viktigt att användaren inte ser att tabellen finns överhuvudtaget, eller räcker det med att dom ser namnet på tabellen, men inte innehållet i den?
Om det är viktigt att användaren inte ser tabellen alls så skulle jag snarare råda dig att göra en omdesign av din applikation.

Permalänk
Skrivet av Xcorp:

@heretic16: Jag är lite osäker på ditt svar, är det viktigt att användaren inte ser att tabellen finns överhuvudtaget, eller räcker det med att dom ser namnet på tabellen, men inte innehållet i den?
Om det är viktigt att användaren inte ser tabellen alls så skulle jag snarare råda dig att göra en omdesign av din applikation.

Om det inte går att dölja en tabell, men det går att dölja innehållet t.ex. att tabellen uppfattas som tom när man läser från den. Då kan jag acceptera detta.

Huvudsaken är att man kan hindra användare skriva och läsa till tabellen. Viktigaste är att hindra att skriva. Läsa vill jag helst inte heller att användarna ska göra.

Det är ingen känslig data, det är ett bokningssystem och då vill jag att admin ska kunna se vad andra har bokat i en CRUD server.

Permalänk
Medlem
Skrivet av heretic16:

Om det inte går att dölja en tabell, men det går att dölja innehållet t.ex. att tabellen uppfattas som tom när man läser från den. Då kan jag acceptera detta.

Huvudsaken är att man kan hindra användare skriva och läsa till tabellen. Viktigaste är att hindra att skriva. Läsa vill jag helst inte heller att användarna ska göra.

Det är ingen känslig data, det är ett bokningssystem och då vill jag att admin ska kunna se vad andra har bokat i en CRUD server.

Titta på MySQL GRANTS, om jag inte minns helt fel så får du permission denied eller liknande om du försöker läsa från en tabell du inte har access till.

Men ett tips är att sköta all form av rättigheter för slutanvändare i applikationen, och inte låta varje användare ha ett eget databas-konto, om dom nu inte ska in i databasen och pilla direkt, vilket också är en dålig idé

Permalänk

@Xcorp:

Jag har tänkt att varje användare ska ha en egen användare, precis som outlook.
Men då kan jag blockera att läsa antar jag?

Permalänk
Medlem

@heretic16: Som sagt ingenting jag rekommenderar, men jag då kör du något i stil med
GRANT SELECT,INSERT,UPDATE,DELETE ON database.table TO user@HOST

Permalänk
Skrivet av heretic16:

Hej!

Detta är en enkel fråga, men jag hittar inget svar. Om jag har en användare som är icke-admin på min MySQL server. Jag vill att denna användare skall endast kunna se vissa tabeller när användaren kör kommandot:

SHOW TABLES;

Med detta kommandå så visas alla tabeller i ett schema som man har anslutit till. Jag vill hindra vissa användare att schemat ska inte ens synas för vissa användare.

Hur kan jag få denna möjlighet att bli verklig i min MySQL databas?

Ett alternativ är att kolla kommandot VIEW. Då bestämmer du vilka tabeller en användare ska se. Du kan dela ut samma VIEW till flera användare och kan även ha flera olika.
Varför du vill att användare ska använda kommandot SHOW TABLES förstår jag inte. Det kommandot gör precis det den ska och att då lägga på begränsningar för vissa användare kan orsaka fel även för personer som ska ha fulla rättigheter.

//Freezer

Visa signatur

Cooler Master Silencio S600, MSI x99A SLI Plus, i7-5820, Hyper 212 Evo, Geforce GTX 770, 16 GB Corsair Vengeance, Corsair P600 1024GB, HDD *8, EVGA G2 750W, Windows 10 Pro 64bit.
Dell Latitude 5490, Win 11 Pro 64bit. Synology DS413j.
*Citera om du vill ha svar*

Permalänk
Medlem
Skrivet av heretic16:

Hej!

Detta är en enkel fråga, men jag hittar inget svar. Om jag har en användare som är icke-admin på min MySQL server. Jag vill att denna användare skall endast kunna se vissa tabeller när användaren kör kommandot:

SHOW TABLES;

Med detta kommandå så visas alla tabeller i ett schema som man har anslutit till. Jag vill hindra vissa användare att schemat ska inte ens synas för vissa användare.

Hur kan jag få denna möjlighet att bli verklig i min MySQL databas?

Normalanvändaren borde liksom inte ens ha ett behöv av att manuellt skriva någon SQL-fråga överhuvudtaget i frontend, utan bara använda formulär för att navigera lägga till/ta bort/uppdatera data.
Personligen skulle jag aldrig låta en användare jobba direkt mot en databas eller kunna köra egna SQL-kommandon via frontend utan de skulle få gå genom ett frontend som kontrollerar, normaliserar etc all data av säkerhetsskäl.

Om jag fattar rätt nu ska du skapa en frontend som kommer åt ett specifikt schema, jag antar då också att du kommer använda någon form av inloggning från frontend.
Det enklaste vore väl att skapa en (eller flera) tabeller i schemat som håller ordning på användarna och deras olika roller.

Med en enkel tabell skulle du ju t.ex. kunna använda fälten unikt_id, inloggningsnamn, losenord, behorighet och admin, (jag skulle inte ha gjort det riktigt så enkelt men men bara så du förstår hur jag tänker här).
Använd fältet behorighet till t.ex en komma-separerad lista där admin angett vilka tabeller den inloggade användaren ska få tillgång till, läs ut den listan till en array i frontenden och lista bara tabellerna den inloggade användaren kan behöva växla mellan där.

Gör ett separat gränssnitt för admin där CRUD och möjlighet att administrera användare etc finns.

Visa signatur

Asus C6H | R9-3900XT | 4x8GB G-Skill Ripjaws V 3600@3466 CL14 | Asus Radeon RX 580 8GB Strix Gaming OC | Asus Strix Raid DLX | Corsair Obsidian 750D AE

Permalänk
Skrivet av Xcorp:

@heretic16: Som sagt ingenting jag rekommenderar, men jag då kör du något i stil med
GRANT SELECT,INSERT,UPDATE,DELETE ON database.table TO user@HOST

Varför inte?

Skrivet av Freezer64Pro:

Ett alternativ är att kolla kommandot VIEW. Då bestämmer du vilka tabeller en användare ska se. Du kan dela ut samma VIEW till flera användare och kan även ha flera olika.
Varför du vill att användare ska använda kommandot SHOW TABLES förstår jag inte. Det kommandot gör precis det den ska och att då lägga på begränsningar för vissa användare kan orsaka fel även för personer som ska ha fulla rättigheter.

//Freezer

Jag använder JDBC för att varje användare ska kunna läsa en databas. Att dem skulle dela på en användare går inte i detta fall.

Skrivet av Johan_G3:

Normalanvändaren borde liksom inte ens ha ett behöv av att manuellt skriva någon SQL-fråga överhuvudtaget i frontend, utan bara använda formulär för att navigera lägga till/ta bort/uppdatera data.
Personligen skulle jag aldrig låta en användare jobba direkt mot en databas eller kunna köra egna SQL-kommandon via frontend utan de skulle få gå genom ett frontend som kontrollerar, normaliserar etc all data av säkerhetsskäl.

Om jag fattar rätt nu ska du skapa en frontend som kommer åt ett specifikt schema, jag antar då också att du kommer använda någon form av inloggning från frontend.
Det enklaste vore väl att skapa en (eller flera) tabeller i schemat som håller ordning på användarna och deras olika roller.

Med en enkel tabell skulle du ju t.ex. kunna använda fälten unikt_id, inloggningsnamn, losenord, behorighet och admin, (jag skulle inte ha gjort det riktigt så enkelt men men bara så du förstår hur jag tänker här).
Använd fältet behorighet till t.ex en komma-separerad lista där admin angett vilka tabeller den inloggade användaren ska få tillgång till, läs ut den listan till en array i frontenden och lista bara tabellerna den inloggade användaren kan behöva växla mellan där.

Gör ett separat gränssnitt för admin där CRUD och möjlighet att administrera användare etc finns.

Jag låter JDBC tala med databasen.

Jag ska skapa en "frontend", vad det nu betyder. För mig betyder det en inloggningsfunktion.

Problemet är att om man ska ha en tabell med användare så måste även lösenord stå där. Jag skulle aldrig låta lösenord stå i en databas. Lösenordet ska vara hashkodat.

Permalänk
Medlem
Skrivet av heretic16:

Varför inte?

Jag använder JDBC för att varje användare ska kunna läsa en databas. Att dem skulle dela på en användare går inte i detta fall.

Jag låter JDBC tala med databasen.

Jag ska skapa en "frontend", vad det nu betyder. För mig betyder det en inloggningsfunktion.

Problemet är att om man ska ha en tabell med användare så måste även lösenord stå där. Jag skulle aldrig låta lösenord stå i en databas. Lösenordet ska vara hashkodat.

Läs "frontend" som användargränssnitt.
Lösenordet behöver du ha någonstans oavsett om du använder en tabellfält i databasen eller inte.
Självklart ska det vara en hash, jag hoppas att du inte uppfattade som att lösenordet skulle vara i klartext?

Det viktiga är egentligen inte hur inloggningen sker, det viktiga är att den som använder gränssnittet (inte admin eller DB-ansvarig nu) inte ska kunna skriva in egna SQL-kommandon, som t.ex. show tables; och det var egentligen den möjligheten jag reagerade över, då skulle ju användaren lika gärna kunna ansluta över SSH direkt till databasen med mysql -u användarnamn -p.

Det verkar som om du skapar en mysql-användare för var och en som ska använda bokningssystemet.
@Xcorp skrev "Men ett tips är att sköta all form av rättigheter för slutanvändare i applikationen, och inte låta varje användare ha ett eget databas-konto, om dom nu inte ska in i databasen och pilla direkt, vilket också är en dålig idé"
Jag håller med Xcorp helt här, det finns bättre sätt.

Visa signatur

Asus C6H | R9-3900XT | 4x8GB G-Skill Ripjaws V 3600@3466 CL14 | Asus Radeon RX 580 8GB Strix Gaming OC | Asus Strix Raid DLX | Corsair Obsidian 750D AE

Permalänk
Medlem

Kan bara hålla med de andra här som klart och tydlig påtalat att din design är trasig. Gör om gör rätt helt enkelt. Det du håller på med är som att varje användare på sweclockers skulle ha en egen användare i databasen för att kunna läsa och skriva sina inlägg. Så är det inte kan jag garantera dig. Så titta på hur andra löser liknande saker så att du lär dig rätt från början istället för att göra fel och sedan försöka lappa och laga för att få till något som kanske fungerar.

Permalänk

Menar ni "connection pooling"?

Skickades från m.sweclockers.com

Permalänk
Skrivet av heretic16:

Måste fråga efter att ha läst igenom de svar du har gett på våra svar.
Har du överhuvudtaget använt Boyce-Codds normalform på din databas?
För har du det borde det inte vara några bekymmer att använda en View i det grafiska användargränssnittet du ska använda.
Alla användare använder samma databas men med olika inloggningar och självklart med olika rättigheter.

Ett tips om du inte redan har gjort det är att läsa på om databaser, exempelvis http://databasteknik.se/webbkursen/. Har själv använt boken när jag har byggt enklare databaser.
Ta inte detta på fel sätt, men jag får en liten vibb om att du inte vet vad gör.

//Freezer

Visa signatur

Cooler Master Silencio S600, MSI x99A SLI Plus, i7-5820, Hyper 212 Evo, Geforce GTX 770, 16 GB Corsair Vengeance, Corsair P600 1024GB, HDD *8, EVGA G2 750W, Windows 10 Pro 64bit.
Dell Latitude 5490, Win 11 Pro 64bit. Synology DS413j.
*Citera om du vill ha svar*

Permalänk
Medlem
Skrivet av heretic16:

Menar ni "connection pooling"?

Skickades från m.sweclockers.com

Nej, Connection Pooling handlar om något annat, Connection Pooling handlar om hur MySQL (eller annan SQL-server) ska hantera när det blir riktigt många samtidiga anslutningar, eftersom varje enskild anslutning/inloggning kostar på relativt mycket. Initialt just nu behöver du nog inte fundera på de delarna.

Det första jag reagerade på med ett stort No no no, är att du verkar vilja att användarna ( i ditt första inlägg) ska kunna skicka SQL-kommandon direkt till MySQL-servern, ingen bra idé säkerhetsmässigt.
Det andra som får mig att fundera lite är varför ska den som använder ditt program överhuvudtaget ska kunna se tabellernas namn?
Det tredje, varför ska varje användare att en egen inloggning på SQL-servern om de inte ska arbeta direkt mot SQL-servern?

Jag får ett litet intryck av att du inte är direkt van att jobba mot SQL-servrar på det du skriver, det är helt okay tröttna inte utan fortsätt. Att använda databaser för att lagra och hantera information är bra att lära sig och ett bokningssystem kan vara en bra väg för att lära sig hur det fungerar.

Jag skulle rekommendera dig att gå bort i från datorn ett tag, ta fram papper och penna, dessa i dag så undervärderade verktyg, skriv ner vilken data SQL-servern ska hantera, fundera på hur tabellerna ska se ut för att hantera all data du behöver och rita sedan upp ett flödesdiagram över hur databasen och användargränssnittets olika funktioner ska kunna kommunicera med varandra.

När det är klart och du känner att du vet exakt hur du vill att det ska fungera är det dags att du sätter börja koda.

Visa signatur

Asus C6H | R9-3900XT | 4x8GB G-Skill Ripjaws V 3600@3466 CL14 | Asus Radeon RX 580 8GB Strix Gaming OC | Asus Strix Raid DLX | Corsair Obsidian 750D AE

Permalänk
Medlem

Som flera andra har påpekat här; skilj på användarna av applikationen (slutanvändare) och användare i databasen (även kallat service account eller liknande) Dom har ingenting med varandra att göra överhuvud taget.

Lite beroende på vad du vill uppnå så har du olika vägar att gå, vill du lära dig mer om databaser så finns det mängder på nätet. Om målet är att faktiskt skapa ett bokningsprogram så låter det som att du ska titta på ett abstraktionslager för databasen. För Ruby on Rails titta på Active Record, skriver du i Python så titta på django eller flask (vilket är mer än bara ett abstraktionslager. För PHP har jag ingen större koll, men googla på PHP ORM så hittar du en hel del.

Permalänk
Skrivet av Johan_G3:

Nej, Connection Pooling handlar om något annat, Connection Pooling handlar om hur MySQL (eller annan SQL-server) ska hantera när det blir riktigt många samtidiga anslutningar, eftersom varje enskild anslutning/inloggning kostar på relativt mycket. Initialt just nu behöver du nog inte fundera på de delarna.

Det första jag reagerade på med ett stort No no no, är att du verkar vilja att användarna ( i ditt första inlägg) ska kunna skicka SQL-kommandon direkt till MySQL-servern, ingen bra idé säkerhetsmässigt.
Det andra som får mig att fundera lite är varför ska den som använder ditt program överhuvudtaget ska kunna se tabellernas namn?
Det tredje, varför ska varje användare att en egen inloggning på SQL-servern om de inte ska arbeta direkt mot SQL-servern?

Jag får ett litet intryck av att du inte är direkt van att jobba mot SQL-servrar på det du skriver, det är helt okay tröttna inte utan fortsätt. Att använda databaser för att lagra och hantera information är bra att lära sig och ett bokningssystem kan vara en bra väg för att lära sig hur det fungerar.

Jag skulle rekommendera dig att gå bort i från datorn ett tag, ta fram papper och penna, dessa i dag så undervärderade verktyg, skriv ner vilken data SQL-servern ska hantera, fundera på hur tabellerna ska se ut för att hantera all data du behöver och rita sedan upp ett flödesdiagram över hur databasen och användargränssnittets olika funktioner ska kunna kommunicera med varandra.

När det är klart och du känner att du vet exakt hur du vill att det ska fungera är det dags att du sätter börja koda.

Jag ska göra en CRUD server. Därför ska varje användare kunna redigera datan och lägga till ny rad.

Permalänk
Skrivet av Xcorp:

Som flera andra har påpekat här; skilj på användarna av applikationen (slutanvändare) och användare i databasen (även kallat service account eller liknande) Dom har ingenting med varandra att göra överhuvud taget.

Lite beroende på vad du vill uppnå så har du olika vägar att gå, vill du lära dig mer om databaser så finns det mängder på nätet. Om målet är att faktiskt skapa ett bokningsprogram så låter det som att du ska titta på ett abstraktionslager för databasen. För Ruby on Rails titta på Active Record, skriver du i Python så titta på django eller flask (vilket är mer än bara ett abstraktionslager. För PHP har jag ingen större koll, men googla på PHP ORM så hittar du en hel del.

Jag ska göra en CRUD server. Dessutom ska servern endast för oss på kontoret. Som en liten hobby över fikat vi har byggt ihop.

Jag brukar använda Java Server Faces och PrimeFaces som UI.

Permalänk
Medlem
Skrivet av heretic16:

Jag ska göra en CRUD server. Dessutom ska servern endast för oss på kontoret. Som en liten hobby över fikat vi har byggt ihop.

Jag brukar använda Java Server Faces och PrimeFaces som UI.

Om du nu bara vill ha ett frontend till din databas, varför inte plocka något färdigt?

Permalänk
Medlem
Skrivet av heretic16:

Jag ska göra en CRUD server. Därför ska varje användare kunna redigera datan och lägga till ny rad.

CRUD, Create Read Update och Delete, jo det är fyra grundläggande funktionerna som du ganska enkelt kan ordna, jag såg att du använder JSF, har ingen större erfarenhet av det tog en snabbtitt på det för 5-6 år sedan bara och kör själv mest bara PHP/MySQL (LAMP-servrar) nu för tiden

"insert into", "select * from", "update into" och "delete from" satserna ser ju lite annorlunda ut i språken men det är inga jätteskillnader ändå.

Visa signatur

Asus C6H | R9-3900XT | 4x8GB G-Skill Ripjaws V 3600@3466 CL14 | Asus Radeon RX 580 8GB Strix Gaming OC | Asus Strix Raid DLX | Corsair Obsidian 750D AE

Permalänk
Medlem
Skrivet av heretic16:

Jag ska göra en CRUD server. Dessutom ska servern endast för oss på kontoret. Som en liten hobby över fikat vi har byggt ihop.

Jag brukar använda Java Server Faces och PrimeFaces som UI.

Om du kör ett ui mot användarna så är det väl ändå inte meningen att användarna ska köra sql-uttryck direkt mot databasen? I så fall sker databasanropen av applikationen bakom ditt ui (med en och samma användare mot databasen). Sedan får du hantera användarnas åtkomst till informationen i databasen kodmässigt i applikationen, antingen individuellt eller via grupper eller liknande. Extremt ovanligt att ge användare av en applikation direkt databasåtkomst.

Skickades från m.sweclockers.com

Visa signatur

WS: R7 2700x | RTX 2070S | Corsair AX860W | Lian Li PC-O11 Dynamic
Unraid: R7-2700X | GTX1050 | 3U chassi med 20 diskplatser
Servrar: 3x NUC 10 i5 ESX-kluster