flawopen.com/SQL-Injection in C#/NHibernate
Schützt NHibernate vor SQL-Injection?
Ein gebundener Parameter ähnelt einer versiegelten Wertkarte: Die Datenbank behandelt den Inhalt als Daten, nicht als Anweisung. HQL-Parameter trennen Werte. Nicht vertrauenswürdigen Text in HQL oder SQL zu interpolieren, macht ihn wieder zu Abfragesprache.
var hql =
$"from User u where u.Id = {userId}";
var user = session.CreateQuery(hql)
.UniqueResult<User>();
var user = session.CreateQuery(
"from User u where u.Id = :id")
.SetParameter("id", userId)
.UniqueResult<User>();
Werte binden; Abfragestruktur begrenzen
SetParameter() übermittelt den Wert getrennt vom HQL-Text. Verwende benannte oder positionale Parameter für jeden nicht vertrauenswürdigen Wert. Auch native SQL-Abfragen unterstützen benannte und positionale Parameter; verwende die passende Bindungsmethode der ISQLQuery-API (zum Beispiel SetString() für Zeichenfolgen). Parameter stehen nicht für Entitäts- oder Eigenschaftsnamen, Sortierrichtungen oder Fragmente: Das ist Abfragestruktur. Ordne auswählbare Eigenschaften einer festen, anwendungseigenen Menge von HQL-Fragmenten zu. Parametrisierung verhindert, dass Werte als Syntax gelten, entscheidet aber nicht über Zugriffsrechte auf Datensätze.
FAQ
Nein. Parameterbindung schützt die Syntax vor Datenwerten; die Autorisierung muss Abfragen auf Datensätze begrenzen, die der aktuelle Nutzer sehen darf, etwa durch Filterung nach Konto oder Tenant.
Quellen
- NHibernate-Referenz — HQL: Hibernate Query Language
- NHibernate-Referenz — Native SQL
- OWASP — Schutz vor SQL-Injection
- flawopen.com — SQL-Injection in C#