Oracle SQL查询的安全问题
我正在处理一个Oracle SQL查询。Fortify SCA正在标记查询以进行特权管理:默认函数或过程权限。有人能帮我找到正确的查询方法吗 我要使用的查询:Oracle SQL查询的安全问题,oracle,plsql,Oracle,Plsql,我正在处理一个Oracle SQL查询。Fortify SCA正在标记查询以进行特权管理:默认函数或过程权限。有人能帮我找到正确的查询方法吗 我要使用的查询: CREATE OR REPLACE PROCEDURE "reset_sequence" IS l_value NUMBER; BEGIN EXECUTE IMMEDIATE 'SELECT "ordering_seq".nextval FROM dual' INTO l_value; EXECUTE IMMEDIATE 'A
CREATE OR REPLACE PROCEDURE "reset_sequence"
IS
l_value NUMBER;
BEGIN
EXECUTE IMMEDIATE 'SELECT "ordering_seq".nextval FROM dual' INTO l_value;
EXECUTE IMMEDIATE 'ALTER SEQUENCE "ordering_seq" INCREMENT BY -' || l_value || ' MINVALUE 0';
EXECUTE IMMEDIATE 'SELECT "ordering_seq".nextval FROM dual' INTO l_value;
EXECUTE IMMEDIATE 'ALTER SEQUENCE "ordering_seq" INCREMENT BY 1 MINVALUE 0';
END;
:
权限管理:默认包权限
PLSQL/TSQL
摘要
没有AUTHID
子句的包默认为AUTHID定义器
解释
PL/SQL包可以是AUTHID定义程序
或AUTHID当前用户
。具有定义者权限的包中的函数和过程在定义包的用户权限下执行。这可以允许更新和访问特定的数据片段,而无需授予对整个表或模式的访问权限。在具有调用方权限的包中,或在调用它们的用户的权限下执行函数和过程。这不允许用户访问其尚未访问的数据。如果未提供AUTHID
子句,则包默认为定义者的权限
包通常由SYS或另一个高度特权的用户定义,这使得对代码的任何利用都可能更加危险
因此,您似乎只需要添加,即使这只是再次明确说明默认值(当然,您应该建立正确的值)
不相关,但
select
都不需要是动态的-您可能已经选择这样做,这样它看起来与alter
语句更一致,但这不是必需的;他们甚至不需要再被挑选了-你可以这样做:
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 -' || l_value || ' MINVALUE 0';
l_value := "ordering_seq".nextval;
EXECUTE IMMEDIATE 'ALTER SEQUENCE "ordering_seq" INCREMENT BY 1 MINVALUE 0';
END;
:
权限管理:默认包权限
PLSQL/TSQL
摘要
没有AUTHID
子句的包默认为AUTHID定义器
解释
PL/SQL包可以是AUTHID定义程序
或AUTHID当前用户
。具有定义者权限的包中的函数和过程在定义包的用户权限下执行。这可以允许更新和访问特定的数据片段,而无需授予对整个表或模式的访问权限。在具有调用方权限的包中,或在调用它们的用户的权限下执行函数和过程。这不允许用户访问其尚未访问的数据。如果未提供AUTHID
子句,则包默认为定义者的权限
包通常由SYS或另一个高度特权的用户定义,这使得对代码的任何利用都可能更加危险
因此,您似乎只需要添加,即使这只是再次明确说明默认值(当然,您应该建立正确的值)
不相关,但
select
都不需要是动态的-您可能已经选择这样做,这样它看起来与alter
语句更一致,但这不是必需的;他们甚至不需要再被挑选了-你可以这样做:
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 -' || l_value || ' MINVALUE 0';
l_value := "ordering_seq".nextval;
EXECUTE IMMEDIATE 'ALTER SEQUENCE "ordering_seq" INCREMENT BY 1 MINVALUE 0';
END;
我可以在这里发现几个问题:
- 没有
子句,因此它默认为authid
definer
使用字符串连接立即执行
立即执行
为了安全起见,我将进行以下更改:
- 添加
authid当前用户
- 显式地
增量,避免对该增量的攻击到\u 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
权限。这带来了它自己的问题。要克服这一点,您可以使用 我可以在这里发现几个问题:
- 没有
子句,因此它默认为authid
definer
使用字符串连接立即执行
立即执行
为了安全起见,我将进行以下更改:
- 添加
authid当前用户
- 显式地
增量,避免对该增量的攻击到\u 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
权限。这带来了它自己的问题。要克服这一点,您可以使用 不熟悉该工具,但可能只是您没有?(尽管我很想开玩笑说它在抱怨引用的标识符*8-)Fortify建议您的代码存在潜在问题。我不认为选择。。。into语句既不是立即执行,也不是最后一个alter序列。不过,我不确定你能否减轻第一次改变的影响。您没有提到预期如何执行此代码的上下文,也没有提到不解决此问题的含义。由于语言的限制,将其添加到已知问题的风险登记簿中是否足够?另一方面,这不是一个查询,而是一个过程。我将标记从sql
更改为plsql
。PL/SQL是您在这里使用的Oracle编程语言。另一方面,我不会在Oracle中使用带引号的名称。一旦你这么做了,名字会突然变得区分大小写,而