将Java连接传递给多个公共函数的sql安全问题
鉴于以下功能:
public void foo(Connection conn)
{
PreparedStatement statement = conn.prepareStatement("Select a from table");
statement.execute();
}
使用在别处实例化的Connection
对象(应用程序的外部或内部都不重要)。允许应用程序的API中的函数接受未经验证的Connection
,是否会出现任何安全问题?例如,未经验证的连接能否诱使我的应用程序运行恶意查询
# 1 楼答案
是的,
Connection
对象可能会运行恶意查询而且:不,我不知道如何防止这种情况,因为执行查询的代码需要
Connection
(或DataSource
)某些类型的连接池就是这样使用的。从连接池中可以得到一个
Connection
对象,其中open()
和close()
方法不能按预期工作(因为池希望在需要时关闭连接)。因此,连接池也可以覆盖其他方法(因为Connection
只是一个接口)# 2 楼答案
仔细想想,注入该连接对象的任何东西都已经有了对该连接对象的引用。无论是否使用您的代码,它都可以自行运行恶意查询