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;
- 你用
dbms_assert.enquote_literal给参数加了单引号,随后又用replace把引号去掉,等于白做了参数转义处理,Checkmarx会认为参数处理逻辑无效。 - 虽然用了绑定变量,但缺少对
key参数的明确合法性校验(比如长度、字符范围),SAST工具会认为参数可能携带恶意内容。 - 此处完全不需要动态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
相关产品推荐
相关产品推荐

