如何防止sql注入oracle apex

问题描述 投票:0回答:1

有人可以向我解释一下我在oracle apex中的代码,它似乎容易受到sql注入的攻击。似乎DBMS_SQL.EXECUTE(VR_CURS)容易受到攻击。我的问题是如何利用此查询,以及如何修复此错误?如果我使用dbms.assert呢?这样更安全吗?这是我的查询:

  FUNCTION SQL_TO_SYS_REFCURSOR (
   P_IN_SQL_STATEMENT   CLOB,
   P_IN_BINDS           SYS.DBMS_SQL.VARCHAR2_TABLE
    ) RETURN SYS_REFCURSOR AS
  VR_CURS         BINARY_INTEGER;    VR_REF_CURSOR   SYS_REFCURSOR;
  VR_EXEC         BINARY_INTEGER;
  * TODO make size dynamic */
  VR_BINDS        VARCHAR(100);
  BEGIN
  VR_CURS         := DBMS_SQL.OPEN_CURSOR;
  DBMS_SQL.PARSE(
      VR_CURS,
      P_IN_SQL_STATEMENT,
      DBMS_SQL.NATIVE
  );
  IF P_IN_BINDS.COUNT > 0 THEN
      FOR I IN 1..P_IN_BINDS.COUNT LOOP
      /* TODO find out how to prevent ltrim */
          VR_BINDS   := LTRIM(
              P_IN_BINDS(I),
              ':'
        );
          DBMS_SQL.BIND_VARIABLE(
              VR_CURS,
              VR_BINDS,
              V(VR_BINDS)
          );
      END LOOP;
  END IF;

  VR_EXEC         := DBMS_SQL.EXECUTE(VR_CURS);
VR_REF_CURSOR   := DBMS_SQL.TO_REFCURSOR(VR_CURS);
RETURN VR_REF_CURSOR;
EXCEPTION
  WHEN OTHERS THEN
      IF DBMS_SQL.IS_OPEN(VR_CURS) THEN
          DBMS_SQL.CLOSE_CURSOR(VR_CURS);
      END IF;
      RAISE;
END;
oracle plsql oracle-apex sql-injection
1个回答
0
投票

DBMS_SQL,EXECUTE IMMEDIATE,...由于它们本身是实用程序,因此自身不易受到攻击,如果使用不当,则其易受攻击性很高。例如关于安全使用立即执行的示例,请参见以下答案:Oracle - Why is EXECUTE IMMEDIATE allowed in stored procedures?

只有两种方法可以使此代码“安全”。

a)呼叫者受到高度信任。这意味着该函数的所有用法都是已知的,并且调用方中用于构建sql语句的机制是可信任的。甚至可以添加一个呼叫堆栈检查以拒绝未知的呼叫者,这可以从owa_util.who_called_me

中获得

b)对P_IN_SQL_STATEMENT的完整解析,然后再与DBMS_SQL.PARSE一起使用。这意味着编写一个完整的sql和pl / sql解析器以分析潜在注入的输入。

IF,并且仅当满足这两个条件之一时,才可以使用DBMS_ASSERT.NOOP(P_IN_SQL_STATEMENT)对其进行包装以指示该值是受信任的。

© www.soinside.com 2019 - 2024. All rights reserved.