Sicherheit (LINQ to DataSet)

Dieses Thema befasst sich mit Sicherheitsfragen in LINQ to DataSet.

Übergeben einer Abfrage an eine nicht vertrauenswürdige Komponente

Eine LINQ to DataSet-Abfrage kann an einer Stelle eines Programms formuliert und an einer anderen Stelle ausgeführt werden. An dem Punkt, an dem die Abfrage formuliert wird, kann die Abfrage auf jedes beliebige Element verweisen, das an diesem Punkt sichtbar ist, z. B. private Member der Klasse, zu der die aufrufende Methode gehört, oder Symbole, die lokale Variablen/Argumente darstellen. Zum Zeitpunkt der Ausführung ist die Abfrage wirksam in der Lage, auf die Member zuzugreifen, auf die von der Abfrage bei der Formulierung verwiesen wurde, selbst wenn der aufrufende Code diese gar nicht einsehen kann. Der Code, der die Abfrage ausführt, besitzt insofern keine willkürlich hinzugefügte Sichtbarkeit, als dass er nicht wählen kann, worauf er zugreift. Er kann nur auf die Elemente zugreifen, auf die die Abfrage zugreift, und dies auch nur über die Abfrage selbst.

Das bedeutet, wenn ein Verweis auf eine Abfrage an ein anderes Stück Code übergeben wird, wird der Komponente, die die Abfrage empfängt, so vertraut, dass sie auf alle öffentlichen und privaten Member zugreifen darf, auf die die Abfrage verweist. Im Allgemeinen gilt: LINQ to DataSet-Abfragen sollten nur dann an nicht vertrauenswürdige Komponenten übergeben werden, wenn die Abfrage sehr sorgfältig konstruiert wurde und damit keine Informationen verfügbar macht, die privat bleiben sollten.

Externe Eingabe

Anwendungen verwenden häufig externe Eingaben (eines Benutzers oder eines anderen externen Agenten) und führen entsprechend dieser Eingabe Aktionen aus. Im Falle von LINQ to DataSet kann die Anwendung eine Abfrage auf eine bestimmte Art und Weise konstruieren, die auf externen Eingaben basiert oder externe Eingaben in der Abfrage verwendet. LINQ to DataSet-Abfragen akzeptieren Parameter an allen Stellen, an denen Literale akzeptiert werden. Anwendungsentwicklern wird empfohlen, parametrisierte Abfragen zu verwenden, anstatt Literale aus einem externen Agent direkt in die Abfrage einzuschleusen.

Jede direkt oder indirekt vom Benutzer oder einem externen Agenten abgeleitete Eingabe kann Inhalt besitzen, der die Syntax der Zielsprache nutzt, um nicht genehmigte Aktionen auszuführen. Dieses Verhalten wird als SQL Injection-Angriff bezeichnet. Diese Bezeichnung leitet sich aus einem Angriffsmuster ab, bei dem die Zielsprache Transact-SQL ist. Das Einschleusen von Benutzereingaben direkt in die Abfrage führt zum Löschen einer Datenbanktabelle oder zur Dienstverweigerung (Denial of Service) oder ändert auf andere Art und Weise die auszuführende Operation. Die Abfrageerstellung in LINQ to DataSet ist zwar möglich, erfolgt aber über die Objektmodell-API. LINQ to DataSet-Abfragen werden nicht mithilfe von Zeichenfolgenbearbeitungen oder Verkettungen zusammengestellt, wie dies bei Transact-SQL der Fall ist, und sind nicht anfällig durch Angriffe durch Einschleusung von SQL-Befehlen im herkömmlichen Sinne.

Siehe auch