2023년 5월 18일 목요일

자바 시큐어코딩 Public메소드부터 반환된 Private 배열 또는 private 배열에 Public 데이타 할당

Private 배열에  public 데이타할당
또는
Public 메소드부터 반환된 private배열

예제

public class ListDTO{
    private List<testDto> testList;
    public List<testDto> getTestList(){
        return testList;
    }
}

>>> 변경
public class ListDTO{
    private List<testDto> testList;
    public List<testDto> getTestList(){
        List<testDto> aa = null;
        if (this.testList != null ){
            aa = this.testList.stream().collect(Collectors.toList());
        }
        return aa;
    }
}

단순  배열인 경우 clone 만 사용하여 변환하면됨

private String[] arrCol = {};
public void setTestName(String[] col} thows IllegalArgumentException{
    String[] cloneArr = {};
    if (col != null ){
        cloneArr = col.clone();
    }
    this.arrCol = cloneArr;
}

2023년 5월 16일 화요일

자바 시큐어코딩 부적절한 XML 외부개체 참조

XML 문서에는 DTD 를 포함할수 있으면 DTD는 XML엔티티를 정의, 부적절한 XML 외부 엔티티를 처리할수 있도록 설정된 경우에 보안약점이 발생됨.

예)
DoculemtBuilderFactory fac = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

TransformerFactory tfac = javax.xml.transform.TransformerFactory.newInstance();

>>>
DoculemtBuilderFactory fac = DocumentBuilderFactory.newInstan
ce();
// xml파서가  doctype을 정의하지 모하도록 설정
fac.setFeature("http://xml.org/sax/features/external-general-entities", false);
// 외부 엔티티를 포함하지 않도록 설정
fac.setFeautr("http://xml.org/sax/features/external-general-entities", false);
// 외부 파라미터도 포함하지 않도록 설정
fac.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
//외부 dtd 비활성화
fac.setFeature("http:/apache.org/xml/features/nonvalidation/load-external-dtd", false);


TransformerFactory tfac = javax.xml.transform.TransformerFactory.newInstance();
tfac.setFeature("http://javax.xml.XMLConstants/feature/secure-processing", true);

DocumentBuilder builder = factory.newDocumentBuilder();

소프트웨어개발보안 가이드
- 행정안전부, 한국인터넷진흥원 참조

자바 시큐어코딩 HTTP응답 분할

공격자가 HTTP요청에 삽입한 인자값이  HTTP 응답헤더에 포함되어 사용자에게 다시 전달될때 개행문자를 이용하여 첫 번째 응답을 종료시키고 두번째 응답에 악의적인 코드가 주입되어 XSS공격등이 가능해진다.

예)

String str = request.getParameter("ref");
reponse.setHeader("Content-Disposition", str);
reponse.setHeader("Referer", str);

>>>>
String str = request.getParameter("ref");
-- 추가 및 수정 부분 
-- 개행 삭제후 처리
str = str.replaceAll("\n","").replaceAll("\r","")

reponse.setHeader("Content-Disposition", str);
reponse.setHeader("Referer", str);