Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 스프링부트
- EXTJS
- springboot
- sql
- DATABASE
- JS
- 컴포넌트
- javascript
- 리액트
- java
- Vue
- 스프링
- component
- reactjs
- 자바스크립트
- 보안취약점
- jdk
- Intellij
- 데이터베이스
- restapi
- Spring
- GIT
- 개발공부
- mssql
- 개발
- 자바
- crud
- React
- 쿼리
- table
Archives
- Today
- Total
준준의 기록일지
[JAVA7] Try-with-Resources 자원 자동할당 (보안취약점 보완) 본문
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
아래와 같이 try에서 객체 초기화를 통해 자동해제를 해줄 경우, 아래와 같은 문제가 발생할 수 있다.
socket class의 객체를 초기화해주고 해당 socket을 다른 객체에 할당해준다.
try()에서는 객체 초기화만 가능하므로, socket.setSoTimeout(1000 * 30);을 중간에 껴넣을 수가 없다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
try( //Try-with-resources를 이용한 자원 자동해제.
Socket socket = new Socket(psCommunicator.getAddress(), psCommunicator.getPort());
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter out = new PrintWriter(bw, false);
InputStream gzippedResponse = socket.getInputStream();
InputStream ungzippedResponse = new GZIPInputStream(gzippedResponse);
BufferedReader reader = new BufferedReader(new InputStreamReader(ungzippedResponse, StandardCharsets.UTF_8));
) {
socket.setSoTimeout(1000 * 30);
out.flush();
} catch (ConnectException e) {
throw new MessageException("Server " + e.getMessage());
} catch (IOException e) {
logger.errorLog(new Object(){}, e);
}
|
cs |
이때 socket.setSoTimeout(1000 * 3)을 bufferedWriter 객체 초기화전에 넣어주는 방법은,
socket 클래스를 상속하는 커스텀클래스를 만들고 생성자 안에서 super로 기존 생성자를 호출한다
-> setTimeout 로직 부분을 생성자 안에 넣어서 코드를 작성하면 된다.
SocketCustom
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package com.timegate.support.xd.ddc;
import java.net.*;
public class SocketCustom extends Socket{
public SocketCustom() {
super();
try {
setSoTimeout(1000 * 30);
} catch (SocketException e) {
e.printStackTrace();
}
}
public SocketCustom(String address, int port) {
super();
try {
setSoTimeout(1000 * 30);
} catch (SocketException e) {
e.printStackTrace();
}
}
}
|
cs |
A.class
1
2
3
4
5
6
7
|
try( //Try-with-resources를 이용한 자원 자동해제. jh.won.
SocketCustom socket = new SocketCustom(psCommunicator.getAddress(), psCommunicator.getPort()); //커스텀 Socket class를 만들어 setSoTimeout(1000 * 30)을 생성자에 넣어줌.
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8")), false);
InputStream gzippedResponse = socket.getInputStream();
InputStream ungzippedResponse = new GZIPInputStream(gzippedResponse);
InputStreamReader streamReader = new InputStreamReader(ungzippedResponse, StandardCharsets.UTF_8);
)
|
cs |
기존의 자원할당해제하는법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//객체 초기화
InputStreamReader streamReader = null;
try{
//비즈니스 로직.
}
catch(){
}
finally {
try {
if(streamReader != null) streamReader.close();
} catch (Exception e) {
logger.errorLog(new Object(){}, e);
}
}
|
cs |
출처 :
https://logical-code.tistory.com/162
'개발 전체' 카테고리의 다른 글
[PM] WBS(Work Breakdown Structure)란?? (0) | 2021.09.02 |
---|---|
[JAVA] String, StringBuilder, StringBuffer (0) | 2021.08.31 |
[Git] Git 소스트리 key chain denied (0) | 2021.08.10 |
[Session] JSESSIONID (1) | 2021.08.09 |
[보안] XSS 취약점 필터 - Lucy-xss-filter-servlet (0) | 2021.08.02 |