我有一个简单的预准备语句,用于更新MySQL数据库中的记录。表,列,目标属性和信息来自文本字段。首先我没有准备好的声明,但如果用户选择插入引号或%% $& ^ *其他符号,该程序很容易破解。
现在我明白了:
更新客户端SET' full_name' = Martinajh WHERE id =' 5' com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:你 您的SQL语法有错误;检查对应的手册 您的MySQL服务器版本,以便在附近使用正确的语法 '' selectedTable2' SET' namec' =' cellValue' WHERE id == 5'在第1行
String cellValue3 = String.valueOf( table.getValueAt(row, 0) );
int id = Integer.parseInt(cellValue3);
String selectedTable2 = (String) listOfTablesNames.getSelectedValue();
String cellValue = String.valueOf( table.getValueAt(row, column) );
String namec = table.getColumnName(column);
String query ="UPDATE ? SET ? = ? WHERE id== ?";
PreparedStatement preparedStmt = (PreparedStatement) conn.prepareStatement(query);
preparedStmt.setString (1, "selectedTable2");
preparedStmt.setString(2, "namec");
preparedStmt.setString(3, "cellValue");
preparedStmt.setInt(4, id);
preparedStmt.executeUpdate();
答案 0 :(得分:4)
您无法使用表名作为参数构建预备语句。您需要使用字符串连接/占位符和String.format构造SQL。 Prepared语句用于列值而不是表名。 在你的情况下:
String query ="UPDATE `" + selectedTableVar + "` SET `" + fieldNameVar + "` = ? WHERE id = ?";
//...
preparedStmt.setString(1, "cellValue");
preparedStmt.setInt(2, id);
此外,id = ?
为@C。提到了Helling。
至于清理selectedTableVar
和fieldNameVar
变量,我现在无法找到链接,但您可以自己研究MySQL中的有效限定符... AFAIK,任何UTF字符都有效,大多数特殊符号可能是有效表名的一部分等。使用上面建议的语法,你应该不要让`字符阻止注入,我猜它就是这样。但必须进行调查。