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.

EGPNL legt den Benutzer mit den richtigen Rechten an, wenn Sie eine Datenbank erstellen - diese Seite zählt also vor allem auf einem VPS, den Sie selbst verwalten.