java - 无法从 MySQL 数据库中删除记录
问题描述
试图从我的数据库中删除记录,但我收到错误“'where 子句'中的未知列'”。
private void deleteUser() {
String query = "DELETE FROM user WHERE Name =" + tfemail.getText() + "";
executeQuery(query);
showUsers();
}
解决方案
您不能以这种方式编写查询。想象一下有人在该tfemail
字段中输入以下文本:
"Joe' OR FALSE"
让我们看看这会对您的 SQL 查询产生什么影响:
DELETE FROM user WHERE Name = 'Joe' OR FALSE;
再见,数据库!
一些 dbs 允许您在运行 db 引擎的服务器上执行一些东西。这意味着这个技巧可以用来完全破解机器或完全格式化磁盘。再见,整台机器。
这也意味着您的executeQuery
方法需要被删除——抽象('这里有一些 SQL,请运行它')很少有用(因为它不能包含任何用户输入),并诱使您编写安全漏洞。
解决方案是准备好的语句:
PreparedStatement ps = con.prepareStatement("DELETE FROM user WHERE Name = ?");
ps.setString(1, "Joe");
ps.executeUpdate();
这解决了您的问题,并且安全地解决了问题 -ps.setString(1, "Joe' OR FALSE");
现在不再是问题(数据库引擎或 JDBC 驱动程序保证它会解决问题;效果将是删除用户表中字面意思为“Joe ' 或错误")。
此外,将密码存储在数据库中不是一种可接受的策略。解决方案是例如 bcrypt:使用专门设计用于存储密码的散列算法。