代码质量不佳会导致不可预测的行为。对于用户来说,通常表现为可用性差。对于攻击者来说,提供了以意外方式对系统施加压力的机会。
String
会导致数据丢失。String
后,没有说明适用字符集外的数据会发生何种变化。这会导致数据丢失,或者在需要二进制数据来确保执行正确的安全措施时,安全级别降低。
...
FileInputStream fis = new FileInputStream(myFile);
byte[] byteArr = byte[BUFSIZE];
...
int count = fis.read(byteArr);
...
String fileString = new String(byteArr);
String fileSHA256Hex = DigestUtils.sha256Hex(fileString);
// use fileSHA256Hex to validate file
...
BUFSIZE
,只要 myFile
中的信息已编码为与默认字符集相同,此方式就会很有用。但是,如果使用不同的编码方式,或者为二进制文件,则信息将会丢失。进而导致生成的 SHA 散列值的可靠性降低,并且也将更容易产生冲突,在默认字符集外的数据由相同的值(如问号)表示时,尤其如此。NaN
进行对比始终是一个错误。NaN
进行比较,得出的计算结果将始终为 false
(!=
运算符是个例外,因为 NaN
未经排序,所以始终会得出 true
结果)。NaN
。
...
if (result == Double.NaN){
//something went wrong
throw new RuntimeException("Something went wrong, NaN found");
}
...
result
并非 NaN
,但是使用带有 NaN
的运算符 ==
将始终得出 false
值,所以此检查将永远不会抛出异常。inputReader
对象的类名称确认是否信任该对象的输入。如果攻击者能够提供一种执行恶意命令的 inputReader
实现方式,则此代码将无法区分该对象是善意的还是恶意的。
if (inputReader.GetType().FullName == "CompanyX.Transaction.Monetary")
{
processTransaction(inputReader);
}
inputReader
对象的类名称确认是否信任该对象的输入。如果攻击者能够提供一种执行恶意命令的 inputReader
实现方式,则此代码将无法区分该对象是善意的还是恶意的。
if (inputReader.getClass().getName().equals("com.example.TrustedClass")) {
input = inputReader.getInput();
...
}
inputReader
对象的类名称确认是否信任该对象的输入。如果攻击者能够提供一种执行恶意命令的 inputReader
实现方式,则此代码将无法区分该对象是善意的还是恶意的。
if (inputReader::class.qualifiedName == "com.example.TrustedClass") {
input = inputReader.getInput()
...
}
class AccessLevel{
public static final int ROOT = 0;
//...
public static final int NONE = 9;
}
//...
class User {
private static int access;
public User(){
access = AccessLevel.ROOT;
}
public static int getAccessLevel(){
return access;
}
//...
}
class RegularUser extends User {
private static int access;
public RegularUser(){
access = AccessLevel.NONE;
}
public static int getAccessLevel(){
return access;
}
public static void escalatePrivilege(){
access = AccessLevel.ROOT;
}
//...
}
//...
class SecureArea {
//...
public static void doRestrictedOperation(User user){
if (user instanceof RegularUser){
if (user.getAccessLevel() == AccessLevel.ROOT){
System.out.println("doing a privileged operation");
}else{
throw new RuntimeException();
}
}
}
}
user
实例,而非 User
或 RegularUser
类来调用 getAccessLevel()
方法,这意味着此条件下将始终返回 true
且会执行该限制操作,即使使用了 instanceof
以便进入 if/else
块的此部分也是如此。