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

Oracle存储过程遭Checkmarx SAST检测到参数篡改,求合规验证方案

解决Oracle存储过程Checkmarx SAST未验证参数的漏洞问题

你的Oracle存储过程sp_name在使用key参数查询时,虽尝试了绑定变量和dbms_assert,仍被Checkmarx SAST判定存在参数未验证漏洞,问题出在参数处理逻辑的冗余和缺乏明确合法性校验上,以下是具体分析和修正方案:

原代码问题分析

Create procedure sp_name (key varchar2, v_flag out number) as
v_key varchar2(50);
v_sql clob;
Begin
If key is null then
v_flag:=-1;
Else
v_key:=sys.dbms_assert.enquote_literal(upper(trim(key)));
v_key:=replace(v_key,''''); -- 这步完全多余,反而破坏了dbms_assert的处理
v_sql:=q'[select flag from tbl where key=:1]';
Execute immediate v_sql into v_flag using v_key;
End if;
Exception when no_data_found then
v_flag:=-1;
End;
  1. 你用dbms_assert.enquote_literal给参数加了单引号,随后又用replace把引号去掉,等于白做了参数转义处理,Checkmarx会认为参数处理逻辑无效。
  2. 虽然用了绑定变量,但缺少对key参数的明确合法性校验(比如长度、字符范围),SAST工具会认为参数可能携带恶意内容。
  3. 此处完全不需要动态SQL,静态SQL本身更安全,也更易通过扫描。

修正方案

1. 移除冗余处理,改用静态SQL

绑定变量本身就能防止SQL注入,不需要手动处理单引号,直接用静态SQL替代动态SQL,代码更简洁安全。

2. 添加明确的参数合法性校验

  • 校验参数长度:确保key的长度不超过表tbl中key字段的定义长度(比如假设字段是varchar2(50),就限制参数长度≤50)
  • 校验字符范围:只允许合法字符(比如字母、数字、下划线等),拒绝包含特殊符号的参数

修正后的代码

Create procedure sp_name (key varchar2, v_flag out number) as
Begin
    If key is null then
        v_flag := -1;
    -- 校验长度和字符范围
    Elsif length(trim(key)) > 50 or not regexp_like(trim(key), '^[A-Z0-9_]+$') then
        v_flag := -1; -- 参数非法,返回错误状态
    Else
        -- 用静态SQL直接查询,绑定变量自动处理参数
        select flag into v_flag 
        from tbl 
        where key = upper(trim(key));
    End if;
Exception 
    when no_data_found then
        v_flag := -1;
    when others then
        v_flag := -1; -- 处理其他异常
End;

额外说明

  • 如果业务允许key包含特殊字符,可调整正则表达式^[A-Z0-9_]+$为符合业务需求的规则,比如允许连字符、点号等。
  • 静态SQL相比动态SQL更易被SAST工具识别为安全代码,避免误报。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:03:12