티스토리 뷰

프로그래밍

[ETC] 웹개발 보안관련

ReturnToHome 2016. 12. 24. 21:12

- SQL 인젝션

 

try {

String tableName = props.getProperty("jdbc.tableName");

String name = props.getProperty("jdbc.name");

String query = "SELECT * FROM " + tableName + " WHERE Name = " + name;

stmt = con.prepareStatement(query);

rs = stmt.executeQuery();

... ...

} catch (SQLException sqle) {}

finally {}

 

 

--> preparedStatement 객체를 상수 스트링으로 생성, 인자부분을 set 으로 설정한다.

 

 

try {

String tableName = props.getProperty("jdbc.tableName");

String name = props.getProperty("jdbc.name");

String query = "SELECT * FROM ? WHERE Name = ? ";

stmt = con.prepareStatement(query);

stmt.setString(1, tableName);

stmt.setString(2, name);

rs = stmt.executeQuery();

... ...

} catch (SQLException sqle) {}

finally {}

 

 

 

- 운영체제 명령 실행

 

...

props.load(in);

String version = props.getProperty(dir_type);

String cmd = new String(cmd.exe /K \"rmanDB.bat \"");

Runtime.getRuntime().exec(cmd + " c:\\prog_cmd\\" + version);

 

 

--> 미리 정의된 인자값의 배열을 만들고 적절한 인자값을 택하도록

 

 

...

props.load(in);

String version = props.getProperty(dir_type);

String version[] = {"1.0", "1.1"}

int versionSelection = Interger.parseInt(props.getProperty("version"));

String cmd = new String(cmd.exe /K \"rmanDB.bat \"");

String vs = "";

if ( versionSelection == 0 )

vs = version[0];

else if ( versionSelection == 1 )

vs = version[1];

else

vs = version[0];

 

Runtime.getRuntime().exec(cmd + " c:\\prog_cmd\\" + vs);

 

 

 

- XQuery 인젝션

SQL 인젝션 과 마찬가지로 String 으로 붙이지 말고 bindString 을 사용하여 파라미터 값 대입

 

 

 

- XPath 인젝션

Map 을 생성하여 인자를 put 한 후 사용

 

 

 

- 크로스 사이트 스크립트

<h1>XSS Sample</h1>

<%

String name = request.getParameter("name");

%>

<p>NAME: <%=name%> </p>

 

 

--> replaceAll() 을 사용해 html entity name 으로 변경

 

 

<h1>XSS Sample</h1>

<%

String name = request.getParameter("name");

%>

if ( name != null ) {

name = name.replaceAll("&", "&amp;"); // &

name = name.replaceAll("<", "&lt;"); // <

name = name.replaceAll(">", "&gt;"); // >

name = name.replaceAll("\"", "&#34;"); // "

name = name.replaceAll("\'", "&#39;"); // '

name = name.replaceAll("%00", null); // null 문자

name = name.replaceAll("%", "&#37;"); // %

} else { return }

<p>NAME: <%=name%> </p>

 

 

** 파일의 삭제 처리 등의 기능을 할 시에도 위와 같이 상대경로(/, \\, &, . 등 특수문자) 를 설정할 수 없도록 replaceAll() 을 이용하여 특수문자 제거

 

 

 

- 파일 업로드

...

public void upload(HttpServletRequest request) throws ServletException {

MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;

String next = (String) mRequest.getFileNames().next();

MultipartFile file = mARequest.getFile(next);

 

// MultipartFile 로 부터 file 을 얻음

String fileName = file.getOriginalFilename();

 

// upload 파일에 대한 확장자 체크를 하지 않음

File uploadDir = new File("/app/webapp/data/upload/notice");

String uploadFilePath = uploadDir.getAbsolutePath()+"/" + fileName;

 

/* 이하 file upload 루틴 */

 

 

--> 확장자 제한

 

 

...

public void upload(HttpServletRequest request) throws ServletException {

MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;

String next = (String) mRequest.getFileNames().next();

MultipartFile file = mARequest.getFile(next);

 

if ( file == null ) return;

 

if ( fileName != null ) {

if ( fileName.endsWith(".doc") || fileName.endsWith(".hwp") || fileName.endsWith(".pdf") || fileName.endsWith(".xls") ) {

/* file 업로드 루틴 */

// 저장 시 파일명 변경. 외부 사용자가 추측 불가능 한 명으로

...

} else {

throw new ServletException("에러");

}

}

 

 

// MultipartFile 로 부터 file 을 얻음

String fileName = file.getOriginalFilename();

 

// upload 파일에 대한 확장자 체크를 하지 않음

File uploadDir = new File("/app/webapp/data/upload/notice");

String uploadFilePath = uploadDir.getAbsolutePath()+"/" + fileName;

 

/* 이하 file upload 루틴 */

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함