Oracle - процедура динамического выбора - PullRequest
0 голосов
/ 14 мая 2018

Мне нужна хранимая процедура с динамическим оператором select, в моем случае я добавляю только имена нужных столбцов в select.Это то, что я создал, но я не уверен, безопасно ли это для 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-инъекций, пожалуйста, покажите мне, как я должен это сделать.Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 14 мая 2018

Я предлагаю вам использовать ваш 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...