You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle Apex 5.1密码强度验证及MD5哈希提交冲突问题求助

针对你在Oracle Apex 5.1里遇到的强密码验证问题,我有几个可行的方案,帮你避开之前哈希后验证失效的坑:

方案一:前端JS实时验证 + 后端PL/SQL双重验证(最稳妥)

这种方式既能给用户实时反馈,又能防止前端被绕过,保障后端数据安全。

步骤1:前端JavaScript验证

  1. 打开你的页面,进入函数和全局变量声明(页面属性的"JavaScript"板块),添加以下验证函数:
function validatePassword() {
  const password = document.getElementById('P1_PASSWORD').value;
  let isValid = true;
  apex.message.clearErrors();

  // 检查长度
  if (password.length < 8) {
    apex.message.showErrors([{
      type: "error",
      location: ["page"],
      message: "密码长度至少为8个字符",
      unsafe: false
    }]);
    isValid = false;
  }
  // 检查包含字母
  else if (!/[A-Za-z]/.test(password)) {
    apex.message.showErrors([{
      type: "error",
      location: ["page"],
      message: "密码必须包含至少一个字母",
      unsafe: false
    }]);
    isValid = false;
  }
  // 检查包含数字
  else if (!/[0-9]/.test(password)) {
    apex.message.showErrors([{
      type: "error",
      location: ["page"],
      message: "密码必须包含至少一个数字",
      unsafe: false
    }]);
    isValid = false;
  }
  // 检查包含特殊字符
  else if (!/[^A-Za-z0-9]/.test(password)) {
    apex.message.showErrors([{
      type: "error",
      location: ["page"],
      message: "密码必须包含至少一个特殊字符(如!@#$%^&*等)",
      unsafe: false
    }]);
    isValid = false;
  }

  return isValid;
}
  1. 给页面的提交按钮添加动态行为:
    • 事件选择单击
    • 动作选择执行JavaScript代码
    • 代码输入:return validatePassword();
      这样用户点击提交时,会先触发前端验证,不满足条件就阻止提交并提示错误。

步骤2:后端PL/SQL验证

为了防止前端验证被绕过,必须加后端验证:

  1. 在页面中创建一个PL/SQL返回错误文本类型的验证,关联到你的密码项(比如P1_PASSWORD)
  2. 输入以下PL/SQL代码:
DECLARE
  v_password VARCHAR2(100) := :P1_PASSWORD;
BEGIN
  -- 检查长度
  IF LENGTH(v_password) < 8 THEN
    RETURN '密码长度至少为8个字符';
  END IF;
  -- 检查包含字母
  IF NOT REGEXP_LIKE(v_password, '[A-Za-z]') THEN
    RETURN '密码必须包含至少一个字母';
  END IF;
  -- 检查包含数字
  IF NOT REGEXP_LIKE(v_password, '[0-9]') THEN
    RETURN '密码必须包含至少一个数字';
  END IF;
  -- 检查包含特殊字符
  IF NOT REGEXP_LIKE(v_password, '[^A-Za-z0-9]') THEN
    RETURN '密码必须包含至少一个特殊字符(如!@#$%^&*等)';
  END IF;
  -- 验证通过返回NULL
  RETURN NULL;
END;
  1. 关键操作:调整验证的执行顺序,确保这个验证在你的MD5哈希计算项之前执行(在页面的"验证"列表里拖动调整顺序),这样验证的是用户输入的原密码,而非哈希后的值。

额外配置

  • 确保你的密码项(P1_PASSWORD)不映射到数据库表的列,只有哈希计算项(比如P1_PASSWORD_HASH)映射到表列,避免明文密码被存储。
  • 推荐替换MD5为更安全的SHA-256哈希,计算表达式改为:STANDARD_HASH(:P1_PASSWORD, 'SHA256')
方案二:调整原密码插件的验证顺序

如果你还想用之前的密码项插件,解决问题的核心是让插件在哈希计算前验证原密码:

  1. 进入页面的验证列表,找到插件自带的验证规则
  2. 进入页面的计算列表,找到你的MD5哈希计算项
  3. 拖动验证规则到计算项的上方,确保验证先执行,再生成哈希值
    这样插件验证的就是用户输入的原密码,不会出现特殊字符识别失败的问题了。
方案三:使用Apex内置正则表达式验证

Apex 5.1支持正则表达式类型的验证,步骤简单:

  1. 创建一个正则表达式类型的验证,关联到密码项
  2. 输入正则表达式:
^(?=.*[A-Za-z])(?=.*\d)(?=.*[^A-Za-z0-9]).{8,}$
  1. 自定义错误消息:密码必须至少8个字符,包含字母、数字和特殊字符
  2. 同样调整验证顺序到哈希计算项之前,确保验证的是原密码

这些方案都能解决你之前遇到的哈希后验证失效的问题,你可以根据自己的习惯选择其中一种。

内容的提问来源于stack exchange,提问作者Amorim Diniz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:21:32