728x90
반응형
Java 자주발생하는 오류 정리 #4
Frequent Java Cleanup Errors #4
NumberFormatException
NumberFormatException은 문자열을 숫자로 변환하려고 할 때 발생하는 예외입니다.
숫자 변환 메서드(예: Integer.parseInt(), Double.parseDouble() 등)를 사용 시, 문자열이 숫자 형식에 맞지 않는 경우 자주 발생합니다.
취약점
- NumberFormatException은 보안에 직접적인 영향을 미치지 않지만, 악의적인 사용자가 변환되지 않은 형식의 문자열을 사용하여 예기치 않은 동작을 유발할 수 있습니다.
오류상황
try {
int num = Integer.parseInt("abc");
} catch (NumberFormatException e) {
e.printStackTrace();
}
솔루션
//솔루션1
try {
String str = "123";
int num = Integer.parseInt(str);
// 변환된 숫자를 사용
} catch (NumberFormatException e) {
// 변환 불가능한 경우 처리
e.printStackTrace();
}
//솔루션2
String str = "123";
if (str.matches("\\d+")) {
int num = Integer.parseInt(str);
// 변환된 숫자를 사용
} else {
// 변환 불가능한 경우 처리
System.out.println("Not a valid number format");
}
솔루션 설명
- 숫자로 변환하기 전에 먼저 변환 가능한지 확인하고, 가능한 경우에만 숫자로 변환하여 사용합니다.
- 정규식을 사용하여 문자열이 숫자 형식에 맞는지 검사하고, 맞으면 숫자로 변환하여 사용합니다.
ArithmeticException
ArithmeticException은 산술 연산 중에 발생하는 예외로, 0으로 나누거나 정수를 0으로 나누려고 할 때 발생합니다.
취약점
- ArithmeticException은 보안에 직접적인 영향을 미치지는 않지만, 악의적인 사용자가 산술 연산 오류를 유발하여 예기치 않은 동작을 유발할 수 있습니다.
오류상황
try {
int result = 5 / 0;
} catch (ArithmeticException e) {
e.printStackTrace();
}
솔루션
//솔루션1
int denominator = 0;
if (denominator != 0) {
int result = 5 / denominator;
// 계산 결과 사용
} else {
// 0으로 나누는 경우 처리
System.out.println("Cannot divide by zero");
}
//솔루션2
try {
int result = 5 / 0;
} catch (ArithmeticException e) {
// 예외 처리 또는 기본값으로 대체
e.printStackTrace();
}
솔루션 설명
- 0으로 나누기 전에 나누기 가능한지 확인하고, 가능한 경우에만 나누기 연산을 수행합니다.
- try-catch 블록을 사용하여 ArithmeticException이 발생하면 catch 블록에서 해당 예외를 처리하거나 기본값으로 대체합니다.
FileNotFoundException
FileNotFoundException은 파일을 찾을 수 없는 경우 발생하는 예외입니다. 파일이 존재하지 않는 경로에 접근하려고 할 때 발생합니다.
취약점
- FileNotFoundException은 파일을 다룰 때 사용되는 예외로, 파일의 존재 여부와 관련하여 보안적 취약점을 유발할 수 있습니다. 악의적인 사용자가 파일의 존재 여부를 확인하거나 파일을 조작하기 위해 사용할 수 있습니다.
오류상황
try {
FileReader fileReader = new FileReader("nonexistent.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
솔루션
//솔루션1
File file = new File("nonexistent.txt");
if (file.exists()) {
try {
FileReader fileReader = new FileReader(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} else {
System.out.println("File not found.");
}
//솔루션2
try {
FileReader fileReader = new FileReader("nonexistent.txt");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
솔루션 설명
- 파일을 열기 전에 먼저 파일의 존재 여부를 확인하여 파일이 존재하는 경우에만 파일 열기 작업을 수행합니다.
- try-catch 블록을 사용하여 FileNotFoundException이 발생하면 catch 블록에서 해당 예외를 처리하거나 기본값으로 대체합니다.
728x90
반응형