ID: 478 类型:变量 | 状态:草稿 |
描述
代码在switch语句中没有defult,这可能导致复杂的逻辑错误和由此产生的弱点。
扩展描述
这个缺陷代表了软件开发中的一个常见问题,在这个问题中,并非所有变量的可能值都由给定的过程来考虑或处理。因此,进一步的决策是基于糟糕的信息和级联故障结果。这种级联故障可能导致任何数量的安全问题,并构成系统中的重大故障。
关联视图
与“研究层面”视图(CWE-1000)相关
与“开发层面”视图(CWE-699)相关
引入模式
阶段 | 说明 |
实现 |
应用平台
语言
C (出现的可能性不确定)
C++ (出现的可能性不确定)
Java (出现的可能性不确定)
C# (出现的可能性不确定)
后果
范围 | 冲击 | 可能性 |
完整性 | 技术冲击: 上下文相关; 修改执行逻辑 根据所涉及的逻辑情况,可能会导致任何后果:例如,保密性、认证、授权、可利用性、完整性、责任性或不可抵赖性问题。 |
示例
例1
如果安全检查函数在发生错误时返回-1值,则以下内容无法正确检查返回代码。如果攻击者可以提供将调用错误的数据,则攻击者可以绕过安全检查:
(问题代码)
Example Language: C
#define FAILED 0
#define PASSED 1
int result;
...
result = security_check(data);
switch (result) {
case FAILED:
printf("Security check failed!\n");
exit(-1);
//Break never reached because of exit()
break;
case PASSED:
printf("Security check passed.\n");
break;
}
// program execution continues...
...
应该使用default语句处理未考虑到的情况:
(正确代码)
Example Language: C
#define FAILED 0
#define PASSED 1
int result;
...
result = security_check(data);
switch (result) {
case FAILED:
printf("Security check failed!\n");
exit(-1);
//Break never reached because of exit()
break;
case PASSED:
printf("Security check passed.\n");
break;
default:
printf("Unknown error (%d), exiting...\n",result);
exit(-1);
}
之所以使用此标签,是因为无法假设所有可能的案例都已得到解释。一个好的实践是为错误处理保留默认情况。
例2
在下面的Java示例中,GETSeReStand方法检索抵押点的利率。输入参数中提供了点数,switch语句将根据点数设置要返回的利率值。
(问题代码)
Example Language: Java
public static final String INTEREST_RATE_AT_ZERO_POINTS = "5.00";
public static final String INTEREST_RATE_AT_ONE_POINTS = "4.75";
public static final String INTEREST_RATE_AT_TWO_POINTS = "4.50";
...
public BigDecimal getInterestRate(int points) {
BigDecimal result = new BigDecimal(INTEREST_RATE_AT_ZERO_POINTS);
switch (points) {
case 0:
result = new BigDecimal(INTEREST_RATE_AT_ZERO_POINTS);
break;
case 1:
result = new BigDecimal(INTEREST_RATE_AT_ONE_POINTS);
break;
case 2:
result = new BigDecimal(INTEREST_RATE_AT_TWO_POINTS);
break;
}
return result;
}
但是,此代码假定Points输入参数的值始终为0、1或2,并且不检查传递给该方法的其他错误值。这可以通过在switch语句中提供一个默认标签轻松实现,该标签输出一条错误消息,指示Points输入参数的无效值,并返回一个空值。
(正确代码)
Example Language: Java
public static final String INTEREST_RATE_AT_ZERO_POINTS = "5.00";
public static final String INTEREST_RATE_AT_ONE_POINTS = "4.75";
public static final String INTEREST_RATE_AT_TWO_POINTS = "4.50";
...
public BigDecimal getInterestRate(int points) {
BigDecimal result = new BigDecimal(INTEREST_RATE_AT_ZERO_POINTS);
switch (points) {
case 0:
result = new BigDecimal(INTEREST_RATE_AT_ZERO_POINTS);
break;
case 1:
result = new BigDecimal(INTEREST_RATE_AT_ONE_POINTS);
break;
case 2:
result = new BigDecimal(INTEREST_RATE_AT_TWO_POINTS);
break;
default:
System.err.println("Invalid value for points, must be 0, 1 or 2");
System.err.println("Returning null value for interest rate");
result = null;
}
return result;
}
应对措施
阶段: 实现 在根据给定变量的值调整流或值时,确保没有未计数的情况。在switch语句中,这可以通过使用默认标签来实现。 |
阶段: 实现 在switch样式语句的情况下,创建默认情况的非常简单的操作可以减轻这种情况(如果正确地完成)。然而,通常情况下,默认情况只是用来表示一个假定的选项,而不是作为对无效输入的检查。这是一种糟糕的做法,在某些情况下,这和完全忽略默认情况一样糟糕。 |
种属
关系 | 类型 | ID | 名称 |
属于 | 884 | ||
属于 | 962 |