首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止sql注入oracle顶点

如何防止sql注入oracle顶点
EN

Stack Overflow用户
提问于 2020-05-22 02:43:55
回答 1查看 440关注 0票数 0

谁能给我解释一下我在oracle apex中的代码,它似乎容易受到sql注入的攻击。看起来DBMS_SQL.EXECUTE(VR_CURS)易受攻击。我的问题是如何利用这个查询,以及如何修补这个bug?如果我使用dbms.assert呢?这是不是更安全了?下面是我的问题:

代码语言:javascript
复制
  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;
EN

回答 1

Stack Overflow用户

发布于 2020-05-26 19:30:39

DBMS_SQL,立即执行,...它们本身并不脆弱,因为它们是实用程序,当使用不当时,它们的使用是高度脆弱的。例如,在安全使用execute immediate时,请参阅以下答案:Oracle - Why is EXECUTE IMMEDIATE allowed in stored procedures?

只有两种方式可以让代码变得“安全”。

a)调用者是高度信任的。这意味着该函数的任何用法都是已知的,并且调用程序中用于构建sql语句的机制是可信的。也许甚至到了添加调用堆栈检查来拒绝未知调用者的地步,这可以从owa_util.who_called_me获得

B)在与DBMS_SQL.PARSE一起使用之前对P_IN_SQL_STATEMENT进行完整的解析。这意味着要编写一个完整的sql和pl/sql解析器来分析潜在注入的输入。

如果为,并且仅当满足这两个条件中的一个时,则可以用DBMS_ASSERT.NOOP(P_IN_SQL_STATEMENT)对其进行包装,以指示该值是可信的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61941610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档