Eine Website, deren Datenbankbenutzer Tabellen löschen und jede andere Datenbank lesen kann, ist eine SQL-Injection davon entfernt, alles auf dem Server zu verlieren. Die Abhilfe kostet nichts: Jede Website bekommt einen eigenen Benutzer mit Rechten nur an ihrer eigenen Datenbank.
Ein Benutzer für eine Datenbank
CREATE USER 'site_shop'@'localhost' IDENTIFIED BY 'a-long-random-password';
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO 'site_shop'@'localhost';
FLUSH PRIVILEGES;
Diese vier Verben sind, was eine laufende Anwendung braucht. Beachten Sie, was fehlt: DROP, ALTER, CREATE und alles auf *.*.
Was ein Installer kurzzeitig braucht
Ein Installer oder eine Migration muss tatsächlich Tabellen anlegen und ändern. Geben Sie das Recht für die Installation und nehmen Sie es danach zurück - ein Recht, das man nur hält, solange man es benutzt, kann nicht missbraucht werden, wenn man es nicht benutzt.
GRANT CREATE, ALTER, INDEX, DROP ON shop.* TO 'site_shop'@'localhost';
-- after the install
REVOKE CREATE, ALTER, INDEX, DROP ON shop.* FROM 'site_shop'@'localhost';
Diese niemals
GRANT ALL ON *.* gibt einer Website Lese- und Schreibrecht an jeder anderen Datenbank des Servers, dazu das Recht, Benutzer anzulegen. In viel zu vielen Anleitungen ist es die Vorgabe.- FILE - liest und schreibt Dateien auf dem Server als Datenbankbenutzer.
- SUPER - ändert globale Einstellungen und beendet fremde Sitzungen.
- GRANT OPTION - lässt den Benutzer Rechte weitergeben, auch an sich selbst.
Prüfen, was Sie schon vergeben haben
SELECT user, host FROM mysql.user;
SHOW GRANTS FOR 'site_shop'@'localhost';
Der Host-Teil ist die halbe Sicherheit
'user'@'localhost' kann sich nur von der Maschine selbst verbinden. 'user'@'%' kann sich von überall im Internet verbinden, und dann steht nur noch ein Passwort im Weg.
