Oracle SQL查询的安全问题

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

我正在处理一个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 '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
  • 使用字符串连接立即执行
这意味着对该过程具有执行权限的任何人都以过程所有者的完全权限运行。使用字符串连接时,存在SQL注入的风险。对

此外,您还可以通过赋值来获得序列的下一个值。无需
立即执行

为了安全起见,我将进行以下更改:

  • 添加
    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
  • 使用字符串连接立即执行
这意味着对该过程具有执行权限的任何人都以过程所有者的完全权限运行。使用字符串连接时,存在SQL注入的风险。对

此外,您还可以通过赋值来获得序列的下一个值。无需
立即执行

为了安全起见,我将进行以下更改:

  • 添加
    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中使用带引号的名称。一旦你这么做了,名字会突然变得区分大小写,而