在我的 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)