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