没有动态SQL的自定义SQL列公式

时间:2017-08-31 20:28:29

标签: oracle sql-injection dynamic-sql

我们有一个程序允许用户将原始未修改的输入数据映射到标准化的最终表。

一般来说,这是一个简单的一对一匹配,不需要任何特殊逻辑。

例如; raw_table.raw_col_1将映射到final_table.col_1,raw_table.raw_col_2将映射到final_table.col_2等。

但是,一位客户希望能够将final_table.col_3映射如下:

case 
    when (raw_col_1 = 'S12' and raw_col_2 = 'D18') or raw_col_3 is not null then raw_col_3      
    else 'GF17' 
end 

其他类似的请求也在那里。

在加载final_table时,我可以使用动态SQL轻松实现此目的。但是,这让我们对SQL注入攻击持开放态度。

有没有办法可以在不诉诸动态SQL的情况下允许这种类型的自定义字段映射?

1 个答案:

答案 0 :(得分:1)

您正在进入允许开发工具在运行时向最终用户公开的领域 - 在某些时候,配置变得足够复杂,需要或模仿代码的强大功能。你有几个选择:

1)提供可以考虑用例的用户界面 - 例如简化的查询构建器。并确保所有单个组件都经过验证或绑定。无论这是否可行,都将以复杂程度,以及您希望在此类用户界面中投入多少精力来结束。

2)提供管理级别的定制,允许客户提供更复杂的逻辑。由于这是一个Oracle数据库,您可以将它们作为可以返回值的PL / SQL函数提供。

第二个选项可以通过用户界面完成,也可以通过后端加载程序完成。但是,在任何一种情况下,您都应确保管理员了解这是具有高权限的功能,并审核进入的内容以及有权访问的内容。

您也可以这样配置,使得包在有限模式中具有更多有限的权限(并且使用definer权限调用),尽管最好的方法取决于您所使用的数据库的版本使用。 12c在该领域提供了更多的安全功能。