gpt4 book ai didi

mysql - 为 SQL PreparedStatement 动态添加列 - 仍然可以安全地防止注入(inject)吗?

转载 作者:行者123 更新时间:2023-11-29 06:52:27 24 4
gpt4 key购买 nike

我试图在我的 Java 程序中防止 SQL 注入(inject)。我想使用 PreparedStatements 来执行此操作,但我事先不知道列数或它们的名称(该程序允许管理员从表中添加和删除列)。我是新手,所以这可能是个愚蠢的问题,但我想知道这种方法是否安全:

public static int executeInsert( String table, Vector<String> values)
{
Connection con;
try {
con = connect();

// Construct INSERT statement
int numCols = values.size();
String selectStatement = "INSERT INTO " + table + " VALUES (?";
for (int i=1; i<numCols; i++) {
selectStatement += ", ?";
}
selectStatement += ")";
PreparedStatement prepStmt = con.prepareStatement(selectStatement);

// Set the parameters for the statement
for (int j=0; j<numCols; j++) {
prepStmt.setString(j, values.get(j));
}

System.out.println( "SQL: " + prepStmt) ;
int result = prepStmt.executeUpdate();
con.close() ;
return( result) ;
} catch (SQLException e) {
System.err.println( "SQL EXCEPTION" ) ;
System.err.println( "Inserting values " + values + " into " + table);
e.printStackTrace();
}
return -1;
}

基本上,我是根据传入的值数量(以及表中的列数)动态地为语句创建字符串。我觉得这很安全,因为直到创建此字符串后才真正创建 PreparedStatement。我可能会创建类似的函数来接收实际的列名并将它们合并到 SQL 语句中,但这些函数将由我的程序生成,而不是基于用户输入。

最佳答案

任何时候你有像 table 这样的值被插入到你的查询中而没有转义,你应该针对已知良好值的白名单进行测试。这可以防止人们发挥创造力并引起麻烦。一个简单的字典或有效条目数组通常就足够了。

使用准备好的语句是个好主意,但要确保您准备的语句从一开始就不允许注入(inject)。

关于mysql - 为 SQL PreparedStatement 动态添加列 - 仍然可以安全地防止注入(inject)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14594419/

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