为了账号安全,请及时绑定邮箱和手机立即绑定

使用后格雷SQL副本JDBC防止SQL注入

使用后格雷SQL副本JDBC防止SQL注入

暮色呼如 2022-09-28 10:07:51
我有以下代码来使用PG COPY将表格下载为文件:    public void download(String table, Writer responseWriter) throws SQLException, IOException {        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);        }    }显然,此代码容易发生 SQL 注入(表参数是从弹簧 REST 控制器传递的)。当然,我可以做一些手动卫生,但如果有一个“准备声明”的方式在CopyManager中做到这一点,我会更喜欢它。使用春季Jdbc模板的奖励积分。
查看完整描述

1 回答

?
德玛西亚99

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);

    }

}


查看完整回答
反对 回复 2022-09-28
  • 1 回答
  • 0 关注
  • 223 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信