Я могу заметить пару проблем здесь:
- Нет условия
authid
, поэтому по умолчанию definer
execute immediate
с конкатенацией строк
Это означает, что любой, имеющий права на выполнение процедуры, работает с полными правами владельца процедуры. А при конкатенации строк существует риск внедрения SQL. Да, даже с числами .
Также вы можете получить следующее значение последовательности, присвоив его. Нет необходимости в execute immediate
.
Чтобы быть в безопасности, я бы внес следующие изменения:
- Добавить
authid current_user
- Явно
to_char
приращение , избегая атак на этот
Предоставление:
create sequence ordering_seq
start with 100;
select ordering_seq.nextval from dual;
NEXTVAL
100
CREATE OR REPLACE PROCEDURE reset_sequence
authid current_user
IS
l_value NUMBER;
BEGIN
l_value := ordering_seq.nextval;
EXECUTE IMMEDIATE 'ALTER SEQUENCE ordering_seq INCREMENT BY -' ||
to_char ( l_value, 'TM', 'NLS_Numeric_Characters = ''.,''' ) ||
' MINVALUE 0';
l_value := ordering_seq.nextval;
EXECUTE IMMEDIATE 'ALTER SEQUENCE ordering_seq INCREMENT BY 1 MINVALUE 0';
END;
/
exec reset_sequence;
select ordering_seq.nextval from dual;
NEXTVAL
1
Конечно, использование прав вызывающего означает, что вы должны выдать alter sequence
права тому, кто звонит. Что приносит свои проблемы. Чтобы преодолеть это, вы можете использовать Контроль доступа на основе кода .