【发布时间】:2021-05-17 07:29:50
【问题描述】:
我的代码中有一个漏洞,我正在尝试修复它。
为此,在 SQL 查询中,我使用 PreparedStatements 安全地注入参数,如下所示:
String runQuery(String value) {
String myReturn;
String query = "select VALUE from " + tableName + " where config = ?";
try(PreparedStatement ps = con.prepareStatement(query)){
ps.setString(1, value);
try(ResultSet rs = ps.executeQuery()) {
if (rs.next()) {
myReturn = rs.getString(1);
} else {
throw new BusinessException("noSQLResultSet");
}
}
} catch (Exception sqlException) {
throw new BusinessException("SQLException");
}
return myReturn;
}
我的问题是关于表的名称tableName,我目前正在从位于服务器上的属性文件中检索它,但是从我看到的 PreparedStatements 中我无法注入表的名称,因为它是不允许的.如何在不连接查询中的值的情况下以安全的方式指定表名?
【问题讨论】:
-
为什么是表名变量?不知道配置在哪个表?
-
您如何检查
tableName是否具有适当的值?就像您可以检查它只是一个 SQL 标识符,而不是任何更复杂的表达式;或者您可以检查它是一组已知的允许表名之一。
标签: java sql jdbc prepared-statement