티스토리 뷰
- 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("&", "&"); // &
name = name.replaceAll("<", "<"); // <
name = name.replaceAll(">", ">"); // >
name = name.replaceAll("\"", """); // "
name = name.replaceAll("\'", "'"); // '
name = name.replaceAll("%00", null); // null 문자
name = name.replaceAll("%", "%"); // %
} 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 루틴 */
'프로그래밍' 카테고리의 다른 글
[ETC] HTML5 Web Storage (0) | 2016.12.24 |
---|---|
[ETC] VI 에디터 명령어 (0) | 2016.12.24 |
[ETC] SQL Developer 모듈 비활성화 오류 시 처리 방법 (2) | 2016.12.24 |
[JAVA] Filter, Interceptor 차이 (0) | 2016.12.24 |
[DB] ORACLE start with, connect by (0) | 2016.12.24 |
- Total
- Today
- Yesterday
- 햄버거
- 푸에르토 나탈레스
- Cambodia
- 남미
- 빅토리아폴스
- Uyuni
- 칼라마
- 토레스 델 파이네
- 아구아스 칼리엔테스
- aguas calientes
- 캄보디아
- 마추피추
- 후마리
- 성스러운 계곡
- 우유니
- 족발
- jQuery
- Namibia
- 남미 저가항공
- 나미비아
- 성계 투어
- 빈트후크
- 쿠스코
- Oracle
- 볼리비아
- 애드센스
- calama
- 칠레
- Cusco
- 킹덤 호텔
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |