【发布时间】:2017-08-08 18:54:48
【问题描述】:
我使用prepareStatement() 来防止sql 注入。我现在遇到的问题是,使用下面的方法,我可以执行getConnection().prepareStatement() 然后构建我的查询,但我需要尝试捕获对getConnection() 的每次调用并在finally 块中关闭它。 createStatement().execute() 似乎更好,因为我可以让客户端传入查询然后在一个地方处理 try-catch-finally,但它不会阻止 sql 注入。通常最好的做法是什么?或者有没有其他方法来构建可以防止sql注入的查询?
private static Connection getConnection() throws SQLException, URISyntaxException {
URI dbUri = new URI(System.getenv("DATABASE_URL"));
String username = dbUri.getUserInfo().split(":")[0];
String password = dbUri.getUserInfo().split(":")[1];
String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ':' + dbUri.getPort() + dbUri.getPath();
return DriverManager.getConnection(dbUrl, username, password);
}
【问题讨论】:
-
您应该使用经过充分验证的连接池,而不是创建自己的连接池。检查连接,将其传递给数据访问对象,在 finally 块中关闭方法范围内的所有其他 JDBC 资源,并将连接返回到池中
-
@duffymo 我不太明白。这是我第一次在服务器端编写 Java。你能提供一些例子吗
-
您会将应用程序部署到什么位置?雄猫?弹簧靴?老板娘?所有都内置了连接池。我建议使用它们。
-
@duffymo Tomcat。谢谢。让我谷歌一下
-
必须自己关闭所有资源(Connection、Statement、ResultSet)会导致很多容易出错的样板代码。所以你绝对应该看看 Apache Commons DbUtils 或 Spring JDBC 来做到这一点。