PMD는 정적인 소스코드 분석 도구로

자세한 설치와 사용법은 한국인터넷진흥원에서 제공하는

"공개SW를 활용한 소프트웨어 개발보안 검증가이드"의 "4장 PMD 사용방법"을 따라 한 후 다음 내용을 읽기 바란다.


게시판 예제를 대상으로 PMD를 실행하면 다음과 같은 결과를 얻게 된다.

화면 하단의 "Violations Overview"에서 오류를 두번 클릭하면 해당 오류 코드로 이동한다.

게시판에서 AvoidCatchingGenericException오류가 발견되었다.

이 오류는 일반적인 예외처리(Exception)을 하지 말라는 것으로

TransactionException 등과 같이 구체적으로 작성하면 된다.


예외 처리에 대한 자세한 설명은 검색해 보거나 이 블로그를 참고하기 바라고

위 결과와 관련하여 한가지를 더 처리한다.

board4.xml의 게시판 글쓰기 처리를 하는 SQL인 insertBoard4에서 사용하는 필드명을 틀리게 작성한다.

여기에서는 BRDTITLE1으로 지정했다.

    <insert id="insertBoard4" parameterType="gu.board4.boardVO" >
           <selectKey resultType="String" keyProperty="brdno" order="BEFORE">
            SELECT IFNULL(MAX(BRDNO),0)+1 FROM TBL_BOARD
        </selectKey>
   
        INSERT INTO TBL_BOARD(BRDNO, BRDTITLE1, BRDWRITER, BRDMEMO, BRDDATE, BRDHIT, BRDDELETEFLAG)
        VALUES (#{brdno}, #{brdtitle}, #{brdwriter}, #{brdmemo}, NOW(), 0, 'N' )
    </insert>

board4.xml

웹 브라우저에서 게시글을 작성한후 저장하면(http://localhost:8080/board/board4Save) 다음과 같은 오류가 발생한다.

그림에 나타난 것과 같이 사용된 SQL문과 경로 정보등이 사용자에게 노출되어 보안에 문제를 야기하게 된다.

따라서 PMD에서는 잡히지 않았지만 예외 처리를 바꿔야 한다.


흔히 사용되지만 다음과 같은 코드는 사용하지 않는 것이 좋다.

try {
    프로그램 코드
} catch(Exception e) {
    e.printStackTrace();
}

printStackTrace대신에 System.out.println(e), throw e 등도 사용하지 않는 것이 좋다.

예제에 사용하지 않았지만

이러한 오류를 오류 메시지를 통한 정보노출이라고 하여 PMD에서는 AvoidPrintStackTrace로 설정하여 오류로 출력해 준다.


즉, 앞서 PMD에서 지적된 Avoid catching generic exceptions과 같이 정리하면

다음과 같이 구체적인 예외 처리를 하고 메세지는 직접 출력하는 것이 좋다.

try {
    프로그램 코드
} catch (BadSqlGrammarException ex) {
    System.out.println("잘못된 SQL 문 사용"+ ex.toString());
}

SQL문을 틀리게 작성했기 때문에 BadSqlGrammarException으로 구체적으로 명시하고

오류메세지를 직접 출력한다.

board4Svc.java의 insertBoard 함수에서 위와 같이 수정하고 실행하면

로그에는 오류가 출력되지만 웹 사이트에서는 오류 없이 리스트로 넘어간다.

(사용자에게 글 저장이 안된다는 연락을 받을 수 있다.)


정리하면 다음과 같이 사용하는 것이 좋다.

BadSqlGrammarException는 일부러 발생시킨 오류이기 때문에 TransactionException으로 처리한다.

아니면 try 문을 사용하지 않고 처리해도 된다.

public void insertBoard(BoardVO param, List<FileVO> filelist, String[] fileno)  throws Exception {
       
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus status = txManager.getTransaction(def);
       
        try {
            ~~ 생략 ~~
            txManager.commit(status);
        } catch (TransactionException ex) {
            txManager.rollback(status);
            System.out.println("데이터 저장 오류: " + ex.toString());
        }           
    }

Board41Svc.java

오류로 잡히지 않았지만 모든 메소드에  throws Exception(위 코드의 굵은 글자) 가 사용되고 있다.

Java 관련 코드에서 일반적으로 사용하는 것이지만 제거하는 것이 좋다.

앞서 언급된 일반적인 예외처리는 지양하는 것이 좋고, 

예외 처리를 Exception으로 던지고 마는 것이 아니라

try문으로 보다 구체적으로 처리하는 것이 추천되기 때문이다.

따라서 Board41Ctr.java와 Board41Svc.java의 throws Exception를 모두 제거하는 것이 좋다.

ex.toString()도 가급적 사용하지 않는 것이 좋지만

개발시 정확한 오류 메시지를 확인하기 위해 사용하였다.


언급한 예외 처리는 Eclipse에서 기본적으로 생성해 주는 것으로 무심코 넘기는 경우가 많은 데,

최근 공공기관, 대기업 등에서 보안에 대한 관심이 높아지면서

상용 도구를 이용하여 이상의 내용보다 더 많은 내용을 점검하고 있다.

따라서 공개 S/W를 이용하여 이러한 사항들을 미리 처리하는 것이 좋을 것이다.


마지막으로

이러한 조치를 다한 후에 web.xml에서 에러 페이지 처리를 해줘야 한다.

설정 방법은 검색해 보거나 다음 블로그를 참고하면 된다.

http://artrix.tistory.com/383

http://hyeonstorage.tistory.com/98


이러한 조치를 통해 다음 그림과 같이 사용자에게 불필요한 정보가 노출되지 않도록 해야 된다.

다음과 같이 web.xml에서 Exception 오류에 대한 오류 웹 페이지 지정을 처리를 해주면 되고

404, 500등의 오류도 처리해 주는 것이 좋다.

    <!-- error 페이지 -->
    <error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/WEB-INF/jsp/common/error.jsp</location>
    </error-page>

    <error-page>
        <error-code>404</error-code>
        <location>/WEB-INF/jsp/common/error404.jsp</location>
    </error-page>

board\src\main\webapp\WEB-INF\web.xml

이상의 내용은 사이트 품질과도 관련되지만

정보 노출의 의미에서는 웹 사이트 보안과도 관련이 있는 내용으로 잘 숙지해서 처리해야 한다.


'Java > 게시판 기타: 품질 등' 카테고리의 다른 글

1. 프로그램 작성 외의 것들  (1) 2016.04.24
2. CheckStyle I - 설치  (0) 2016.04.23
3. CheckStyle II  (0) 2016.04.23
4. FindBugs  (0) 2016.04.23

+ Recent posts