首页 > 解决方案 > 无法从 MySQL 数据库中删除记录

问题描述

试图从我的数据库中删除记录,但我收到错误“'where 子句'中的未知列'”。

private void deleteUser() {
    String query = "DELETE FROM user WHERE Name =" + tfemail.getText() + "";
    executeQuery(query);
    showUsers();
}

在此处输入图像描述 在此处输入图像描述

标签: javamysqlwhere-clausesql-delete

解决方案


您不能以这种方式编写查询。想象一下有人在该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:使用专门设计用于存储密码的散列算法。


推荐阅读