gpt4 book ai didi

java - 将动态 WHERE 子句传递给 Java/JDBC 中的函数的安全方法

转载 作者:行者123 更新时间:2023-11-29 12:29:32 25 4
gpt4 key购买 nike

我有一个方法“getAllIDs()”,用于获取数据库中特定表的 ID。它被我项目中的许多方法使用。

public static int[] getAllIDs (String TableName, String WhereClause, String trxName)
{
ArrayList<Integer> list = new ArrayList<Integer>();
StringBuffer sql = new StringBuffer("SELECT ");
sql.append(TableName).append("_ID FROM ").append(TableName);
if (WhereClause != null && WhereClause.length() > 0)
sql.append(" WHERE ").append(WhereClause);
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement(sql.toString(), trxName);
rs = pstmt.executeQuery();
while (rs.next())
list.add(new Integer(rs.getInt(1)));
}
}

Whereclause 是查询的条件部分。由于这个whereclause,有可能进行sql注入(inject)。所以我需要修改这个方法来使用准备语句参数设置来设置参数。我遇到的问题是因为“getAllIDs()”不知道每个 whereclause 有多少个参数。

每个where子句的参数都会不同,可以是任意数字。对于某些类,参数将为 3,对于某些类,参数将为 2,等等,具有不同的数据类型。那么我如何使用 setstring()、setint() 等。用我发布的代码解释一下。

最佳答案

将额外的 PreparedStatementBinder 参数传递给该方法:

public interface PreparedStatementBinder {
/**
* Binds all the arguments to the given prepared statement
*/
public void bindArguments(PreparedStatement statement) throws SQLException;
}

调用者必须传递一个 where 子句(例如 "foo = ? and bar = ?"),以及该接口(interface)的一个实例,例如

new PreparedStatementBinder() {
@Override
public void bindArguments(PreparedStatement statement) throws SQLException {
statement.setString(1, theFoo);
statement.setInt(2, theBar);
}
}

关于java - 将动态 WHERE 子句传递给 Java/JDBC 中的函数的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12316015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com