Oracle Apex表单输入:如何自动转&为&或自定义字符规则?
Oracle Apex 表单XSS防护:自定义字符转义与映射方案
一、自动将输入的&转为&的实现方式
可以通过前端或后端两种方式实现,按需选择:
前端实时替换
给目标输入项添加动态动作,实现输入/失焦时自动转义:
- 事件选择
Change或Blur(失焦触发更稳妥) - 动作类型选
Execute JavaScript Code,代码如下:
const input = this.triggeringElement; input.value = input.value.replace(/&/g, '&');
这种方式能让用户实时看到转义后的结果,避免提交后才发现格式变化。
后端兜底处理
如果担心前端被绕过,可在提交阶段通过页面计算或处理逻辑强制转义:
- 页面项计算:给目标输入项设置计算,计算时机选对应提交按钮的
When Button Pressed,计算类型为PL/SQL Expression:
REPLACE(:P1_TARGET_INPUT, '&', '&')
- 提交处理块:在页面提交的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, '<', '<'); l_clean_val := REPLACE(l_clean_val, '>', '>'); -- 将清理后的值写回输入项 :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 -- 替换&为& EXECUTE IMMEDIATE 'BEGIN :1 := REPLACE(:1, ''&'', ''&''); END;' USING IN OUT apex_util.get_session_state(rec.item_name); -- 可继续添加其他自定义映射规则 EXECUTE IMMEDIATE 'BEGIN :1 := REPLACE(:1, ''"' , '"''); 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
相关产品推荐
相关产品推荐

