Versio

Juiste rechten voor database-gebruiker

Overzicht Reageren

Eddy Erkelens

Eddy Erkelens

01/03/2009 18:57:00
Quote Anchor link
Zoals pgFrank onlangs noemde is het zeer wijs om je website op een 'aparte' database-gebruiker te laten draaien.
Sowieso niet de admin.

Nu heb ik dat ook gedaan, maar zijn dit juist ingestelde rechten?
Ik vermoed zelf van wel, maar wil het wel zeker weten.

http://www.postimage.org/Pqxg2Ti.jpg

De gebruiker (via de website) kan dus alleen:
SELECT, UPDATE, INSERT, DELETE doen.
En daarbij uiteraard de referenties gebruiken (InnoDB).

Maar geen tabellen sluiten, verwijderen, legen of veranderen.
Is dit veilig genoeg?
Is het ook mogelijk dat ze maar 1 rij per query verwijderen/updaten?
SELECT mag uiteraard meer zijn.

En waarom zie ik (DirectAdmin) een MAAK en INSERT?
Dat is toch hetzelfde?
Gewijzigd op 01/01/1970 01:00:00 door Eddy Erkelens
 
PHP hulp

PHP hulp

25/05/2012 02:12:35
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Frank -

Frank -

01/03/2009 19:05:00
Quote Anchor link
Quote:
En waarom zie ik (DirectAdmin) een MAAK en INSERT?
Dat is toch hetzelfde?
Geen idee, ik weet niet welke SQL hier wordt aangemaakt en welke rechten hier nu worden ingetrokken of juist worden toegekend. Zonder deze informatie valt er niet te zeggen of je de juiste rechten hebt of juist niet.

"maak" klinkt mij in de oren als CREATE en dat heeft dus geen betrekking op een INSERT.

Met bovenstaand plaatje in het achterhoofd, zou ik alleen INSERT, SELECT en UPDATE rechten geven. DELETE is voor een superuser, "verwijderen" kun je doen door het aanpassen van de status van een record.

Probeer er altijd voor te zorgen dat een user helemaal niets mag, tenzij JIJ het expliciet hebt toegestaan. Met bovenstaande aanpak is het nog steeds erg generiek, bovenstaande rechten gelden volgens mij voor de complete database en niet voor specifieke tabellen, kolommen, view's en stored procedures. Echte veiligheid krijg je er dus niet mee.

Tip: Probeer zelf je SQL te schrijven voor de GRANT en REVOKE acties, dan weet je precies wat er wordt gedaan.
 
Arjan Kapteijn

Arjan Kapteijn

01/03/2009 19:07:00
Quote Anchor link
Maak is waarschijnlijk de rechten om een database / tabel toe te voegen. En of het zo veilig is, technisch gezien is het pas 'veilig' als je alleen select-rechten toekent, waarbij veilig tussen haakjes staat.
 
Frank -

Frank -

01/03/2009 19:09:00
Quote Anchor link
"waarbij veilig tussen haakjes staat."

Leg eens uit, wat bedoel je daar precies mee?
 
Arjan Kapteijn

Arjan Kapteijn

01/03/2009 19:16:00
Quote Anchor link
Iemand kan nog steeds doormiddel van SQL injecties de SELECT statements aanpassen om zodoende extra informatie op te halen of (foute) inlogsystemen te omzeilen.

Door enkel SELECT statements toe te laten is je applicatie niet per definitie 'veilig'. Vandaar die haakjes :).
 
Frank -

Frank -

01/03/2009 19:26:00
Quote Anchor link
Ah, dat klopt helemaal. Dat zul je moeten voorkomen door correct te (laten) escapen.

Hoewel, door uitsluitend rechten te geven op VIEW's (en stored procedures) en per gebruiker een eigen database user aan te maken, kun je er voor zorgen dat iemand hooguit dingen kan opvragen die hij toch al mag opvragen. Een database is echt perfect dicht te spijkeren alleen heeft men daar veel te vaak geen zin in. SQL injection is dan ook gewoon een keuze, het heeft niks met bugs te maken.
 
Eddy Erkelens

Eddy Erkelens

02/03/2009 20:13:00
Quote Anchor link
Over VIEWs heb ik ook nagedacht, maar heb ik nog geen geschikte toepassing voor kunnen vinden.
De 'MAAK' (als create, dom dat ik dat verschil niet inzag tussen INSERT en CREATE) gaat er dus ook uit.

De gebruikers moeten wel mogen verwijderen, want dat is nu eenmaal de afspraak (disclamer etc, privacy). Maar dan weet ik eigenlijk wel genoeg.

@ PgFrank: jij vraagt welke SQL hier wordt aangemaakt? Je bedoeld welke query? Ik vermoed eigenlijk niet. Maar wat dan?
Ik draai InnoDB via PDO (wat voor mij niet meer is dan even een functie omschakelen).
En is het ook mogelijk om permissies per tabel op te geven?
Of een limiet? (bijvoorbeeld maximaal 1 rij verwijderen per keer)?

Het is inderdaag mogelijk (als een hacker echt wilt) om meer informatie te verkrijgen dan nodig. Dat probleer ik wel zo veel mogelijk te weren (escapen en grondige controle (ook op $_SESSION etc).
 
Frank -

Frank -

02/03/2009 20:27:00
Quote Anchor link
Of je nu innoDB gebruikt of niet, dat maakt voor het instellen van rechten niet uit. Daarbij gaat het om een query met GRANT of REVOKE. Het kan goed zijn dat je die rechten helemaal niet hebt en dat dit dus de reden is dat je uitsluitend een tooltje tot je beschikking krijgt.

PDO heeft er evenmin wat mee te maken, dat is alleen maar een interface tussen PHP en de database. Daar gaat nog steeds dezelfde SQL overheen.

Maximaal 1 rij per keer verwijderen wil je nooit en te nimmer als limiet opgeven, daarmee kun je jezelf een corrupte database bezorgen. Dat is ook de reden dat LIMIT 1 zo'n vervloekte klote toepassing is, want wat moet er gebeuren als er meerdere records aan de voorwaarden voldoen? Lukraak een record verwijderen? En de anderen dan? En wat in het geval de records aan elkaar zijn gelinkt? Relationele databases hebben de neiging om relationele data te bevatten, dan kan het dus gebeuren dat 1 DELETE diverse andere DELETE's tot gevolg heeft.

Uiteraard kun je per tabel permissies opgeven, dat is nu net het doel van permissies. Je kunt op vrijwel alle onderdelen in de database permissies opgeven, al ken ik de details van MySQL niet uit mijn hoofd.

Maar wat je ook doet, trek eerst alle rechten in en ga dan alleen die rechten toekennen die absoluut noodzakelijk zijn. En niet meer dan dat.
 



Overzicht Reageren

Get Adobe Flash player