목록Java (81)
삶 가운데 남긴 기록 AACII.TISTORY.COM
Bcrypt 사용 예 maven이나 gradle로 관련 라이브러리를 추가 후 아래와 같이 사용합니다. String pw = "pw1234!"; //실제 데이터베이스에 저장될 패스워드의 해시값 String hashed = BCrypt.hashpw(pw, BCrypt.gensalt()); //입력된 패스워드와 해시되어 저장된 패스워드를 비교 boolean isValid = BCrypt.checkpw(pw, hashed); salt 해시된 패스워드를 저장한 테이블인 Rainbow Table 을 이용한 해킹 공격을 막기 위하여 랜덤 생성한 salt값을 더한 뒤 다시한 번 해시 값을 얻어서 Rainbow Table 을 이용한 공격을 막습니다. Bcrypt 해시 값의 예 $2a$10$vI8aWBnW3fID.ZQ4/..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bDmNSu/btrQyxtZD5w/7DceqvW3L4BP6eJfY9AvD1/img.png)
JAVA application Export runnable jar 자바 어플리케이션을 실행가능한 jar 파일로 만들 때 manifest 파일(MANIFEST.MF)에 메인 클래스를 지정해줘야 합니다. https://iloveaired.tistory.com/entry/Jar-manifest-%ED%8C%8C%EC%9D%BC-%EB%93%B1%EB%A1%9D%ED%95%98%EA%B8%B0 Jar manifest 파일 등록하기 예) Manifest-Version: 1.0 Main-Class: XXXXX iloveaired.tistory.com https://m.blog.naver.com/eungsik80/220054805497 jar 파일 생성 시 MANIFEST.MF 작성 jar 파일 생성 시 MANIFE..
1. 인코딩(Encoding) 1.1. 파일 및 문자 인코딩은 UTF-8 (gerneral_ci)으로 통일한다. 2. 이름(Naming) 2.1. 변수명, 클래스명, 인터페이스명, 메서드명에는 영어와 숫자만 사용한다. public interface AutoClosable{ 2.2. 변수명, 클래스명, 인터페이스명, 메서드명 단어 합성시에는 낙타 등 표기법으로 한다. public interface RowMapper{ 2.3. 클래스명, 인터페이스명, 생성자명은 대문자로 시작한다. public class WatcherClass{ 2.4. 변수명과 메서드명은 소문자로 시작해야한다. public String setHtmlName(String mode){ 2.5. 상수명은 모두 대문자로 하고 단어를 합성할 때는 ..
java.util.concurrent.TimeUnit 패키지 TimeUnit은 멀티 Thread가 아닌 메서드에서 시간을 지연 시킬 때 사용합니다. 예제 import java.util.concurrent.TimeUnit; public class SimpleTest { public static void main(String[] args) { try { for (int i = 0; i < 3; i++) { TimeUnit.SECONDS.sleep(2); System.out.println("Sleep "+i+" sec"); } }catch(Exception e) { System.out.println(e); } } } 자세한 api 문서는 아래 참고 https://docs.oracle.com/javase/7/d..
정수 오버플로우 java 에서 허용한 큰 정수 값보다 더 커지면 의도하지 않게 작은 수 이거나 음수가 될 수 있습니다. 정수형 변수를 연산에 사용하는 경우 결과값의 범위를 체크하는 모듈을 사용합니다. 안전하지 않은 예 //생략 int size = new Integer(args[0]).intValue(); size += new Integer(args[1]).intValue(); MyClass[] data = new MyClass[size]; //생략 배열의 값이 오버플로우되어 음수가 되면 배열의 크기가 음수가 되어 문제가 생길 수 있습니다. 동적 메모리 할당을 위해 배열의 크기를 사용하는 경우 그 값이 음수인지 아닌지 검사하는 문장이 필요합니다. 안전한 코드의 예 //생략 int size = new Int..
HTTP Response Splitting(HTTP 응답 분할) HTTP request에 들어있는 인자값이 HTTP response header에 포함되어 사용자에게 다시 전달 될 때, 입력값에 CR(캐리지리턴), LF(라인피드)같은 줄바꿈 문자가 존재하면 response가 2개 이상으로 분리될 수 있는데, 공격자가 첫번째 응답을 종료시키고 두 번째 응답에 악의적인 코드를 주입해서 XSS 및 캐시를 훼손하는 공격 등을 할 수 있습니다. 외부 입력값을 HTTP response의 응답 헤더(Set Cookie 등)에 포함시킬 경우 CR, LF를 제거하거하거나 오작동을 일으킬만한 소지가 있는 문자들을 제거하여 방어합니다. 안전하지 않은 예 //생략 response.setContentType("text/html..
Cross-Site Request Forgery 사용자가 인지하지 못한 상황에서 사용자 의도와는 무관한 공격자의 행위를 요청하게 하는 공격을 말합니다. 사용자의 세션이 특정 동작을 수행해도 계속 유지되어 정상요청과 비정상요청을 구분하지 못하는 점을 악용합니다. GET방식은 URL에 추가적인 정보를 덧붙일 수 있으므로 CSRF 공격에 노출 될 수 있습니다. 입력 폼(form) 작성시 GET보다는 POST로 전달하고 입력 폼과 서버측 프로그램 사이에 토큰을 사용하여 공격자의 직접적인 URL 사용이 동작하지 않도록 처리하여 방어합니다. 중요한 기능은 세션검증과 재인증을 유도합니다. 안전하지 않은 예 ... ... ... post를 사용하여 방어 ... ... ... 참고 http://cwe.mitre.org/..
Unrestricted Upload of File with Dangerous Type(위험한 형식 파일 업로드) 서버측에서 실행할 수 있는 파일(asp, jsp, php 등) 이 업로드 가능할 때, 이 파일을 이용해 시스템 내부 명령어를 실행하여 공격하는 방법입니다. 업로드하는 파일의 유효성 검사로 방어합니다. white list 확장자만 업로드 합니다. 업로드 디렉토리를 웹서버의 다큐먼트 외부에 설정합니다. 파일 실행 권한을 설정할 수 있는 경우 실행 권한을 제거합니다. 안전한 코드의 예 ... public void upload(HttpServletRequest request) throws SevletException{ MultipartHttpServletRequest mRequest = (Multip..
OS Command Injection 사용자 입력값에 운영체제 명령어를 넣어서 실행하는 경우 시스템을 직접 공격할 수 있습니다. 그래서 외부 입력 값을 그대로 시스템 내부 명령어로 사용하지 않아야 합니다. 만약 명령을 실행해야 하는 경우 미리 명령어 생성에 필요한 값들을 지정해놓고 외부 입력을 참고하여 사용합니다. 아래 예제는 cmd.exe 를 사용하여 rmanDB.bat 배치 명령을 실행하여 외부 입력값인 dir_type을 인자 로 사용하는 경우 입니다. ... String version = props.getProperty("dir_type"); String cmd = new String("cmd.exe /K \"rmanDB.bat \""); Runtime.getRuntime().exec(cmd + "..
Cross-site Scripting 악의적인 스크립트로 정보 유츨등 공격을 할 수 있습니다. 사용자 입력 문자열에서 , &, "," 등을 <, >, &, "로 치환해 방어합니다. HTML 태그를 허용하는 게시판에서는 허용하는 태그(white list)를 선정 한 후 허용된 태그만 허용하는 방식을 사용합니다. 보안 검증이 되어 있는 API를 사용해야 합니다. 아래 예제는 name 이라는 입력 값에 스크립트 (예: 를 수행하게 하여 쿠키 정보 유출 등 피해를 줄 수 있게 됩니다. NAME: replaceAll() 메소드로 위험한 문자를 교체합니다. OSWASP(http://Https://www.owasp.org/index.php/Esapi)에서 제공하는 보안 API를 사용합니다. J2E..
Resource Injection 파일이나 소켓 포트 등 외부 입력값을 식별자로 사용하는 경우, 시스템 자원에 임의로 접근하거나 수정할 수 있고 잘못된 입력값으로 인해 시스템이 불안정해질 수 있습니다. 입력 값을 검증하거나 사전에 정의된 리스트에서 선택되도록 작성해 방어합니다. 외부 입력이 파일명인 경우 경로 순회를 수행할 수 있는 문자를 제거해야 합니다. 아래 예제는 외부의 입력을 소켓 번호로 그대로 사용하고 있어 안전하지 않은 예입니다. public void service(){ //외부에서 입력 받은 데이터 String service = props.getProperty("Service No"); int port = Integer.parseInt(service); //외부 입력 값으로 소켓생성 serv..
SQL Injection 사용자의 입력값에 Query를 직접 입력해서 쿼리 구조를 바꾸어 개발자가 의도하지 않은 동작을 수행하게 하는 공격 기법입니다. 예) ID를 guest ' OR 'a'='a' -- 으로 설정 한경우 쿼리가 아래처럼 생성되어 Where절이 항상 참이므로 비번 없이 로그인에 성공할 수 있습니다. SELECT * FROM members WHERE userId='guest' OR 'a'='a' -- AND paseword = ... preparedStatement 클래스를 사용해서 미리 컴파일된 쿼리를 사용해 쿼리를 동적으로 생성할 수 없게 해서 방어합니다. String query = "SELECT * FROM ? WHERE NAME = ?"; pstmt con.prepareStateme..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bUbg5T/btrIfs01wwZ/sy7Z2IusErtkNn4E039rTk/img.png)
CRUD 웹 어플리케이션은 서버의 자원을 Create, Read, Update, Delete 하도록 서비스를 구성하는데 이를 줄여서 CRUD라고 합니다. 예를들어 회원 가입(Create), 회원정보조회(Read), 회원정보수정(Update), 회원정보삭제(Delete) 를 한 세트로 묶어서 회원정보에 대한 서버 자원(DB)에 대한 서비스를 구현합니다. 이전 jsp프로젝트 처럼 새 Dynamic Web Project를 생성하여 예제를 구현해보도록 합시다. tomcat의 context path는 / 으로 지정합니다. 프로젝트 생성시 web.xml 생성 옵션을 체크합니다. 프로젝트 src 경로에 controller, dao, service, vo 패키지를 생성합니다. 그리고 .do 요청을 처리하기 위해 프론트..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/leFNt/btrHSBqXmjB/K4muUyVphRuyyGIdOQKDpk/img.png)
MVC패턴은 어플리케이션을 Model, View, Controller 으로 작업을 분리해서 모듈간 결합도를 최소화하여 각종 변화하는 상황에 대응하면서도 부작용을 줄이고, 유지보수성도 높일 수 있는 어플리케이션 개발 디자인 패턴을 말합니다. 작업을 모듈별로 나누어 작업하고 이를 결합해 주기 때문에 협업에도 유용하며, 협업시 개발자 자신이 맡은 역할에만 집중할 수 있도록 도와줍니다. View는 클라이언트와 서버간 인터페이스 역할을 하며, 클라이언트 요청을 받고 서버로부터의 결과를 표시해주는 기능을 합니다. Model은 비지니스 로직 서비스와 데이터베이스 처리를 담당합니다. Controller는 View와 Model을 연결해주는 역할을 합니다. 우선 SQL Developer 같은 DB 툴을 이용하여 오라클DB..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bdRAzR/btrHM8CfViV/ehEcgA5oEJ3dKMP7kS2jF1/img.png)
JSTL SQL 태그는 많이 사용하지는 않지만 알아두도록 합시다. SQL 기본 액션 : 커넥션 풀 DataSource를 생성하는 태그입니다. var: DataSource 의 설정값을 저장하는 변수의 이름을 지정합니다. dataSource : JNDI 서버에 등록하는 리소스 이름을 지정합니다. scope : 변수의 유효범위를 지정합니다. driver : 로딩할 JDBC 드라이버 정보를 지정합니다. url : 접속할 DB서버의 URL을 지정합니다. userName : DB서버에 로그인할 ID를 지정합니다. password : DB서버에 로그인할 패스워드를 지정합니다. : select 문을 수행하기 위한 태그입니다. sql : 실행할 sql문을 지정합니다. var : select 한 결과값을 ResultSet..