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

Oracle Apex表单输入:如何自动转&为&或自定义字符规则?

Oracle Apex 表单XSS防护:自定义字符转义与映射方案

一、自动将输入的&转为&的实现方式

可以通过前端或后端两种方式实现,按需选择:

前端实时替换

给目标输入项添加动态动作,实现输入/失焦时自动转义:

  • 事件选择Change或Blur(失焦触发更稳妥)
  • 动作类型选Execute JavaScript Code,代码如下:
const input = this.triggeringElement;
input.value = input.value.replace(/&/g, '&');

这种方式能让用户实时看到转义后的结果,避免提交后才发现格式变化。

后端兜底处理

如果担心前端被绕过,可在提交阶段通过页面计算或处理逻辑强制转义:

  1. 页面项计算:给目标输入项设置计算,计算时机选对应提交按钮的When Button Pressed,计算类型为PL/SQL Expression:
REPLACE(:P1_TARGET_INPUT, '&', '&')
  1. 提交处理块:在页面提交的PL/SQL处理中直接修改项值:
:P1_TARGET_INPUT := REPLACE(:P1_TARGET_INPUT, '&', '&');

二、创建自定义受限字符/映射规则

Oracle Apex自带的黑名单无法直接修改,但可以通过以下方式实现自定义规则:

单输入项自定义验证

给需要控制的输入项添加验证,类型选PL/SQL Function Returning Error Text,示例代码如下(可按需扩展映射规则):

DECLARE
    l_clean_val VARCHAR2(4000);
BEGIN
    l_clean_val := :P1_TARGET_INPUT;
    -- 自定义转义规则:可添加更多字符映射
    l_clean_val := REPLACE(l_clean_val, '&', '&');
    l_clean_val := REPLACE(l_clean_val, '<', '&lt;');
    l_clean_val := REPLACE(l_clean_val, '>', '&gt;');
    -- 将清理后的值写回输入项
    :P1_TARGET_INPUT := l_clean_val;
    -- 验证通过返回NULL
    RETURN NULL;
EXCEPTION
    WHEN OTHERS THEN
        RETURN '输入包含非法字符,请检查';
END;

验证时机选When Button Pressed,确保提交时触发处理。

全局级自定义处理(全应用/页面生效)

如果需要对所有文本输入项统一应用规则,可创建应用级提交前流程:

  • 流程时机选On Submit - Before Computations and Validations
  • 流程类型为PL/SQL,代码如下(仅处理文本类输入项):
DECLARE
    l_item_name VARCHAR2(255);
    CURSOR c_page_items IS
        SELECT item_name
        FROM apex_application_page_items
        WHERE application_id = :APP_ID
          AND page_id = :APP_PAGE_ID
          AND item_type IN ('TEXT_FIELD', 'TEXTAREA', 'TEXT_AREA');
BEGIN
    FOR rec IN c_page_items LOOP
        -- 替换&为&amp;
        EXECUTE IMMEDIATE 'BEGIN :1 := REPLACE(:1, ''&'', ''&amp;''); END;'
            USING IN OUT apex_util.get_session_state(rec.item_name);
        -- 可继续添加其他自定义映射规则
        EXECUTE IMMEDIATE 'BEGIN :1 := REPLACE(:1, ''"' , '&quot;''); END;'
            USING IN OUT apex_util.get_session_state(rec.item_name);
    END LOOP;
END;

关于apex_escape的补充说明

apex_escape系列函数(如apex_escape.html)是显示层转义,用于在页面渲染时将特殊字符转义为HTML实体,避免XSS。它不会修改存储在项中的原始值,因此如果需要在输入阶段就转存处理,还是用上述REPLACE或自定义逻辑更直接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 13:24:59