0

私のJavaアプリケーションでは、OPENQUERYを使用して、リモートリンクされたMSSQLサーバーでSQLクエリを実行し、結果を取得しています。以下は、私が使用している OPENQUERY の例です。

SELECT 1 FROM OPENQUERY('LINK_SERVER1', 'SELECT 1 FROM TABLE_ABC');

私のJavaクラスでは、以下のようにPreparedStatementを使用して、上記のOPENQUERYを以下のように実行しています。

String linkServerName = "LINK_SERVER1";
String remoteQuery = "'SELECT 1 FROM TABLE_ABC'";
String openQuery = "SELECT 1 FROM OPENQUERY(" + linkServerName + ", " + remoteQuery + ")";
PreparedStatment ps = connection.prepareStatement(openQuery);
ps.executeQuery();

上記のコードは期待どおりに機能します。ただし、問題は、SQL インジェクションの可能性があり、HP Fortify が SQL インジェクションの脆弱性があると報告していることです。

以下のように、PreparedStatement で setString を使用するように上記のコードを変更しようとしました。

String linkServerName = "LINK_SERVER1";
String remoteQuery = "'SELECT 1 FROM TABLE_ABC'";
String openQuery = "SELECT 1 FROM OPENQUERY(?, ?)";
PreparedStatment ps = connection.prepareStatement(openQuery);
ps.setString(1, linkServerName);
ps.setString(2, remoteQuery);
ps.executeQuery();

ただし、上記のコードは期待どおりに機能しません。実行時に、ps.executeQuery() の呼び出しで以下の例外が発生します。

java.sql.SQLException: Incorrect syntax near '@P0'.

上記のコードで何が間違っているのかはっきりしません。MSSQL jdbc ドライバーが気に入らないようで、PreparedStatement で setString メソッドを呼び出してもパラメーターが正しく設定されませんでした。

誰かがこの問題に遭遇して解決しましたか? これを解決するための指針をいただければ幸いです。

java.sql.SQLException: Incorrect syntax near '@P0'.
            at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:365)
            at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2781)
            at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2224)
            at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:628)
            at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:418)
            at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:693)
            at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
            at com.aviseurope.rm.fcst.modules.service.HealthCheckServiceImpl.canConnectToBiSsde(HealthCheckServiceImpl.java:658)
4

0 に答える 0