flawopen.com/C# の SQL Injection/NHibernate
NHibernate は SQL Injection を防げますか?
リファレンスガイド
要点
バインドパラメーターは、クエリフォームに封印された値カードのようなものです。データベースは値を命令ではなくデータとして扱います。HQL パラメーターは値を分離します。信頼できない文字列を HQL や SQL に補間すると、クエリ言語の一部になります。
危険 — 入力値を HQL に補間
var hql =
$"from User u where u.Id = {userId}";
var user = session.CreateQuery(hql)
.UniqueResult<User>();
強化 — 値を HQL パラメーターにバインド
var user = session.CreateQuery(
"from User u where u.Id = :id")
.SetParameter("id", userId)
.UniqueResult<User>();
値をバインドし、クエリ構造を制限する
SetParameter() は値を HQL テキストとは別に渡します。信頼できない値には名前付きまたは位置パラメーターを使います。ネイティブ SQL も名前付き・位置パラメーターに対応しています。ISQLQuery の対応するバインドメソッドを使い(文字列値なら SetString() など)、識別子、ソート順、任意のクエリ断片にはパラメーターを使わないでください。それらはクエリ構造です。選択可能なプロパティは、アプリ管理の固定 HQL 断片に対応付けます。パラメーター化は値が構文として解釈されるのを防ぎますが、レコードへのアクセス権限は別途確認が必要です。
よくある質問
HQL のパラメーター化でレコードへのアクセスも許可されますか?
いいえ。認可では、アカウントやテナントで絞り込むなど、現在のユーザーがアクセスできるレコードだけにクエリを制限します。