Java 如何设置使用OPENQUERY的预处理语句查询的参数以避免SQL注入

Java 如何设置使用OPENQUERY的预处理语句查询的参数以避免SQL注入,java,sql-injection,mssql-jdbc,Java,Sql Injection,Mssql Jdbc,在我的java应用程序中,我使用OPENQUERY在远程链接的MSSQL服务器中执行SQL查询并获取结果。下面是我正在使用的OPENQUERY示例: SELECT 1 FROM OPENQUERY('LINK_SERVER1', 'SELECT 1 FROM TABLE_ABC'); 在我的Java类中,我使用以下PreparedStatement执行上述OPENQUERY,如下所示: String linkServerName = "LINK_SERVER1"; String remoteQ

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

您是否使用ps.setString0,linkServerName进行了尝试?@alzaimar:参数是基于1的索引,因此ps.setString0,linkServer引发异常-无效的参数索引0发布您的完整堆栈跟踪。此处出现错误字符串remoteQuery='从表_ABC中选择1';您不再需要单引号了。@looser:我认为remoteQuery需要单引号,因为在此更改之前的代码需要上面的第二个代码段。话虽如此,我尝试删除remoteQuery中的单引号,但结果是一样的。我将在我的帖子中添加stacktrace。@NITINSHUKLA我认为LINK_SERVER1是一个标识符语法检查这里的语法。。可以尝试使用ps.setURL。。