【发布时间】: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 毫秒,然后将盐与哈希一起保存。使用
PBKDF2、Rfc2898DeriveBytes、password_hash、Bcrypt、passlib.hash等函数或类似函数。关键是让攻击者花费大量时间通过蛮力查找密码。