1. SQL 삽입 (Mybatis)
원인
mybatis를 사용하여 쿼리에 $표시를 사용할경우
이유
개발자가 의도치 않은 동적 쿼리 작성으로 인하여 sql injection 가능
해결방안
'$' 대신 '#'을 사용, 또는 '$' 제거
select id,name
FROM table
WHERE id = ${id}
=>
#을 사용하자
select id,name
FROM table
WHERE id = #{id}
2. 부적절한 자원 해제 (Java IO)
원인
Stream 자원을 활용하고 반환하지 않는 경우 발생
이유
Open File Descriptor , Heap Memory , Socket, DB 등 유한 자원을 반환하지 않는경우 메모리 이슈 발생 가능
해결방안
Reader/Writer, BuffereReader/BuffereWriter, PipedReader/PipedWriter 과 각종 Stream 사용후 finally문에서 자원해제
가능하면 try-catch-finally 보다 try-with-resources를 사용하자
# try-catch-finally
public class ResourceClose {
public static void main(String[] args) {
Scanner scanner = null;
try {
// scanner 생성
scanner = new Scanner(new File("input.txt"));
System.out.println(scanner.nextLine());
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
// scanner 리소스 반납
if (scanner != null) {
scanner.close();
}
}
}}
=>
# try with resources
public class ResourceClose {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(new File("input.txt"))) {
System.out.println(scanner.nextLine());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}}
Java 7 이후에는 try with resources를 이용하여,
리소스를 생성하고, 자동으로 반납합니다.
위 코드는, try-catch-finally 구문으로 리소스를 생성하고 반납했던 앞의 예제와 같은 내용입니다.
try(Scanner scanner = new Scanner(new File("input.txt")))
try-catch-finally 구문과 달리
try옆에 괄호안에서 리소스를 생성합니다.
그리고, 어느 곳에서도 생성된 리소스를 반납하는 코드가 없습니다.
try with resources 구문을 사용하면 자동으로 리소스가 반납됩니다.
try with resources 구문에 사용 되는 리소스는 (try옆의 괄호 안에서 정의 될수 있는 리소스)
반드시 java.lang.AutoCloseable 인터페이스를 구현해야 합니다.
예제에 사용된, Scanner 클래스도 AutoCloseable 인터페이스가 구현되어 있습니다.
더욱 자세한건 https://hianna.tistory.com/546 참고
3. 중요한 자원에 대한 잘못된 권한 설정 (Java File)
원인
파일, 폴더 생성 시 권한에 대한 설정 없이 생성
이유
개발자 이외 허가받지 않은 사용자가 파일 및 폴더에 접근
해결방안
파일 폴더 생성에 대한 권한을 설정
예시
String src = "경로";
File dir = new File(src);
if(!dir.exists()){
dir.mkdir();
}
.
.
.
=>
String src = "경로";
File dir = new File(src);
dir.setExecutable(false, true); /*파일 실행 권한 설정 (파라미터 - 일반, 소유자)*/
dir.setReadable(true); /*파일 읽기 권한 설정*/
dir.setWritable(false, true); /*파일 쓰기 권한 설정 (파라미터 - 일반, 소유자)*/
if(!dir.exists()){
dir.mkdir();
}
.
.
.
4. 오류 메시지를 통한 정보 노출 (Java Exception)
원인
e.getMessage(), e.toString(), e.printStrackTrace(); 사용
이유
e.getMessage(), e.toString(), e.printStrackTrace(); 등은 오류와 관련된 시스템 정보 노출
해결방안
별도의 로직이나 Logger 사용
예시
try{
}catch(NullPointException e){
e.printStackTrace();
}
=>
try{
}catch(NullPointException e){
LOGGER.error("빈 값이 존재");
}
5. 기타
아이디 패스워드 등 중요정보의 암호화 부제
DB 접속정보의 하드코딩
파라미터의 검증 없이 사용
부적절한 Exception 사용
'ETC' 카테고리의 다른 글
svn,git의 차이 (0) | 2024.07.01 |
---|---|
쿠버네티스 란? (0) | 2023.11.13 |
Jenkins란? (0) | 2023.11.13 |
아파치,톰캣,메이븐,폼 (0) | 2023.11.13 |
HTTP 응답상태 코드 정리 (0) | 2023.11.13 |