1

NHibernate のクエリで照合を使用したいのですが、それを行う唯一の方法 (少なくとも私が見つけたものから) は、SQL 式を追加することです ( nHibernate でクエリ結果の照合をカスタマイズできますか? )

だから私は次のようなものを持っています

c.Add(Expression.Sql("Title COLLATE Divehi_90_BIN2 LIKE ?", 
                     title, 
                     NHibernateUtil.String))

ただし、これは正確な文字列と一致するため、両側で % を使用したいと考えています。

Title COLLATE Divehi_90_BIN2 LIKE %?%私にエラーを与える、

しかし、タイトルにパディング:"%" + title + "%"動作します。

私の質問は - 両側で % を使用するとセキュリティ上の欠陥のように見えるため、Expression.Sql でパラメーターを適切に指定する方法はありますか? - クエリ インジェクションを招いているということです。

PS。列に 2 つの言語のデータが含まれているため、データベース レベルで列の照合順序を変更できません。

4

1 に答える 1

3

問題は%@p0%、引用符で囲まれた文字列ではないことです'%@p0%'

NHibernate のドキュメントから、これが推奨される形式のようです。

Expression.Sql("Title COLLATE Divehi_90_BIN2 LIKE ?", 
               String.Format("%{0}%", title),
               NHibernateUtil.String)

String.Format("%{0}%", title)文字列はパラメーターとして渡されるため、このアプローチによって SQL インジェクション攻撃を招くことはないことに注意してください。

于 2013-04-24T13:23:12.100 に答える