我正在用java编写基本的数据库管理系统。当用户提交用户名和密码时,程序将在数据库中搜索提交的数据是否正确:
result = stat.executeUpdate("SELECT username,password FROM DB" + "WHERE (username = '"+loginusr.getText()+"',password = '"+loginpwd.getText()+"')");
显然,=符号附近有错误。有人可以帮忙解决这个问题吗?
提前致谢
答案 0 :(得分:5)
那里有几个问题。
首先,您需要WHERE
之前的空格:
result = stat.executeUpdate("SELECT username,password FROM DB" + "WHERE (username = '"+loginusr.getText()+"',password = '"+loginpwd.getText()+"')");
// Here ---------------------------------------------------------^
但更根本的问题是,您已将该代码广泛用于SQL injection攻击和失败。使用PreparedStatement
,不要连接字符串以放入参数。这里有一个很好的说明原因:
最后:将密码存储在数据库中并不是最佳做法。相反,通常您存储密码的加密哈希,而不是密码本身(例如,SHA-256是一种哈希技术)。然后,当用户进行身份验证时,您将他们提供给您的密码作为密码进行哈希,并将其与您存储的哈希值进行比较。这样,就无法从数据库中检索密码。
答案 1 :(得分:2)
除了一般建议不要对SQL查询使用字符串连接,而是使用参数时,源代码中存在错误:…DB" + "WHERE…
没有空格。
答案 2 :(得分:1)
您的文字扩展为:
SELECT username,password FROM DBWHERE (username = ...
您需要在字符串中添加空格并使用AND
而不是,
,例如:
result = stat.executeUpdate("SELECT username,password FROM DB " +
"WHERE (username = '"+loginusr.getText()+"' AND password = '"+loginpwd.getText()+"')");
但是,请记住,如果这是真实代码的示例,则至少还有两个主要的安全问题也应该解决。