提问人:potitit 提问时间:5/22/2020 更新时间:5/26/2020 访问量:940
如何防止 SQL 注入 Oracle Apex
how to prevent sql injection oracle apex
问:
有人可以向我解释一下我在 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;
答:
0赞
Kris Rice
5/26/2020
#1
DBMS_SQL,立即执行,...它们本身并不脆弱,因为它们是实用程序,如果使用不当,它们的使用非常容易受到攻击。例如,有关安全使用 execute immediate 的示例,请参阅以下答案:Oracle - 为什么在存储过程中允许 EXECUTE IMMEDIATE ?
只有 2 种方法可以使此代码“安全”。
a) 来电者受到高度信任。这意味着此函数的任何和所有用法都是已知的,并且该调用方中用于构建 sql 语句的机制是可信的。甚至可能添加调用堆栈检查以拒绝可能来自的未知调用方owa_util.who_called_me
b) 在与DBMS_SQL一起使用之前对P_IN_SQL_STATEMENT进行完整解析。解析。这意味着编写一个完整的 sql 和 pl/sql 解析器来分析潜在注入的输入。
当且仅当满足这两件事之一时,它才能用DBMS_ASSERT包裹。NOOP(P_IN_SQL_STATEMENT) 指示该值是可信的。
评论