SQL Stored Procedures

Unter einer Stored Procedure versteht man ein Stück gespeicherten SQL-Code der immer wieder ausführbar ist. Ähnlich wie Funktionen kann man SQL Stored Procedures individuell anlegen und speichern, mit Parametern versehen, alternativ auch etwas zurückgeben lassen und anhand des Namens aufrufen. Es bietet sich also an, Code den man häufig ausführt als Stored Procedure zu speichern.


Beispiel Syntax (MSSQL):

Anlegen einer Stored Procedure:

   CREATE PROCEDURE SelectAllStudents
   AS
   SELECT * FROM Studenten
   GO;
    

Aufrufen dieser Stored Procedure:

    EXEC SelectAllStudents;
     

Anlegen einer Stored Procedure mit Parametern:

    CREATE PROCEDURE SelectAllStudents @Gruppe nvarchar(30), @Semester nvarchar(2)
    AS
    SELECT * FROM Studenten WHERE Gruppe = @Gruppe AND Semester = @Semester
    GO; 
    

Aufruf:

    EXEC SelectAllStudents @Gruppe = 'München', @Semester = '5';

Warum Stored Procedures und nicht Funktionen?

Stored Procedures und Funktionen sind in ihrer Funktion sehr ähnlich. Die Stored Procedures sind allerdings flexibler und benötigen weniger Code als Funktionen, da weder “BEGIN” und “END”, noch “RETURN” notwendig sind solange der Code nur eine Zeile lang ist. Auch erlauben Stored Procedures mehrere Parameter, während Funktionen immer nur eine Variable oder Tabelle zurückgeben können. Es ist nicht möglich in einer Funktion eine Procedure aufzurufen, umgekehrt ist es aber möglich, eine Funktion in einer Procedure aufzurufen.


Vorteile von Stored Procedures:

  • Da Stored Procedures in der Datenbank gespeichert werden ist es ohne großen Aufwand möglich mittels “ALTER PROCEDURE” den Code der Procedure zu verändern ohne dass ein Neustart nötig ist.
  • Stored Procedures ermöglichen eine große Zeitersparnis indem häufig genutzter Code nicht jedes Mal neu eingegeben werden muss und da Statements in der Regel vorkompiliert sind, wird auch Laufzeit gespart.
  • Es ist möglich Stored Procedures zu verschlüsseln, so dass der Inhalt nicht sichtbar ist. Wird der Zugriff auf die Tabelle nur über Procedures gestattet erhöht dies die Sicherheit vor unbefugtem Verändern der Daten.
  • Bessere Übersichtlichkeit des Codes durch zentral gehaltene und wiederverwendbare Procedures.


Stored Procedures als Schutz vor SQL-Injections

Stored Procedures bieten einen gewissen Schutz vor SQL-Injections, da sie Parameter/Daten und Anfragen getrennt voneinander behandeln können. So werden Parameter immer ausschließlich als Daten behandelt und nicht als Anfrage. Allerdings ist dies kein absoluter Schutz, auch Stored Procedures können, unter gewissen Bedingungen, Angriffsflächen für SQL-Injections bieten. Beispielsweise wenn der Code in der Procedure dynamisch durch konkatenierte Parameter aufgebaut ist. Daher sollten Stored Procedures, wenn möglich, immer ohne unsichere, dynamische SQL generierung geschrieben werden. Ist dies nicht möglich und es muss dynamischer Code implementiert werden, muss darauf geachtet werden, dass jeder User Input validiert oder escaped wird so dass kein SQL Code in die dynamisch generierte Anfrage eingeschleust werden kann.

Stored Procedures als Hilfsmittel für SQL Injections?

In seltenen Fällen können Stored Procedures das Risiko von SQL Injections nicht nur nicht verringern, sondern sogar erhöhen. Beispielsweise gibt es auf dem MS SQL Server standartmäßig drei Rollen mit entsprechenden Zugriffsrechten:

  • db_datareader
  • db_datawriter
  • db_owner

Ohne Stored Procedures werden dem Anwender, je nach benötigten Rechten, die reader oder writer Rollen zugewiesen. Allerdings brauchen Stored Procedures, um korrekt zu funktionieren, gewisse Adminrechte um die Funktionen ausführen zu können, die von den lesenden und schreibenden Rollen nicht abgedeckt werden. In manchen Serversetups konnte es nun vorkommen, dass alle Applikationen automatisch unter db_owner – Rechten liefen um den Stored Procedures ihre Funktion zu ermöglichen. Dies heißt natürlich auch, dass ein Angreifer sich dies zu Nutzen machen kann und hierüber volle Rechte auf die Datenbank bekommen kann.


Quellen

https://www.w3schools.com/sql/sql_stored_procedures.asp

https://www.sqlshack.com/sql-server-stored-procedures-for-beginners/

https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html


YouTube:

“Advanced SQL Tutorial | Stored Procedures + Use Cases” von “Alex The Analyst” (https://www.youtube.com/watch?v=NrBJmtD0kEw)

“SQL Stored Procedures - What They Are, Best Practices, Security, and More…” von “IamTimCorey” (https://www.youtube.com/watch?v=Sggdhot-MoM)