Ich habe die MySQL-Version von this question for SQL-ServerWie kann man nur durch die gespeicherte Prozedur einfügen?
ich mysql Ver 14.14 Distrib 5.5.49, für debian-linux-gnu (x86_64) mit Readline- 6.3
läuft ich nur mit dieser Berechtigung einen Benutzer erstellt haben :
DELIMITER $$
CREATE PROCEDURE seed_database()
this_procedure:BEGIN
INSERT INTO `dbtable` VALUES (1,'data');
END $$
DELIMITER ;
Aber wenn ich l:
CREATE USER 'username'@'localhost' IDENTIFIED BY '[email protected]';
GRANT EXECUTE ON dbname.* TO 'username'@'localhost';
ich dieses Verfahren auf dbname
erstellt haben ogin mit diesem Benutzer und versuchen zu CALL seed_database();
, erhalte ich:
ERROR 1142 (42000) in Zeile 1: INSERT Befehl verweigert Benutzer 'username' @ 'localhost' für Tabelle 'dbtable'
Ich versuche, the principle of least privilege zu folgen, indem ich nur einem Benutzer erlaube, gespeicherte Prozeduren auszuführen. Ich möchte einem Benutzer nicht das Recht geben, direkt auf eine Tabelle mit dem offensichtlichen GRANT INSERT ON dbname.dbtable TO 'username'@'localhost';
INSERT zu setzen, falls die Berechtigungsnachweise kompromittiert sind und ich eine komplexe Logik in der gespeicherten Prozedur habe, die zu speichernde Eingaben erzeugt (dargestellt durch hartcodierte Daten in dem Beispiel (1,'data')
), dass ich nicht möchte, dass der Benutzer direkt erzeugt und fügt. Aber ich möchte, dass sie die gespeicherte Prozedur verwenden, um das gleiche Ziel zu erreichen.
danke! das war die erforderliche Lektüre, die ich brauchte. Nach einigen Tests stellte ich fest, dass es beim ersten Erstellen der Prozedur als root funktionierte. Aber ich hatte einige Dinge verwirrt, indem ich versuchte, eine Testumgebung zu erstellen, in der der Benutzer Prozeduren ändern, löschen und erstellen konnte. Ich hatte naiv angenommen, dass alle SPs mit erhöhten Rechten laufen. So könnten sie die Prozedur neu erstellen, aber das Zulassen von Einfügungsberechtigungen wäre eine Sicherheitslücke. danke –
Ziemlich willkommen. Ich füge eine kleine Information über die Rechte von invoker vs. definer zu meiner Antwort für zukünftige Leser hinzu. –
in Bezug auf *** Standardmäßig **, MySQL führt gespeicherte Prozeduren mit "Invoker-Rechte", * dies kann in den letzten Versionen geändert haben, aber für 5,5 * Das SQL-SECURITY-Merkmal kann DEFINER oder INVOKER sein ... ** default ** value ist DEFINER ... Der Standardwert DEFINER ist der Benutzer, der das CREATE PROCEDURE * ausführt, wie es bei meinem vorherigen Kommentar der Fall war DEFINER und DEFINER Klauseln) –