您好我正在尝试为一个简单的验证方法编写一段代码作为MVC的一部分。
目前SQL并不是作为预处理语句编写的,所以显然它存在SQL注入的风险,因此任何有关将SQL编写为预准备语句的帮助都会非常有用。
用户模型中的方法。
public boolean getInfo() {
try {
DBAccess dbAccess = new DBAccess();
String sql = "SELECT username, password FROM owner WHERE username = '" + this.username
+ "'AND password = '" + this.password + "';";
dbAccess.close();dbAccess.executeQuery(sql);
dbAccess.close();
return true;
} catch (Exception e) {
return false;
}
}
我想得到SQL查询生成的结果集的大小,如果它的大小为1则返回true,否则为false。
如果您需要更多关于MVC其余部分的信息,我会在这里发布。
答案 0 :(得分:1)
而是选择字段用户名和密码,您可以选择它们的计数,然后引用该值。
所以你的SQL查询是:
SELECT count(*) FROM owner WHERE username = '" + this.username
+ "'AND password = '" + this.password + "';
这将返回匹配记录的数量,如果number大于0或等于1,则验证它们。
答案 1 :(得分:1)
在不知道DBAccess类的详细信息的情况下,我们无法告诉您如何执行此操作。我猜它会返回一个List(但这只是一个猜测,仅此而已)。如果是这种情况,您可以通过list.size()
检查列表的大小,或查看它是否至少返回了!list.isEmpty()
的1个结果。当然,如果它不是一个列表,那么这将不起作用。
你肯定需要切换到准备好的语句。有关示例,请参阅this SO post。
旁注:如果此方法返回一个指示用户是否存在的布尔值,则不应将其称为getInfo()
!像userExists()
这样的东西会更有意义。
答案 2 :(得分:1)
只需返回ResultSet#next()
的结果,假设UNIQUE
上存在username
约束。如果没有下一条记录,则返回false
。
这是一个具体的启动示例,稍微重写以修复潜在的SQL注入攻击漏洞,资源泄漏和线程安全问题,如代码所示。此外,更改的SQL查询应该强制您在保存到DB之前对密码进行MD5哈希(您不希望将密码明文存储在DB中)。
public boolean exist(String username, String password) throws SQLException {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
boolean exist = false;
try {
connection = database.getConnection();
statement = connection.prepareStatement("SELECT id FROM owner WHERE username = ? AND password = MD5(?)");
statement.setString(1, username);
statement.setString(2, password);
resultSet = statement.executeQuery();
exist = resultSet.next();
} finally {
if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
}
return exist;
}
答案 3 :(得分:0)
关于防止sql注入的问题,如果你想开始使用“ORM like”库,你可以使用myibatis创建预准备语句。 Myibatis是一个数据映射器,您可以从中创建一个相对简单的ORM。随着你越来越勇敢,你可以转向休眠或JPA。