Java Web App插入mysql,最好的方法

标签 java mysql

所以我正在 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/

相关文章:

java - 从 Java 6 升级到 Java 7 时 native 堆上出现 OutOfMemoryError

mysql - sql:使用单个查询在另一列中选择具有相同列值的行

php - MySQL 和 fputcsv PHP 字段定界符不起作用

php - 去掉逗号分隔值

java - 如何避免在基于 Java 的配置中注入(inject) Autowiring 依赖项时出现错误?

java - 如何自动生成SQL语句而不触发Findbugs的SQL注入(inject)警告?

java - Java中jpanel添加动态按钮

mysql - 如何从 mySQL 中的每个对话中获取最后一条消息?

php - 在定制广告系统中跟踪印象/点击的最佳方法?

java - JTar 从 .tar 文件中提取文件