【问题标题】:Oracle - Dynamic select procedureOracle - 动态选择过程
【发布时间】:2018-10-23 17:36:46
【问题描述】:

我需要一个带有动态选择语句的存储过程,在我的例子中,只在选择中添加所需的列名。这是我创建的,但我不确定 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-procedures oracle11g


    【解决方案1】:

    我会建议你像这样使用你的 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;
    

    【讨论】:

    • 这看起来比我的代码好一点,谢谢。虽然它不是一个简单的;)
    猜你喜欢
    • 2013-05-09
    • 1970-01-01
    • 2019-09-19
    • 2018-03-12
    • 1970-01-01
    • 2012-12-02
    • 2020-10-08
    • 2015-05-02
    • 1970-01-01
    相关资源
    最近更新 更多