Oracle APEX中未检查用户的旧密码和新密码之间的区别

时间:2019-07-30 10:39:08

标签: plsql oracle11g oracle-apex

我正在使用Oracle APEX应用程序,今天我发现为多个配置文件设置的密码验证功能无法正常工作,因为原来代表旧密码的参数已被证明为空。

我的密码验证功能F_VERIFY_PASSWORD是基于Oracle管理文件utlpwdmg.sql中的示例:仅针对与旧密码和旧密码的比较无关的部分进行了代码更改。新的一个。功能代码如下所示(不存在问题的部分除外):

create or replace function F_VERIFY_PASSWORD
 (
  USERNAME     varchar2
 ,PASSWORD     varchar2
 ,OLD_PASSWORD varchar2
) return boolean is
…
  DIFFER integer; 
  MINDIFFER number := 3;
…
begin
…
  -- Check that the new password differs from the previous one no less than in MINDIFFER positions.
  if OLD_PASSWORD is not null
  then
    DIFFER := LENGTH(OLD_PASSWORD) - LENGTH(PASSWORD);
    DIFFER := ABS(DIFFER);
    if DIFFER < MINDIFFER
    then
      if LENGTH(PASSWORD) < LENGTH(OLD_PASSWORD)
      then
        M := LENGTH(PASSWORD);
      else
        M := LENGTH(OLD_PASSWORD);
      end if;
      for I in 1 .. M
      loop
        if SUBSTR(PASSWORD,I,1) != SUBSTR(OLD_PASSWORD,I,1)
        then
          DIFFER := DIFFER + 1;
        end if;
      end loop;
      if DIFFER < MINDIFFER
      then
        RAISE_APPLICATION_ERROR(-20011,'The new password must differ from the old one no less than in 3 positions!');
      end if;
    end if;
  end if;
  -- Return TRUE, if all is correct. 
  return(true);
end;

更改密码本身是通过过程P_CHANGE_PASS进行的,该过程在Oracle APEX应用程序中执行。它的代码如下所示(不存在问题的部分除外)。

create or replace procedure P_CHANGE_PASS
 (
  NEWPASS    varchar2
 ,NEWPASS2   varchar2
 ,USR        varchar2
) as
…
begin
…
  --changing the password
  begin
    execute immediate 'alter user ' || USR || ' identified by ' || NEWPASS;
  exception
    when others then
      …
  end;
end;

我尝试了以下步骤,以使验证功能包括检查新旧密码之间的差异:

  1. 从用户ALTER USER撤消了特权APEX_PUBLIC_USER
  2. 将语句AUTHID CURRENT_USER添加到了 “客户”程序P_CHANGE_PASS
  3. 添加了REPLACE <old password> ALTER USER命令(这很糟糕,但我做到了 进行调试)。

这些动作都没有帮助我解决问题。因此,如何使函数OLD_PASSWORD中的参数F_VERIFY_FUNCTION不为空?

我使用Oracle 11g(版本11.2.0.3.0),Oracle APEX 4.2.6.00.03。

0 个答案:

没有答案