0

アプリケーションが多くの条件に応じて異なるSQLを生成し、休止状態セッションcreateSQLQuery()を介してそれらを実行する既存のコードがあります。ここで、パラメーターは、通常の文字列置換として Java クラスに存在する SQL 文字列に連結されます。ここでの問題は、SQL インジェクションを防ぐ必要があることです。そのためには、getNamedQuery() を使用してパラメーターをバインドし、休止状態が特殊文字を処理するようにする必要があります。しかし問題は、条件付きでSQLを生成するため、文字列SQLをxmlファイルに移動することはオーバーヘッドです。そこで、特殊文字の検証を手動で行い、それを文字列クエリに追加して、そのまま実行することにしました。それで、私が見つけたPrepareStatementのソースをチェックすると、例外がスローされます

byte[] arrayOfByte1 = new byte[0];
try
{
   arrayOfByte1 = CharsToBytes(this.OdbcApi.charSet, arrayOfChar);
}
   catch (UnsupportedEncodingException localUnsupportedEncodingException) {
}

SQLインジェクションを排除するためにパラメータを文字列クエリと連結する前に、パラメータに対して上記と同じ種類のエンコーディングをJavaクラスで行うにはどうすればよいですか? または、文字列 sql を追加パラメーターとして保持し、休止状態を使用してクエリを実行する方法はありますか?

4

2 に答える 2

1

私が知る限り、(UI から推測すると) 条件の組み合わせは非常に複雑になる可能性があるため、その場で SQL クエリを作成する必要があります。それはいいです。制御する必要があるのは、ユーザーが指定するパラメーターだけです。そのために、Hibernate のcreateSqlQuery(). ?その関数は、位置パラメーター (クエリ文字列の先頭から数えられる) または構文のいずれかを理解し、:param_name名前付きパラメーターを指定します。xml ファイルに何かを移動する必要はありません。

セクション 16.1.7に例があります。

于 2013-05-29T07:07:13.177 に答える
0

カスタム SQL をクエリにアセンブルする必要がある場合は、カスタム SQL を含む独自の基準クラスを作成するとうまくいくことがわかりました。

Criterion インターフェースを実装するだけです。 https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/criterion/Criterion.html

(「not null」の Hibernate 実装も参照してください: http://www.grepcode.com/file/repo1.maven.org/maven2/org.hibernate/hibernate/3.2.4.sp1/org/hibernate/criterion/ NotNullExpression.java?av=f .)

次に、通常の Hibernate 基準 API を使用して、各カスタム クエリを簡単に作成できます。

https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-creating

SQL 値を適切にサニタイズするのは苦痛です - それを避けるために一生懸命努力してください! ;-)

于 2013-05-30T21:43:34.940 に答える