试图从数据库中删除记录,但在“where子句”中出现错误“未知列”。
private void deleteUser() { String query = "DELETE FROM user WHERE Name =" + tfemail.getText() + ""; executeQuery(query); showUsers(); }
4dc9hkyq1#
你不能这样写查询。想象一下有人把 tfemail 此文本字段:
tfemail
"Joe' OR FALSE"
让我们看看这会对sql查询产生什么影响:
DELETE FROM user WHERE Name = 'Joe' OR FALSE;
再见,数据库!有些数据库允许您在数据库引擎运行的服务器上执行一些内容。这意味着这个技巧可以用来完全破解机器或者完全格式化磁盘。再见,整个机器。这也意味着你的 executeQuery 方法需要删除-抽象(“这里有一些sql,请运行它”)很少有用(因为它不能包含任何用户输入),并诱使您编写安全漏洞。溶液的配制方法如下:
executeQuery
PreparedStatement ps = con.prepareStatement("DELETE FROM user WHERE Name = ?"); ps.setString(1, "Joe"); ps.executeUpdate();
这就解决了你的问题,而且很安全- ps.setString(1, "Joe' OR FALSE"); 现在不再是一个问题(db引擎或jdbc驱动程序保证它会处理这个问题;其效果是删除用户表中的条目,该条目的字面意思是“joe”或“false”)。此外,在数据库中存储密码是不可接受的策略;解决方案是bcrypt:使用专门为存储密码而设计的哈希算法。
ps.setString(1, "Joe' OR FALSE");
von4xj4u2#
String query = "DELETE FROM user WHERE Name ='" + tfemail.getText() + "'"; ^ ^ |___________add___________|
2条答案
按热度按时间4dc9hkyq1#
你不能这样写查询。想象一下有人把
tfemail
此文本字段:让我们看看这会对sql查询产生什么影响:
再见,数据库!
有些数据库允许您在数据库引擎运行的服务器上执行一些内容。这意味着这个技巧可以用来完全破解机器或者完全格式化磁盘。再见,整个机器。
这也意味着你的
executeQuery
方法需要删除-抽象(“这里有一些sql,请运行它”)很少有用(因为它不能包含任何用户输入),并诱使您编写安全漏洞。溶液的配制方法如下:
这就解决了你的问题,而且很安全-
ps.setString(1, "Joe' OR FALSE");
现在不再是一个问题(db引擎或jdbc驱动程序保证它会处理这个问题;其效果是删除用户表中的条目,该条目的字面意思是“joe”或“false”)。此外,在数据库中存储密码是不可接受的策略;解决方案是bcrypt:使用专门为存储密码而设计的哈希算法。
von4xj4u2#