1 回答
TA贡献1770条经验 获得超3个赞
除了一揽子SQL注入(恶意人员试图执行诸如向命令中添加语句之类的操作)之外,还有另一个问题。由于您的代码允许运行任何有效的表名,因此它仍然存在泄露架构中任何表中包含的数据的风险。DELETECOPY
因此,这里安全的做法可能是维护您希望允许用户访问的表的白名单。任何与列表不匹配的输入表名称都将被拒绝。假设您的表列表驻留在 中,我们可以对您的代码进行以下更改:List
public void download(String table, Writer responseWriter) throws SQLException, IOException {
// get list of all allowed tables
List<String> fileList = getAllowedTables();
if (!fileList.contains(table)) {
throw new IllegalAccessException("Someone tried to access a forbidden table.");
}
try (Connection conn = dataSource.getConnection()) {
CopyManager copyManager = new CopyManager(conn.unwrap(BaseConnection.class));
// SQL Injection can happen here!
String statement = "COPY " + table + " TO STDOUT WITH NULL ''";
copyManager.copyOut(statement, responseWriter);
}
}
添加回答
举报