我使用Checkmarx工具扫描了我的Oracle软件包,以发现安全漏洞。 Checkmarx生成了一份报告,说我的代码有一个漏洞类型参数篡改。我将直接在数据库中运行代码而无需任何前端应用程序。在这种情况下,参数篡改是一个问题。如果是,那么如何在我的包本身中添加验证以防止参数篡改?
我不能把我的实际代码放在这里,但它是这样的:
PROCEDURE TEST1(START_DATE IN DATE) IS
BEGIN
END_DATE := TO_DATE(TRUNC(LAST_DAY(START_DATE)), 'DD-MON-RRRR');
答案 0 :(得分:4)
END_DATE := TO_DATE(TRUNC(LAST_DAY(START_DATE)), 'DD-MON-RRRR');
表达式包含隐式日期转换。 TO_DATE
函数需要一个字符串; TRUNC
返回的日期被隐式转换
到一个字符串,然后显式转换回一个日期。 TO_DATE
是多余的,可以删除。
有很多方法可以使用NLS_DATE_FORMAT
会话参数来破坏日期转换,但在这种情况下我没有看到安全问题。
然而,这个工具是明智的,警告你这里的日期处理。 TO_DATE
函数始终是可疑的,并且在99%的时间内使用不当。
答案 1 :(得分:1)
参数篡改利用Web前端应用程序中的弱点来更改参数值以用于恶意目的。对于存储过程,最大的担心是SQL注入,攻击者欺骗数据库运行任意代码
如果您的存储过程没有从Web前端获取输入,那么参数篡改并不是真正的威胁。但是,如果业务逻辑在某种程度上是敏感的,特别是如果您的代码包含动态SQL操作,那么构建一些防御是值得的。
使用design-by-contract principles验证输入参数的值和格式,并引发无效值的异常。例如,如果字符串应包含日期,请确保它包含可以强制转换为日期的字符串。
一般来说,强数据类型比使用字符串传递所有内容更好。 (在我看来RR
是一个错误:它已经是2015年了,并且所有应用程序都应该使用四位数年份。)
Oracle有一个名为DBMS_ASSERT的内置包。它的功能允许我们验证字符串参数的内容,以防止SQL注入。 Find out more