none
Zugriffsrechte mit/ohne Ececute RRS feed

  • Frage

  • Hallo zusammen,

    ich habe ein Verständnisproblem.

    Ich möchte den direkten Zugriff auf einige Daten unterbinden und über stored procedures steuern wer was machen darf.
    Im folgenden hat der angemeldete Benutzer keine select-Rechte auf die view vPAB_Rechnung_Std.
    Darum erhalte ich auch erwartungsgemäß einen Fehler, wenn ich in der SP
        exec('SELECT * FROM vPAB_Rechnung_Std WHERE id = ' + @intId);
    aufrufe.

    Wenn ich aber den Aufruf in
        SELECT * FROM vPAB_Rechnung_Std WHERE id = @intId;
    ändere, bekome ich keinen Fehler.

    Ist das richtig?
    Mittwoch, 21. September 2016 05:48

Antworten

  • Hallo,

    wenn ein Benutzer Rechte zum Ausführen einer Stored Procedure hat, aber keine Rechte auf die zugrunde liegenden Tabellen oder Views hat, kommt das Ownership Chaining (Besitzverkettung) zum tragen; die Daten können also trotzdem abgerufen werden.

    Du verwendest hier dynamisches SQL (selten eine gute Idee) und das unterbricht das Ownership Chaining, daher die Fehlermeldung wegen fehlender Rechte.

    Siehe Writing Secure Dynamic SQL in SQL Server => Dynamic SQL Strategies: "Executing dynamically created SQL statements in your procedural code breaks the ownership chain, causing SQL Server to check the permissions of the caller against the objects being accessed by the dynamic SQL"


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    • Bearbeitet Olaf HelperMVP Mittwoch, 21. September 2016 06:26
    • Als Antwort markiert KalleAtWork Mittwoch, 21. September 2016 06:31
    Mittwoch, 21. September 2016 06:26

Alle Antworten

  • Hallo,

    wenn ein Benutzer Rechte zum Ausführen einer Stored Procedure hat, aber keine Rechte auf die zugrunde liegenden Tabellen oder Views hat, kommt das Ownership Chaining (Besitzverkettung) zum tragen; die Daten können also trotzdem abgerufen werden.

    Du verwendest hier dynamisches SQL (selten eine gute Idee) und das unterbricht das Ownership Chaining, daher die Fehlermeldung wegen fehlender Rechte.

    Siehe Writing Secure Dynamic SQL in SQL Server => Dynamic SQL Strategies: "Executing dynamically created SQL statements in your procedural code breaks the ownership chain, causing SQL Server to check the permissions of the caller against the objects being accessed by the dynamic SQL"


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    • Bearbeitet Olaf HelperMVP Mittwoch, 21. September 2016 06:26
    • Als Antwort markiert KalleAtWork Mittwoch, 21. September 2016 06:31
    Mittwoch, 21. September 2016 06:26
  • Alles klar, hatte mich gewundert, warum es funktioniert und das dynamische SQL zum Testen ausprobiert.

    Danke.

    Mittwoch, 21. September 2016 06:33
  • Hallo,

    für eine gespeicherte Prozedur gelten zuerst die Berechtigungen, die man der Prozedur mit GRANT erteilt hat.

    Im Falle von EXECUTE wird ein neuer Kontext eröffnet und es gelten die allgemeinen Berechtigungen des Benutzers, solange man nicht die AS LOGIN/USER Option verwendet. Für einen Benutzerwechsel kann die EXECUTE AS-Klausel verwendet werden, die einen Benutzerwechsel erlaubt.

    Für erste Anweisung wäre i. a. die Verwendung von sp_executesql anzuraten, da SQL Injection vermieden und eine Nutzung von gespeicherten Abfrageplänen ermöglicht wird, siehe EXEC vs. sp_executeSQL.

    Gruß Elmar
    Mittwoch, 21. September 2016 06:41
    Beantworter