【问题标题】:SEVERE: null com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'Admin' in 'where clause'严重:空 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:“where 子句”中的未知列“Admin”
【发布时间】:2018-01-28 06:21:38
【问题描述】:

我仍然不知道为什么我的 SQL 语句不能在我的 JAVA 程序上运行,但它们却在 Workbench 上运行!

我正在尝试制作一个用户可以注册或登录的界面。 要注册,我有这个错误:

严重:空 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:“字段列表”中的未知列“管理员”

我在数据库上有一个用户名“Admin”,可以在工作台上看到

此外,如果我单击清除按钮,然后键入确定,它不会给出注册错误,我可以看到我拥有的数据表,因为它跳过了尝试注册代码的部分,因为字符串是空的并运行 else 块;

(MyUserApp 类上的代码)

private void RegisterButtonActionPerformed(java.awt.event.ActionEvent evt) {                                               
    String username, password, address, dob;
    try {
        // TODO Register very important too!
        username = newUsernameField.getText();
        password = passwordField2.getText();
        address = addressField.getText();
        dob = dateofbField.getText();
if( username == null || password == null || username.isEmpty() || password.isEmpty() || password.length() < 6 ) 
            jLabel6.setText("The information you typed in is not valid. ");
        else{
                this.app.registerUser(app, username, password, dob, address);

                }
        String u = this.app.showDB(app);
        showTableDB.setText(u);
    } catch (SQLException ex) {
        Logger.getLogger(UserAppUI.class.getName()).log(Level.SEVERE, null, ex);
    }
}                

(UI 类上的代码)

public void registerUser(MyUserApp app, String username, String pw, String dob, String address) throws SQLException{

    String sb = "INSERT INTO javabase.user (iduser, username, password, date_of_birth, address)\n VALUES (" + app.incID()+", "+username+", "+pw+", "+dob+", "+address +");";
    PreparedStatement statement = app.getCon().prepareStatement(sb);
    statement.execute();
}

当我尝试登录时会发生这种情况 https://prnt.sc/gajpns

当我尝试注册时会发生这种情况: https://prnt.sc/gak3uh

让用户登录的代码基本上是这样的:

this.app.login(this.app, username, pw); 

在调用这个的 UI 类上:

 public void login(MyUserApp app, String user, String pw) throws SQLException{

    String sql = "SELECT * FROM javabase.user WHERE username = "+ user +" and password = "+pw+";";
    PreparedStatement statement = app.getCon().prepareStatement(sql);
    statement.execute();
}

【问题讨论】:

  • 学习使用查询参数。不要修改查询字符串。当你这样做时,你可能会遇到难以调试的问题,比如这个。
  • 什么意思?字符串与 + 的连接?
  • 我之前做过 stringbuilder 但它不起作用,然后我回来做整个字符串以查看错误是什么,因为当我将命令放在工作台上时,它可以工作......但是在这里它没有......不知道为什么,在此先感谢
  • 现在请检查我的答案,并告诉我它是否良好并且可以防止 SQL 注入,谢谢! @GordonLinoff
  • 当保存密码验证器时,仅使用哈希函数是不够的,并且仅添加盐对提高安全性无济于事。而是使用随机盐在 HMAC 上迭代大约 100 毫秒,然后将盐与哈希一起保存。使用PBKDF2Rfc2898DeriveBytespassword_hashBcryptpasslib.hash 等函数或类似函数。关键是让攻击者花费大量时间通过蛮力查找密码。

标签: java mysql sql jdbc


【解决方案1】:

在 mysql 中,您必须用单引号或双引号将字符串文字(例如用户名或密码)括起来。如果你不这样做,那么 mysql 会将它们解析为列名。

String sql = "SELECT * FROM javabase.user WHERE username = '"+ user +"' and password = '"+pw+"';";

您必须根据我上面提供的解决方案编辑所有其他语句。

但是,请考虑 Gordon 的建议并使用参数而不是字符串连接。

【讨论】:

  • 非常感谢!
  • 我使用的是字符串生成器,是的,但是我回到了旧的 + 连接,因为我不知道还能做什么,然后我不断尝试不同的方法来隔离问题......我坚持关于''报价,但忘记了我怎么能这样做 XD 太傻了 非常感谢!我知道问题应该出在 sql 语句上 :)
【解决方案2】:

我使用了 SQL 参数

public boolean registerUser(MyUserApp app, String username, String pw, String dob, String address) throws SQLException{

    String sb = "INSERT INTO user (iduser, username, password, date_of_birth, address)\n VALUES ( ?, ?, ?, ?, ?);";
    PreparedStatement statement = app.getCon().prepareStatement(sb);
    statement.setInt(1, app.incID());
    statement.setString(2, username);
    statement.setString(3, cryptWithMD5(pw));
    statement.setString(4,dob);
    statement.setString(5,address);

    boolean status = statement.execute();
    return status;

     }

【讨论】:

  • 当保存密码验证器时,仅使用 MD5 等哈希函数是不够的,仅添加盐对提高安全性无济于事。
  • @zaph 关于 sql 注入,够吗?而密码,我该怎么办,使用不同的散列?我担心它必须适合数据库及其 varchar25 ,请帮助
  • @zaph 你的意思是验证用户输入的内容,如果它有一个大写字母,或者至少有 6 个长度?即使注册我做 6 长度测试,你能给我一些你的意思的提示吗? :)
  • 正确处理密码有两个方面:对开发人员的简单实施或对用户的安全性。 IMO 道德上正确的选择是用户的安全。 1. 这是您的选择:用户安全或 varchar25。 2. MD5 提供的安全性不足,对于 Java,最好的选择可能是 NIST 推荐的 PNKFD2。 3. WRT sql注入:Little Bobby Tables.
  • @zaph PBKDF2 ,你的意思是 :) 我看到了你的 cmets,谢谢!就可以了
猜你喜欢
  • 2015-11-11
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多