APEX后台弱密码增强改造出现的问题及解决方法

发布时间:2023年12月22日

为了加强APEX后台密码的安全性和可靠性,对其进行弱密码改造,通过改写登录函数,判断密码可靠性,在密码不符合条件(密码长度必须大于8位小于16位,其包含数字、大小写字母与特殊符号)时跳转到密码修改页面。

判断逻辑

登录后先验证密码是否为空——为空返回false,不为空继续——判断输入密码是否与数据库加密密码相符——不符返回false,相符继续——判断是否是弱密码——否(强密码)用户登录,是(弱密码)进入密码修改页面——修改成功后返回登录界面用新密码登录。

流程图如下所示

【问题记录】页面登录时可以从P9999登录页面进入P81修改密码界面,但是想从P81修改密码界面点击进入登录界面不生效,又返回P81修改密码界面,搁这儿单人转呢?

【问题原因】密码验证方法有误,将输入密码加密后再进行密码强弱性校验这样做项IS_CHANGE_PSWD永远取到1而不是0,所以无法跳转登录页

在登录页呈现前创建分支,进行判断,如果项IS_CHANGE_PSWD为1,则说明是弱密码,
需要修改,跳转到密码修改页

详情:

?加密前正常输入密码Aa123456!,加密后是jYwu7f1/liQ9N+yRyszzHA==,加密后字符长达24,超出了最大长度16,自然一直走false。

如果将输入密码Aa123456#加密再进行校验,那么无论如何都走的是false,带入到逻辑代码中就是IS_CHANGE_PSWD永远取到1,无法正常登录

反之将输入密码进行校验则会正常判断

【解决方法】将输入密码与数据库内所存密码(解密后)比较,进行密码强弱性校验时也是使用输入原密码,不要加密后校验!不要加密后校验!不要加密后校验!(重要的事说三遍)
create function apex_mpf_authentication_basic2(
    p_username in varchar2,
    p_password in varchar2)
    return boolean
as
    v_password   varchar2(64);
    v_password_reg  varchar2(64);  --解密后的密码
    v_mobile     varchar2(64);
    v_job_number varchar2(64);
    v_err_msg    varchar2(2000);
begin
   apex_util.set_session_state('USER_NAME',p_username); --设置工号到USER_NAME
    select PASSWORD, MOBILE, JOB_NUMBER
    into v_password,v_mobile,v_job_number
    from BASIC_SYSTEM_LOGIN_USER
    where LOGIN_USER_ID in (SELECT u.LOGIN_USER_ID
                            FROM BASIC_SYSTEM_USER_ROLE u
                            where u.IS_ENABLE = 1
                              and u.USER_ID in (select a.USER_ID
                                                from SHARE_BASIC_USER_V a
                                                where a.IS_LEAVE = 0 -- 中台 EHR账户“未离职”的状态下
                                                  and a.TENANT_ID = apex_util.get_session_state('USER_TENANT'))
                              and u.TENANT_ID = apex_util.get_session_state('USER_TENANT'))
      and JOB_NUMBER = upper(p_username)
      and SYSTEM_TYPE = 'BASIC'
      and DEL_FLAG = 0
      and TENANT_ID = apex_util.get_session_state('USER_TENANT');
    WRITE_LOG(GET_FN_NAME(), 'debug3',
              p_username || p_password || apex_util.get_session_state('USER_TENANT') || v_job_number, -1, -1);

     if v_password is not null then  --密码非空
        V_PASSWORD_REG := JA_UTILS_PKG.DECRYPT_DEC(v_password);  --将解密的密码赋值给v_password_reg
        if p_password <> V_PASSWORD_REG then  --输入密码与数据库解密密码不符
            return false;
        else  --输入密码与数据库解密密码相符
          -- 验证当前用户是强密码或弱密码的情况
        -- 8到16位,包含数字,大小写,特殊字符,不包含空格
              WRITE_LOG(GET_FN_NAME(), 'debug6',
              'V_PASSWORD:'||V_PASSWORD_REG, -1, -1);

        IF NOT (
                REGEXP_LIKE(V_PASSWORD_REG, '[0-9]') AND
                REGEXP_LIKE(V_PASSWORD_REG, '[a-z]') AND
                REGEXP_LIKE(V_PASSWORD_REG, '[A-Z]') AND
                REGEXP_LIKE(V_PASSWORD_REG, '[@#$%^&+=!.]') AND
                LENGTH(V_PASSWORD_reg) BETWEEN 8 AND 16 AND
                NOT REGEXP_LIKE(V_PASSWORD_REG, '\s')
            ) THEN
            --弱密码的情况 IS_CHANGE_PSWD赋值1,目的:跳转修改密码页 要求用户修改密码,反之
            APEX_UTIL.SET_SESSION_STATE('IS_CHANGE_PSWD', 1);
            RETURN FALSE;
            ELSE
             APEX_UTIL.SET_SESSION_STATE('IS_CHANGE_PSWD', 0);
            RETURN TRUE;
        END IF;
        end if;
    else  --密码为空
        return false;
    end if;

exception
    when others then
        v_err_msg := sqlerrm || chr(13) || dbms_utility.format_error_backtrace;
        JA_WRITE_LOG(JA_UTILS_PKG.GET_FN_NAME(), 'error', v_err_msg, apex_util.get_session_state('USER_ID'),
                     apex_util.get_session_state('USER_TENANT'), V('APP_NAME') || ':' || V('APP_ID'));
        return false;
end;
/

奇怪,明明都是对的,但是会报“登录身份证明无效”

原来是表BASIC_SYSTEM_USER_ROLE中未分配角色,所以找不到,其他有角色的用户带来则会正常执行。

【一个展示BUG】

奇怪的bug增加了,点击修改密码页面的“返回登录页”按钮,出现了一个丑丑的bug

后来找到原因了,返回登录使用的是别名,结果别名被占用,不是我想返回的登录页,将想返回的登录页别名命名过来即可。

文章来源:https://blog.csdn.net/clover_oreo/article/details/135106999
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。