CodeQL 文档

算术表达式中的不受控数据

ID: java/uncontrolled-arithmetic
Kind: path-problem
Security severity: 8.6
Severity: warning
Precision: medium
Tags:
   - security
   - external/cwe/cwe-190
   - external/cwe/cwe-191
Query suites:
   - java-security-extended.qls
   - java-security-and-quality.qls

单击查看 CodeQL 存储库中的查询

对不受控制的数据执行计算可能会导致整数溢出,除非验证输入。

如果数据不受您的控制,并且可以取极大的值,即使通常会导致幅度略微变化的算术运算也可能导致溢出。

建议

始终通过执行以下操作之一来防止对不受控制的数据进行算术运算时的溢出

  • 验证数据。

  • 对算术表达式定义一个保护,以便仅在结果可以确定小于或等于类型的最大值时才执行运算,例如 MAX_VALUE

  • 使用更宽的类型,这样更大的输入值不会导致溢出。

示例

在此示例中,生成了一个随机整数。由于该值不受程序员控制,因此它可能非常大。因此,对该值执行算术运算可能会导致溢出。为了避免这种情况,该示例展示了如何在执行乘法之前执行检查。

class Test {
	public static void main(String[] args) {
		{
			int data = (new java.security.SecureRandom()).nextInt();

			// BAD: may overflow if data is large
			int scaled = data * 10;

			// ...

			// GOOD: use a guard to ensure no overflows occur
			int scaled2;
			if (data < Integer.MAX_VALUE/10)
				scaled2 = data * 10;
			else 
				scaled2 = Integer.MAX_VALUE;
		}
	}
}

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私