首页 > 解决方案 > Oracle - 动态选择过程

问题描述

我需要一个带有动态选择语句的存储过程,在我的情况下,只在选择中添加所需的列名。这是我创建的,但我不确定 SQL 注入是否安全:

CREATE OR REPLACE PROCEDURE MySchema.Search(
columns IN VARCHAR2,
res_out OUT SYS_REFCURSOR)

IS
BEGIN
 OPEN res_out FOR
 'SELECT ' || columns ||' FROM MySchema.Table1';

END Search;

这很好还是不安全?在阅读所有示例时,我没有注意到任何像这样简单的事情,但它确实有效。如果 SQL 注入不安全,请告诉我应该怎么做。提前感谢您的帮助!

标签: stored-proceduresoracle11g

解决方案


我会建议您像这样使用您的 PL/SQL:在下面的 PL/SQL 中,它确保如果任何 SQL 注入语句试图调用它,它将停止。

CREATE OR REPLACE PROCEDURE MySchema.Search(
columns IN VARCHAR2,
res_out OUT SYS_REFCURSOR)

IS
v_columns VARCHAR2(4000);
BEGIN
select listagg(column_name,',') within group(order by 1)
  INTO v_columns
  from all_tab_columns
 where owner = 'MYSCHEMA'
   and table_name = 'TABLE1'
   and column_name in (select regexp_substr(columns,'[^,]+', 1, level)
                         from dual
                      connect by regexp_substr(columns, '[^,]+', 1, level) is not null
                      );

 OPEN res_out FOR
 'SELECT ' || v_columns ||' FROM MySchema.Table1';

END Search;

推荐阅读