我正在使用prepareStatement()
来阻止sql注入。我现在遇到的问题是,使用下面的方法,我可以getConnection().prepareStatement()
然后构建我的查询,但我需要尝试捕获每次调用getConnection()
并在finally
中关闭它1}}阻止。 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);
}
答案 0 :(得分:1)
我会使用连接池而不是每次创建连接和关闭。
我们应该遵循一些步骤来使用tomcat服务器创建连接池
步骤-1。使用数据库连接详细信息更新TOMCAT_ROOT_DIR \ conf \ server.xml文件,如下所示:
<?xml version='1.0' encoding='utf-8'?>
...
<GlobalNamingResources>
...
<Resource name="jdbc/JCGExampleDB"
global="jdbc/JCGExampleDB"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
auth="Container"
type="javax.sql.DataSource"
username="test"
password="test"
driverClassName="com.mysql.jdbc.Driver"
description="JCG Example MySQL database."
url="jdbc:mysql://localhost:3306/JCGExampleDB"
maxTotal="10"
maxIdle="10"
maxWaitMillis="10000"
removeAbandonedTimeout="300"
defaultAutoCommit="true" />
...
</GlobalNamingResources>
第2步: 使用Spring的JdbcTemplate - 您可以编写数据库连接实用程序类并获取如下所示的连接(此步骤可以通过多种方式完成..如context.xml文件或web.xml文件或如下所示)
@Bean
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(dataSource());
}
@Bean
public DataSource dataSource() {
DataSource dataSource = new com.mchange.v2.c3p0.ComboPooledDataSource();
try {
JndiTemplate jndiTemplate = new JndiTemplate();
dataSource = (DataSource)jndiTemplate.lookup("java:comp/env/jdbc/JCGExampleDB");
} catch (NamingException e) {
log.error("Unable to configure datasource: " + e.getStackTrace());
}
return dataSource;
}
<强> EDIT1:强> 使用Singleton类 - 没有JdbcTemplate:您可以在需要时从Singleton类获得连接。
public class DatabaseConnectionManager {
DataSource ds;
public void init() {
InitialContext initialContext = new InitialContext();
ds = (javax.sql.DataSource)initialContext.lookup("jdbc/JCGExampleDB");
}
public Connection getConnection() {
if(ds == null) init();
return ds.getConnection();
}
}
希望这会有所帮助......