stored-procedures - Oracle - 动态选择过程
问题描述
我需要一个带有动态选择语句的存储过程,在我的情况下,只在选择中添加所需的列名。这是我创建的,但我不确定 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 注入不安全,请告诉我应该怎么做。提前感谢您的帮助!
解决方案
我会建议您像这样使用您的 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;
推荐阅读
- visual-studio-code - VSC 状态栏上的 Live Server 图标
- python - 如何让我的助手通过某个短语激活
- vue.js - 将 vuex-persistedstate 与 vuejs-enterprise-boilerplate 集成
- dialogflow-es - 如何在 Chatbot 框架中使用自定义逻辑
- javascript - 如何用针制作量表
- xml - 如果 id 重复,则使用 xslt 更改重复的 id
- php - 我怎样才能用 CSV 文件解决这个逗号问题?
- python - 停止函数运行两次
- c++ - QT 中用于 gstreamer 视频传输的 C++ UDP 侦听器
- webpack - 将ckeditor集成到jhipster实体网页