2016-03-30 14 views
2

Oracleデータベースを使用するシステムがあります。スキーマはアプリケーション・ユーザーとは異なります。スキーマ名自体はあらかじめわかっていないので、単にハードコードするだけではありません。これはシステムプロパティです。文字列連結を使用しない動的スキーマを使用したクエリ

ほとんどのデータアクセスは接続時にデフォルトのスキーマを指定できるHibernateを介して行われるため、この場合は問題ありません。

ただし、(jdbcTemplateを使用して)プレーンSQLクエリが使用される場所がいくつかあります。だから、今私たちは沸騰するものを持っています:

Map<String,Object> result = jdbcTemplate.queryForMap("SELECT A, B, C FROM "+schema+".TABLE WHERE blablablah"); 

これはもちろん、オープンSQLインジェクションの脆弱性です。私たちはセキュリティ監査を計画しており、これには確実にフラグが立てられます。

質問:jdbcTemplate、別のSprintデータアクセスユーティリティ、またはプレーンjdbcの場合でも、クエリにスキーマを指定するにはどうすればよいですか?

あなたは、JDBC接続のためのスキーマを指定するConnection.setSchemaを使用することができ、 JGN

+0

実際に文ごとに指定しますか?複数のスキーマからオブジェクトにアクセスしますか?あるいは、各セッションの作成時に、[a login trigger](http://stackoverflow.com/)のコードのいずれかで[set current_schema'](http://stackoverflow.com/a/20531823/266304)できますか? a/30127939/266304)は、アプリケーションユーザーを認識しますか? –

+0

参照するデータベース・オブジェクトのOracleシノニムを作成できます。次に、SQLにスキーマを指定する必要はありません。 – GriffeyDog

+0

問題は、スキーマ名がコーディング時にわかっていないということです。つまり、 'update(" ALTER SESSION SET_CURRENT_SCHEMA =? "、schemaNameFromAppProperties);' 私はうまくいきませんスキャン中にSQLインジェクションの脆弱性として再びフラグが立てられます: 'update(" ALTER SESSION SET CURRENT_SCHEMA = "+ schemaNameFromAppProperties") – JGN

答えて

3

、ありがとうございました。これは、SQLコマンドを実行するためにStatementを作成する前に行う必要があります。

+0

「プレーンjdbcを使用しています」要求をカバーするので、この回答を受け入れます。私はそれをjdbcTemplateに伝播しようとします(おそらく、DataSource.getConnectionメソッドのオーバーロードによって、私はすでにカスタムDataSourceを使用しています)。しかし、最悪の場合、私はこの提案でプレーンJDBCを使用できます。ありがとうございました。 – JGN

+0

Javaの1.7で 'Connection.setSchema(schema)'が追加されたため、すべてのドライバでサポートされているわけではありません(たとえば、オラクルはバージョン12のドライバのみをサポートしています)実行時に奇妙なNoSuchMethodエラーが発生します。 – JGN

関連する問題