cwe - 478:失踪的默认情况下在多个条件表达式
视图定制的信息:
如果多个条件表达式(如开关在C)省略了默认情况下但不考虑可能发生或处理所有可能的值,那么这可能会导致复杂的逻辑错误和合成的弱点。因此,进一步的决策基于差信息,级联失效的结果。这个级联故障可能导致任何数量的安全问题,和系统中构成一个重大的失误。
此表显示了弱点和高水平类别相关的这一弱点。这些关系被定义为ChildOf、ParentOf MemberOf,并洞察类似项目可能存在的在较高和较低的抽象级别。此外,关系如PeerOf和CanAlsoBe定义显示类似的弱点,用户可能想要探索。
相关的视图”研究概念”(cwe - 1000)
相关观点“软件开发”(cwe - 699)
该清单显示了给定的弱点可以可能的地区出现。这些可能是为特定命名的语言,操作系统,架构、模式、技术、或一个类这样的平台。列出的平台是随着频率的出现疲态实例。
语言 C患病率(待定) c++患病率(待定) Java患病率(待定) c#患病率(待定) Python患病率(待定) JavaScript患病率(待定)
这个表指定不同的个人相关后果的弱点。标识应用程序范围的安全领域侵犯,而影响了负面的技术影响,如果敌人成功利用这个弱点。可能提供的信息如何可能的具体结果预计将看到列表中相对于其它后果。例如,可能会有高可能性,缺点将被利用来实现一定的影响,但较低的可能性,它将被利用来实现不同的影响。
示例1 以下不正确检查返回代码的情况下security_check函数返回1值时发生一个错误。如果攻击者可以提供数据,将调用一个错误,攻击者可以绕过安全检查:
(坏的代码)
例如语言:C
#定义失败0
#定义了1 int结果; … 结果= security_check(数据); 开关(结果){
失败案例:
printf("安全检查失败! \ n ");
退出(1); / /打破从来没有达到,因为退出() 打破; 案例通过:
printf("安全检查通过。\ n ");
打破; / /程序执行继续…… … 而不是默认的标签应该用于行踪不明的条件:
(好的代码)
例如语言:C
#定义失败0
#定义了1 int结果; … 结果= security_check(数据); 开关(结果){
失败案例:
printf("安全检查失败! \ n ");
退出(1); / /打破从来没有达到,因为退出() 打破; 案例通过:
printf("安全检查通过。\ n ");
打破; 默认值:
printf(“未知错误(% d),退出…\ n”,结果);
退出(1); 使用这个标签,因为假设不能占到所有可能的情况下。一个良好的实践是保留默认的错误处理。 示例2 在接下来的Java示例方法getInterestRate检索点的数量的利率抵押贷款。点的数量中提供输入参数和一个switch语句将利率值返回基于点的数量。
(坏的代码)
例如语言:Java
公共静态最终字符串INTEREST_RATE_AT_ZERO_POINTS = " 5.00 ";
公共静态最终字符串INTEREST_RATE_AT_ONE_POINTS = " 4.75 "; 公共静态最终字符串INTEREST_RATE_AT_TWO_POINTS = " 4.50 "; … 公共BigDecimal getInterestRate (int) {
结果= new BigDecimal (INTEREST_RATE_AT_ZERO_POINTS);
开关(点){
例0:
结果= new BigDecimal (INTEREST_RATE_AT_ZERO_POINTS);
打破; 案例1:
结果= new BigDecimal (INTEREST_RATE_AT_ONE_POINTS);
打破; 案例2:
结果= new BigDecimal (INTEREST_RATE_AT_TWO_POINTS);
打破; 返回结果; 然而,这段代码假设点输入参数的值永远是0,1或2,不检查其他不正确的值传递给方法。这可以很容易地通过提供一个默认标签的switch语句输出错误消息指示一个无效值点输入参数和返回一个null值。
(好的代码)
例如语言:Java
公共静态最终字符串INTEREST_RATE_AT_ZERO_POINTS = " 5.00 ";
公共静态最终字符串INTEREST_RATE_AT_ONE_POINTS = " 4.75 "; 公共静态最终字符串INTEREST_RATE_AT_TWO_POINTS = " 4.50 "; … 公共BigDecimal getInterestRate (int) {
结果= new BigDecimal (INTEREST_RATE_AT_ZERO_POINTS);
开关(点){
例0:
结果= new BigDecimal (INTEREST_RATE_AT_ZERO_POINTS);
打破; 案例1:
结果= new BigDecimal (INTEREST_RATE_AT_ONE_POINTS);
打破; 案例2:
结果= new BigDecimal (INTEREST_RATE_AT_TWO_POINTS);
打破; 默认值:
System.err。println(“无效值点,必须是0,1或2”);
System.err。println(“利率返回null值”); 结果=零; 返回结果; 示例3 在接下来的Python示例相符的声明(可以在Python 3.10和更高版本)执行操作基于process_data的结果()函数。要么是0或1的预期收益。然而,如果一个意想不到的结果(例如,1或2)获得然后不采取行动可能导致一个意想不到的程序状态。
(坏的代码)
例如语言:Python
结果= process_data(数据)
比赛结果:
例0:
打印(“妥善处理零。”)
案例1:
打印(“妥善处理一个案子”。)
#程序执行继续…… 推荐的方法是添加一个默认的情况下,捕捉任何意想不到的结果的条件下,无论如何不可能这些意想不到的条件,并妥善处理。
(好的代码)
例如语言:Python
结果= process_data(数据)
比赛结果:
例0:
打印(“妥善处理零。”)
案例1:
打印(“妥善处理一个案子”。)
例_:
打印(“妥善处理意外情况。”)
#程序执行继续…… 示例4 在以下JavaScript例切换实例语句(1.2及以后版本中可用的JavaScript)是用于处理一个给定的步骤基于calcuation涉及两个输入的结果。预期回报率是1、2或3。然而,如果一个意想不到的结果(例如,4)获得然后没有行动将可能导致一个意想不到的程序状态。
(坏的代码)
例如语言:JavaScript
让一步= input1 + input2;
开关(步骤){
案例1:
警报(“流程第一步。”);
打破; 案例2:
警报(“流程步骤2。”);
打破; 案例3:
警报(“流程步骤3。”);
打破; } / /程序执行继续…… 推荐的方法是添加一个默认的情况下,捕捉任何意想不到的结果的条件,妥善处理。
(好的代码)
例如语言:JavaScript
让一步= input1 + input2;
开关(步骤){
案例1:
警报(“流程第一步。”);
打破; 案例2:
警报(“流程步骤2。”);
打破; 案例3:
警报(“流程步骤3。”);
打破; 默认值:
警报(“遇到意想不到的一步。”);
} / /程序执行继续…… 示例5 有限状态机(FSM)“坏”的代码片段所示分配输出(“”)基于状态的价值,确定基于用户提供的输入(user_input)。
(坏的代码)
例如语言:Verilog
模块fsm_1 (, user_input) clk rst_n);
输入[2:0]user_input; 输入时钟,rst_n; 输出reg (2:0); 注册(1:0)状态; 总是@ (posedge clk或negedge rst_n)
开始 endmodule
如果(! rst_n) 结束
国家= 3 'h0; 其他的案例(user_input)
3 'h0: endcase3 'h1: 3 'h2: = 2 'h3 3 'h3:状态; = 2 'h2 3 'h4:状态; = 2 'h1 3 'h5:状态; 从< = {1 'h1状态}; case语句不包含一个默认的处理3 'h6的场景当用户提供输入和3 'h7。这些输入推系统一个未定义的状态,可能会导致崩溃(拒绝服务)或任何其他意外的结果。 添加一个默认的语句来处理未定义的输入,缓解了这一问题。这是“好”的代码片段所示。默认语句以粗体显示。
(好的代码)
例如语言:Verilog
案例(user_input)
3 'h0: endcase3 'h1: 3 'h2: = 2 'h3 3 'h3:状态; = 2 'h2 3 'h4:状态; = 2 'h1 3 'h5:状态; 默认值:国家= 2 'h0;
这MemberOf关系表显示额外CWE类别和视图引用这个弱点作为成员。这些信息通常是有用的在理解一个弱点符合外部信息源的上下文中。
更多的信息是可用的,请选择一个不同的过滤器。
|
使用常见的弱点枚举(CWE)和相关的引用从这个网站的使用条款。CWE赞助的美国国土安全部(DHS)网络和基础设施安全机构(CISA)和管理的国土安全系统工程和发展研究所这是由(HSSEDI)manbetx客户端首页(斜方)。版权©2006 - 2023,斜方公司。manbetx客户端首页CWE、水煤浆、CWRAF, CWE标志是斜方公司的商标。manbetx客户端首页 |