목록전체 글 (323)
삶 가운데 남긴 기록 AACII.TISTORY.COM
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..
데이터 무결성 검사 단일 테이블에 대해 무결성 검사를 하려면 mysql> CHECK TABLE 데이터베이스이름.테이블이름; 리눅스 콘솔에서 전체 테이블을 검사 하려면 mysqlcheck -u root -p --check --databases 데이터베이스이름 테이블 무결성 검사는 정기적으로 하는 것을 권장합니다. Optimize 사용하지 않은 공간을 회수합니다. MyISAM 엔진을 쓰는 MySQL에서는 optimize 명령은 단편화 제거 작업만을 수행합니다. InnoDB 엔진을 쓰는 MySQL에서는 ALTER문으로 인덱스를 재생성하도록 요청합니다. 단일 테이블에 대해 optimize 하려면 mysql> OPTIMIZE TABLE 데이터베이스이름.테이블이름; 리눅스 콘솔에서 전체 테이블을 optimize 하..
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 요청을 처리하기 위해 프론트..
MVC패턴은 어플리케이션을 Model, View, Controller 으로 작업을 분리해서 모듈간 결합도를 최소화하여 각종 변화하는 상황에 대응하면서도 부작용을 줄이고, 유지보수성도 높일 수 있는 어플리케이션 개발 디자인 패턴을 말합니다. 작업을 모듈별로 나누어 작업하고 이를 결합해 주기 때문에 협업에도 유용하며, 협업시 개발자 자신이 맡은 역할에만 집중할 수 있도록 도와줍니다. View는 클라이언트와 서버간 인터페이스 역할을 하며, 클라이언트 요청을 받고 서버로부터의 결과를 표시해주는 기능을 합니다. Model은 비지니스 로직 서비스와 데이터베이스 처리를 담당합니다. Controller는 View와 Model을 연결해주는 역할을 합니다. 우선 SQL Developer 같은 DB 툴을 이용하여 오라클DB..
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..
Properties 파일 웹 어플리케이션에서 다국어 지원을 위해 Properties 파일을 이용하는 경우가 많습니다. net.aacii.bundle 패키지를 생성해서 msg_ko.properties와 msg_en.properties 파일을 생성합니다. 이 properties 파일들은 한글의 경우 이클립스에서 자동으로 유니코드로 변환해주는데, 이 properties 파일들을 우클릭 후 open with를 선택 후 텍스트에디터로 열게 되면 한글이 유니코드로 변환되어 있는 것을 확인할 수 있습니다. 만약 자동으로 유니코드로 변환이 되지 않는다면, 이클립스 플러그인 중에 Properties Editor를 설치하시면 됩니다. 이 플러그인 설치 방법은 여기에서 다루지 않겠습니다. msg_ko.properties 을..
오라클 데이터베이스 19c 다운로드 https://www.oracle.com/database/technologies/oracle-database-software-downloads.html 파일: Linux x86-64 종류: zip 자신의 운영체제에 맞는 zip 파일을 다운로드합니다. 호스트 네임 등록 root 권한을 획득합니다. su - 호스트 네임을 등록합니다. vi /etc/hosts 리눅스 서버의 ip 주소(192.168.1.6)에 호스트 네임을 정해줍니다. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6...
오라클은 접속 사용자 계정의 패스워드 설정 기본 값이 패스워드를 180일 주기로 변경하도록 되어 있습니다. 만료일이 지나면 다음과 같은 메시지를 확인 할 수 있습니다. oracle: the password has expired. 조치 절차에 대해 설명합니다. 1. 로그인 없이 sqlplus 실행 후 dba 계정으로 접속 sqlplus /nolog connect sys as sysdba 2. 혹은 sqlplus 바로 dba 계정으로 접속 sqlplus / as sysdba 3. passowrd_life_time 값 확인 (기본값 180일) select * from dba_profiles where profile = 'DEFAULT'; 4. 만료일을 unlimited로 변경 alter profile defa..
JSTL(Java Server Pages Standard Tag Library) 개요 자주 사용하는 기능은 커스텀 태그로 구현 한다음 재사용하면 편리합니다. 그러나 커스텀 태그는 직접 만드려면 많은 수고가 필요하게 됩니다. 그래서 표준 태그 라이브러리가 존재하는데 이것이 JSTL 입니다. JSTL 1.0은 Servlet 2.3과 JSP1.2와 호환 JSTL 1.1은 Servlet 2.4와 JSP2.0과 호환 JSTL 1.2은 Servlet 2.5와 JSP2.1과 호환 core는 기본 기능이 포함되어 있으며 formatting은 날짜 시간에 관한 기능, sql은 데이터베이스 작업기능 xml은 xml을 지원하는 기능 functions은 여러 함수 기능이 구현되어 있습니다. core: formatting: s..
각 랭크에 맞는 레시피로 생산하면서 올립니다. 레시피: 직물비법서 소재에 관한 글(본거지 대도시 도구점) 1랭크 이상: 닭(헤르데르, 리스본) -> 깃털(북해 이외의 곳에서 판매, 북해명산품) * 보관2랭크 이상을 배웠다면 동남아시아인 말라카에서 닭을 구입 후 보관레시피인 여행자의 식량조달술(살로니카,벵가지 투자)로 달걀->닭,오리->달걀-> 무한증식 후에 남은 닭과 오리를 깃털로 변환 시킨 후 그자리에서 판매 한다면 깃털은 북해의 명산품이기 때문에 명산거리 판정으로 인한 교역경험치를 많이 획득 하실 수 있습니다. 이 방법은 소위 깃털 온라인이라 불리는 방법입니다. 벨벳 원가가 비싸진 관계로 벨벳을 대신해 상업레벨을 이득을 보면서 수월하게 올릴 수 있습니다. 레시피: 직물비법서 옷감에 관한 글(본거지 대..
각 레시피를 구해서 랭크에 맞는 생산물을 생산하면서 랭작합니다. 레시피: 조선공입문주조편(그로닝겐, 플리머스, 시라쿠사, 제노바, 말라가, 포르투 등 대장장이) 1랭크: 목재(오슬로, 베르겐) -> 목공도구 2랭크: 목재3 -> 예비키 3랭크: 청동2(플리머스, 런던투자발전), 석탄(더블린, 함부르크) -> 철수의 종(백병전 퇴각 아이템) 5랭크: 검은색흙(야파 외곽 채집), 화약2(바르셀로나), 석유(야파) -> 화염단지 5랭크: 유황(리가, 스톡홀름), 화약2(바르셀로나), 석유(알제) -> 폭약장치 12랭크: 흰색광석(실론 외곽 채집4, 농장, 보르도던전 등), 철재(고어, 캘커타에서 금속재련서로 생산), 목재(실론 외곽 통나무 채집1 후 조선공입문 공예편 목재로 생산, 말린디, 페구) -> 명인 ..
조리는 가축거래, 식료품거래, 조미료거래를 배워 두는 것이 유리합니다. 그리고 다음 자료는 조리의 모든 정보가 아니라 매우 유용하거나 만들기 쉬운 것들, 조리 랭크 올리기에 필요한 것들을 요약 정리한 것입니다. 누가해도 간단한 레시피(북해): 보르도, 팔마, 앤트워프 등에서 판매 1 랭크: 밀 -> 밀가루 (앤트워프, 포르투 등) 과자 만드는 법 초급편(북해): 암스테르담에서 7천 두캇 2 랭크 : 달걀, 밀가루 -> 비스켓 처음 굽는 빵(지중해): 피사에서 7천 두캇 2 랭크: 달걀, 밀가루 ->베이글 축산 비법서 새의 장(지중해): 칼비, 라구사에서 8천 두캇 1 랭크: 닭, 오리 -> 달걀 (보관 스킬에 의해 다시 닭 오리로 증식가능) 3 랭크: 닭 -> 닭고기(마늘닭 통구이 재료) 3 랭크: 오리..