所以我正在 java 网络应用程序上构建一个注册/登录表单,我想让它近乎完美。我的意思是安全、快速、干净的代码。
所以现在我的代码就是这样。我有一个 User 的私有(private)结构,带有 setter 和 getter 以及一种注册方法:
db dbconn = new db();
Connection myconnection = dbconn.Connection();
String sqlString = "INSERT INTO users (name, password) VALUES ('"+Name+"','"+Password+"')";
try {
Statement myStatement = null;
myStatement.executeUpdate(sqlString);
myStatement.close();
myconnection.close();
}
catch (SQLException e) {
System.err.println(e);
}
但我听说(不确定)像这样运行 SQL 查询是不好的例子,我不应该那样做?所以我只是想知道,将用户注册到我的 MySQL 数据库中的最佳方法是什么?使用程序?还是像这样使用 Statement 也有效?
最佳答案
如果您只使用 JDBC(而不是 OR 映射器),出于安全原因,您应该使用准备好的语句。您这样做的方式允许 SQL 注入(inject)。
问题:如果您像现在这样连接参数值,可能会改变查询。
示例:如果 Name
的值为 x','y');DELETE FROM users;SELECT * FROM users WHERE name in ('whatever
查询将变为:
INSERT INTO users (name, password) VALUES ('x','y');DELETE FROM users;SELECT * FROM users WHERE name in ('whatever', 'password')
现在执行该查询,您可能想知道所有用户都去了哪里。
使用 PreparedStatement
语句将如下所示:
PreparedStatement pst = myconnection.prepareStatement("INSERT INTO users (name, password) VALUES (?,?)");
pst.setString(1, Name); //btw, Java coding conventions state it should be "name" instead of "Name"
pst.setString(2, Password); //your password should be hashed and salted btw!
pst.executeUpdate();
注意在声明中没有必要使用单引号。 PreparedStatement
将为您处理该问题,并转义值以防止注入(inject)。
第二个想法(从设计的角度来看):您可能会考虑将用户注册等与保存数据的用户对象分开(请参阅单一职责原则)。这只是一个建议,肯定还有其他人不同意(有有效的论据,但通常取决于情况)。
关于Java Web App插入mysql,最好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35921869/