谁能给我解释一下我在oracle apex中的代码,它似乎容易受到sql注入的攻击。看起来DBMS_SQL.EXECUTE(VR_CURS)易受攻击。我的问题是如何利用这个查询,以及如何修补这个bug?如果我使用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;发布于 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)对其进行包装,以指示该值是可信的。
https://stackoverflow.com/questions/61941610
复制相似问题