2008-09-22 8 views
9

Traditionalist argumentieren, dass gespeicherte Prozeduren eine höhere Sicherheit bieten, als wenn Sie ein ORM-Framework (Object Relational Mapping) wie NHibernate verwenden.Was sind Best Practices zur Implementierung der Sicherheit bei der Verwendung von NHibernate?

Um diesem Argument entgegenzuwirken, gibt es einige Ansätze, die mit NHibernate verwendet werden können, um sicherzustellen, dass die richtige Sicherheit vorhanden ist (zum Beispiel die Vermeidung von SQL-Injection usw.).

(Bitte geben Sie nur einen Ansatz pro Antwort)

Antwort

3

Verwenden Sie ein dediziertes, Locked-Down SQL-Konto

6

Eigentlich kann NHibernate für SQL-Injection anfällig sein, wenn Sie SQL oder HQL verwenden, um Ihre zu konstruieren Abfragen. Stellen Sie sicher, dass Sie parametrisierte Abfragen verwenden, wenn Sie dies tun müssen, da Sie sich sonst auf eine Welt der Schmerzen einstellen.

+0

Ich denke, was Sie meinen ist, so viel wie möglich verwenden Sie die Kriterien und Ausdruck Muster anstelle von HQL. Ich hatte den Eindruck, dass HQL in sich selbst parametrisiert ist - haben Sie einen Link, der zeigt, wie HQL für die Injektion verwendet werden kann? –

+0

HQL ist parametrisiert. Sie können Strings in Ihrem HQL nicht verketten oder Sie tun dasselbe wie mit SQL. –

7

Schützen Sie Ihre Verbindungszeichenfolgen.

Ab .NET 2.0 und NHibernate 1.2 ist es einfach, verschlüsselte Verbindungszeichenfolgen (und andere Anwendungseinstellungen) in Ihren Konfigurationsdateien zu verwenden. Speichern Sie Ihre Verbindungszeichenfolge in dem <connectionStrings>-Block, dann verwenden Sie die NHibernate connection.connection_string_name Eigenschaft statt connection.connection_string. Wenn Sie eine Website und keine Windows-App ausführen, können Sie das Befehlszeilentool aspnet_regiis verwenden, um den Block <connectionStrings> zu verschlüsseln, während der Rest Ihrer NHibernate-Einstellungen zur einfachen Bearbeitung im Klartext bleibt.

Eine andere Strategie besteht darin, die integrierte Authentifizierung für Ihre Datenbankverbindung zu verwenden, wenn Ihre Datenbankplattform dies unterstützt. Auf diese Weise speichern Sie (hoffentlich) keine Anmeldedaten in Klartext in Ihrer Konfigurationsdatei.

2

Eines der Argumente, die ich für sprocs über ORM gehört habe, ist, dass sie Menschen zu tun, nicht wollen, was sie in der Datenbank wollen. Sie verbieten das Auswählen/Einfügen/Aktualisieren/Löschen auf den Tabellen selbst. Jede Aktion wird durch ein Verfahren kontrolliert, das von einem DBA überprüft wird. Ich kann verstehen, woher dieses Denken kommt ... vor allem, wenn Sie eine Gruppe von Amateuren alle mit ihren Händen in Ihre Datenbank haben.

Aber die Zeiten haben sich geändert und NHibernate ist anders. Es ist unglaublich reif. In den meisten Fällen wird es besser SQL schreiben als Ihr DBA :).

Sie müssen sich immer noch davor schützen, etwas Dummes zu tun. Wie Spiderman sagt "mit großer Macht kommt große Verantwortung"

Ich denke, es ist viel geeigneter, NHibernate den richtigen Zugriff auf die Datenbank und steuern Aktionen auf andere Weise, wie Audit-Logging und regelmäßige Backups geben. Wenn jemand etwas Dummes tun sollte, kann man sich immer wieder erholen.

+1

+1 Dies ist genau das, was ich gesagt hätte, gut ausgedrückt (außer für den Spiderman Kommentar natürlich: P) – Jay

+0

Das ist gut im Zusammenhang mit automatisch generierten SQL-Anweisungen, aber Sie müssen immer noch vorsichtig sein beim Schreiben Ihrer eigenen HQL Fragen und folgen Sie den allgemeinen Best Practices. –

+0

Ich bin wirklich nicht sicher, wo Sie die Idee, dass NHibernate kann besser sql als ein DBA, ich bin kein DBA, und ich kann besser schreiben (effizienter) SQL als die NHibernate generiert SQL. – Martin

1

meist ORM Griff SQL-Injection durch parametrisierte Abfragen zu erstellen. Wenn Sie in NHibernate die Methode LINQ to NHibernate oder die Methode Criteria/Query zum Schreiben von Abfragen verwenden, werden die Abfragen automatisch parametrisiert. Wenn Sie HQL/SQL-Abfragen dynamisch selbst erstellen, sind Sie besser geschützt und müssen sich dessen bewusst sein Abfragen müssten parametrisiert werden.

Verwandte Themen