为什么以下sql-statement不能与JDBC一起使用?

时间:2014-04-24 08:01:50

标签: java sql jdbc

我正在用java编写基本的数据库管理系统。当用户提交用户名和密码时,程序将在数据库中搜索提交的数据是否正确:

    result = stat.executeUpdate("SELECT username,password FROM DB" + "WHERE (username = '"+loginusr.getText()+"',password = '"+loginpwd.getText()+"')");

显然,=符号附近有错误。有人可以帮忙解决这个问题吗?

提前致谢

3 个答案:

答案 0 :(得分:5)

那里有几个问题。

首先,您需要WHERE之前的空格:

result = stat.executeUpdate("SELECT username,password FROM DB" + "WHERE (username = '"+loginusr.getText()+"',password = '"+loginpwd.getText()+"')");
// Here ---------------------------------------------------------^

但更根本的问题是,您已将该代码广泛用于SQL injection攻击和失败。使用PreparedStatement,不要连接字符串以放入参数。这里有一个很好的说明原因:

enter image description here

来自:http://xkcd.com/327/

最后:将密码存储在数据库中并不是最佳做法。相反,通常您存储密码的加密哈希,而不是密码本身(例如,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()+"')");

但是,请记住,如果这是真实代码的示例,则至少还有两个主要的安全问题也应该解决。