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

如何为易受SQL注入的动态交互式报表绑定变量?

解决动态SQL的SQL注入问题:绑定变量的正确用法

你的代码核心问题是直接将:P1_NAME拼接进SQL字符串,哪怕是APEX页面项,这种拼接方式依然会引入SQL注入风险。正确的做法是用绑定变量占位符分离SQL语句与变量值,同时合理处理LIKE的通配符逻辑:

修改后的代码

declare
    vsql varchar2(4000);
begin
    vsql := 'SELECT Name FROM Customers WHERE 1 = 1 ';
    
    if :P1_NAME is not null then
        -- 使用绑定变量占位符,将通配符逻辑从SQL语句中剥离
        vsql := vsql || ' AND UPPER(NAME) LIKE UPPER(:bind_name)';
    end if;

    return vsql;
end;

关键细节说明

  • 禁止字符串拼接变量:永远不要把用户输入(包括页面项)直接拼入SQL字符串,用:占位符定义绑定变量,让数据库将SQL结构与变量值分开解析,从根源上阻断注入。
  • 通配符处理方式:把%这类通配符附加到变量值上,而非写在SQL语句里。比如在APEX页面项的来源或预处理逻辑中,将值设置为'%' || :P1_NAME || '%',这样绑定到:bind_name时就自带通配符效果。
  • APEX场景适配:因为你是返回SQL字符串给APEX的Function Body returning SQL Query数据源,不需要在函数内给绑定变量赋值,APEX会自动将页面项的处理后的值绑定到占位符上。

可选:函数内处理通配符的写法

如果必须在函数内部处理通配符,可参考以下写法(更推荐外部处理,保持函数逻辑简洁):

declare
    vsql varchar2(4000);
    v_name_filter varchar2(100);
begin
    vsql := 'SELECT Name FROM Customers WHERE 1 = 1 ';
    
    if :P1_NAME is not null then
        v_name_filter := '%' || :P1_NAME || '%';
        vsql := vsql || ' AND UPPER(NAME) LIKE UPPER(:bind_name)';
    end if;

    return vsql;
end;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:38:29