Boo*_*tic 1 java mysql prepared-statement
我有一个简单的准备好的语句来更新 MySQL 数据库中的记录。表、列、目标属性和信息取自文本字段。首先我没有准备好的语句,但是如果用户选择插入引号或 %%$&^* 其他符号,程序很容易被破坏。
现在我得到这个:
更新客户端 SET 'full_name'=Martinajh WHERE id='5'com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“selectedTable2”SET 'namec' = 'cellValue' WHERE id== 5' 附近使用正确的语法
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();
Run Code Online (Sandbox Code Playgroud)
你不能用表名作为参数构造一个preparedstatement。您需要使用字符串连接/占位符和 String.format 来构造 SQL。准备好的语句是针对列值而不是针对表名的。在你的情况下:
String query ="UPDATE `" + selectedTableVar + "` SET `" + fieldNameVar + "` = ? WHERE id = ?";
//...
preparedStmt.setString(1, "cellValue");
preparedStmt.setInt(2, id);
Run Code Online (Sandbox Code Playgroud)
另外,id = ?作为@C。海灵提到。
至于消毒selectedTableVar和fieldNameVar变量,我现在找不到链接,但你可以自己研究什么是 MySQL 中的有效限定符...... AFAIK,任何 UTF 字符都是有效的,大多数特殊符号可能是有效表名的一部分等。使用上面建议的语法,您应该不会让 ` 字符阻止注入,我想就是这样。但必须对其进行调查。
| 归档时间: |
|
| 查看次数: |
1029 次 |
| 最近记录: |