반응형
http://www.faqs.org/rfcs/rfc2616.html

- 200
[OK]  클라이언트의 request가 성공적으로 수행됐다.
request처리결과로 클라이 언트에게 전달되는 정보는 사용된 method에 따라서 달라진다.
[GET] request가 지정한 자원이 response메세 지로 전달 된다.
[HEAD] response메세지에는 요청된 자원에 관한 정보를 나타내는 header만이 포함된다.
[POST] 지 정된 동작의 수행결과를 포함하거나 결과를 설명하는 엔터티가 전달된다.

- 201
[ Created] request 가 처리되었고 그 결과로 새로운 자원이
생성되었다. 생성된 새로운 자원을 나타내는 URI값이 response메시지로 전달된 다. 서버가 이와 같은 status code를 클라이언트에게 전달하기 위해서는 새로운 자원을 먼저 생성시켜야 한다.
response 메시지를 전달 할때까지 새로운 자원이 생성되지 못하면 status code 202(Accepted)를 보내야 한 다. POST method만이 서버에 새로운 자원을 생성시킬 수 있다.

- 202
[Accepted] request 가 수락되었으나 response메시지를 전달할
때까지 그 프로세싱이 완료되지 못했으며 또한 언제까지 request의 수행결과 를 사용자가 볼 수 있을지를 확실히 판단할 수 없다. 이와 같은 status code는 request가 수락된 것 (accepted)만을 나타낼뿐 궁극적으로 그 request가 처리될 것이라는 보장
할 수 없을 때 사용된 다. status code 202는 Web브라우저와 같이 서버의 처리결과를 전달받을 때까지계속 기다리게 되는 클라이언트를 위한 것 은 아니다.
WEb브라우저와는 다른 일종의 batch프로세서(하루에 한번정도 실행되는)의 request를 서버가 받아들 일 수 있도록 하기위한 것이다.

- 204
[No Content] 서버가 request를 처리했지만 클라이언트에 게 전달할 새로운 정보가 없다. 이 status code를 전달받는 Web브라우저는 현재 디스플레이 중인 내용을 변경시키지 않아 야 한다. 이 code를 정의한 주된 목적은 현재 디스플레이 중인 문서의 내용을 변경시키지 않으면서 CGI스크립트 등에 입력을 전 달할 수 있도록하기 위해서이다.

- 300
[Multiple] HTTP/1.0을 사용하는 경우에는 이 code 가 직접적으로Choices 사용되지는 않는다. 다만, 3xx클래스에 속하는 status
code의 디폴트값으로 사용된 다. 그 의미는 301, 302, 304만이 HTTP/1.0에 정의되어 있으므로 그 외의 status code값을 전달받는 경우에 는 300으로 간주한다는 의미가 되는 것이다.

- 301
[Moved] 요청된 자원의 URI값이 완전히 변경되었 으므로 앞으
Permanently 로는 새로운 URI값을 사용하여야 한다. 새로운 URI값은 Location헤더를 통해서 클 라이언트에게 전달된다. 또한
HEAD method를 제외한 모든 경우에 response메시지의 entity body를 통해 서 새로운 URI의 하이퍼링크를 포함하는 짧은 메시지를 전달해 주어야 한다. Web브라우저는 POST method를 사용 한 request의 결과로 301 status code를 전달받는 경우에는 자동으로 새로운 URI에 접속해서는 안된다. 반드 시, 사용자의확인을 거쳐야 한다.

- 302
[Moved] 요청된 자원의 URI값이 임시로 변경되었다. 따라 서 추후
Temporarily 에도 현재의 URI값을 계속 사용하여야 한다. 새로운 URI값은 Location헤더를 통해 서 클라이언트에게 전달된다.
또, HEAD method를 제외한 모든 경우에 response메시지의 entity body 를 통해서 새로운 URI의 하이퍼링크를 포함하는 짧은 메시지를 전달해 주어야 한다. Web브라우저는 POST method를 사용 한 response의 결과로 302 status code를 전달받는 경우에는 자동으로 새로운 URI에 접속을 해서는 안된다. 반드 시 사용자의 확인을 거쳐야 한다.

- 304
[Not] conditional GET method가 사용된 경우 에 전달된다.
[Modified] request를 처리한 결과 If-Modified-Since헤더에 지정된 날짜/시간 이래 로 지정된 문서가 변경된 사실이 없는 경우
서버는 이 status code로 응답해야 한다. 이때, entity body 는 전송되지 않는다. reseponse메시지로 전달되는 헤더들은 주로 cache와 관련된 정보를 포함하게 된다.
cache manager(대 개의 경우는 Web브라우저 자체에 그 기능이 포함된다)는 304 response에 포함된 헤더의 값을 cache된 entity들 에 반영할 수 있도록 하여야 한다.

- 400 
[Bad Request] request메시지의 syntax가 잘 못되어서 서버가 request를 처리할 수 없다. 재접속을 하는 경우에 클라이언트는
반드시 올바른 request메시지를 사용 해야 한다.

- 401
[Unauthorized] request가 user quthentication을 필요 로 한다는 것을 클라이언트에게 알려주기 위해서 사용된다.
WWW-Authenticate헤더를 통해서 요청된 자원에 적용되 는 hallenge를 전달한다. 401 response를 받은 클라이언트는 적절한 Authorization credentials 를 포함하는 Authorization헤더와 함께 다시 request메시지를 전송한다.
request메시지에 그와 같 은 Authorization credentials이
포함된 경우에 401 status code가 전달되 면 user authentication이 실패한 것을 나타낸다.

- 403 
[Forbidden] 서버 가 request의 처리를 거절하는 것을 나타낸다. 이와 같은 응답을 받은 경우에는 동일한 request를 반복하지
말아 야 한다. 왜냐하면 무조건 request가 거절되는 것이기
때문이다. 403 status code는 request를 거절하 는 이유를
명시적으로 밝히고 싶지 않거나 달리 대응할 적절한 status code가 없을때 사용된다.

- 404
[Not Found] Request- URI에 해당하는 자원을 찾을 수 없을 경우에 사용된다. 그런 상태가 일시적인 것인지 아니면 언제나 그렇게되는지를 나타내는 어 떤 정보도 전달되지 않는다. 이런 상태를 클라이언트에게 알리고 싶지 않은 경우에는 403code를 대신 사용해도 된다.

- 500 
[Internal] 서 버프로그램에서 예기치 않은 오류가 발생하여서 request Srever Error  를 처리할 수 없다.

- 501
[Not] request 를 처리하기 위해서는 필요한 기능을 서버가 갖추고 Implemented  있지 못하다.

- 502
[Bad] gateway 나 proxy로 동작하는 서버가 사용하는 것으로 자신
Gateway 의 위쪽에 있는 서버로 부터 잘못된 response메시지 를 전송 받았다는 것을 나타낸다.

- 503
[Service] 과부하나 서버 maintenance때문에 서버 가 잠시동안 request Unavailable 를 처리해 줄수 없는 상태에 있다.
 
반응형

'개발도 하냐?' 카테고리의 다른 글

Prototype URL encode, decode  (0) 2010.06.19
정규표현식(regular expressions)  (0) 2010.06.16
CakePHP Framework  (0) 2010.06.09
editplus setting  (0) 2010.06.06
hidden frame  (0) 2009.12.27
반응형
보안서버에 대해서 잘 모른다면 http://www.kisa.or.kr/jsp/notice/notice_detail.jsp?b_No=4&d_No=143 에서
보안서버구축가이드를 다운로드 받아서 읽어보시기 바랍니다.

보안서버를 구축하기 위해서는 신뢰할수있는 root CA가 발급한 인증서가 필요하죠.
무료로 보안서버를 구축하기 위해서는 인증서가 필요한데
startssl 사이트에서 인증서를 발급받아서 사용가능합니다.

startssl 사이트에 방문해서 몇가지 절차를 거치면 보안서버에 사용가능한 인증서가 발급 됩니다.
(발급과정은 http://www.lovelgw.com/Blog/194 참고)

이메일용 또는 도메인용으로 발급받아서 사용 가능한데 ,
우선 이메일용을 먼저 발급받아서 도메인까지 사용하도록 변경해야 합니다.

그리고, 도메인에 ssl 인증서로 사용할 목적인 경우에는 도메인소유자의 이메일주소가 필요하며,
인증을 모두 받아서 정상적으로 로그인하면 아래와같은 제어판을 사용가능 합니다.



발급과정에서 획득되는 key 와 crt 파일을 이용해서 웹서버에 SSL 인증을 위한 준비를 진행합니다.
(Apache 서버의 ssl 적용은 많은 글들이 있으니 다루지 않습니다.)


SSL 서버를 구축한 후 불여우, 오페라, IE7 으로 테스트 해보니
IE를 제외한 다른 브라우저는 추가 설치없이 무리없이 사용가능한데...ie사용자를 생각하면 우리나라에서 그냥 쓸수 없다는 말..
구글링을 해보니 ie의 경우 root CA를 업데이트 해주고 나서 정상적으로 사용가능한것을 알았습니다.
(http://www.istartedsomething.com/20091010/microsoft-free-root-certificate-authority-windows/)
- 최근의 운영체제들은 대부분 사용가능하지만, 제 개발환경의 경우 CA업데이트가 아직 적용안된상태네요.

제 경우처럼 IE에 StartSSL이 Root 인증기관으로 등록되어 있지 않아서 인증서를 사용할 수없는 사람은
오류메세지를 만나게 될것입니다.

IE의 root CA를 업데이트 하지 않아서 신뢰할수 없는 인증서라는 메세지를 만나는 경우라면
아래의 경로 IE의 root CA를 업데이트 하고 난 후 정상사용 가능합니다.(아래 링크를 참고하세요)
http://support.microsoft.com/kb/931125

업데이트파일 :
IE로 서비스중인 도메인에 https로 접속을 해서
보안되지 않은 내용을 포함하고 있다는 메세지를 만난다면, 브라우저의 보안설정을 아래와 같이 변경해주시기 바랍니다.



모든 설정을 완료했다면, 웹페이지 하단에 아래와 같은 스크립트를 삽입해서 SSL작동되고 있는 모습을 알려주면 좋겠죠

<script type="text/javascript" src="https://www.startssl.com/seal.js"></script>

접속 후 아래와 같은 로고를 볼수있습니다.
(제 경우는 IE에서 스크롤링 스크립트가 문제가 있네요.)

다른 모양의 로고를 삽립하기 위해서는 https://www.startssl.com/?app=24 를 방문해보면 여러가지 모양의 이미지가 있으니 사이트에 적용해 보세요.


IE에서 본 인증서


반응형

'오픈소스SW' 카테고리의 다른 글

웹어플리케이션 테스트  (0) 2010.06.16
http 패킷 보기  (1) 2010.06.13
iptable rule  (0) 2010.06.10
CentOS 5.2.x PHP UPDATE  (0) 2010.06.09
Apache 웹방화벽 ModSecurity 사용하기  (1) 2010.06.08
반응형

#!/bin/sh

#iptables Path
iptables=/sbin/iptables

# SERVER IP 받아오기.
HOST_IP="`/sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | sed -e 's/.*://'`"
NETMASK="`/sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $4}' | cut -d : -f 2`"

# rule delete
# 모두 지우고 다시 재설정합니다.
$iptables -F

######### 비정상적 패킷은 드롭시킨다. 로그에 남긴다. ###############
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A FORWARD -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

#iptables -A FORWARD -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "NMAP-XMAS:"
#iptables -A FORWARD -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "SYN/FIN:"
#iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "SYN/RST:"


#Drop RST/ACKs to limit OS detection through pinging
iptables -A FORWARD -p tcp --tcp-flags RST RST,ACK -j DROP
#iptables -A FORWARD -p tcp --tcp-flags RST RST,ACK -m limit --limit 5/minute -j LOG --log-level notice --log-prefix "RST/ACK:"

# INPUT Rules 설정
$iptables -Z INPUT
$iptables -P INPUT ACCEPT

# local 과 자기자신의 IP 는 허용.
$iptables -A INPUT -i lo -j ACCEPT
$iptables -A INPUT -s 도메인 -j ACCEPT

#  알 수 없는 패킷 즉,  NETWORK 상태가 INVALID 인 패킷들을 막아 버린다.
#  정상적인 접근에서는 나올 수 없는 상태.
$iptables -A INPUT -m state --state INVALID -j DROP

# ssh service
# ssh 접속 지역 지정.
$iptables -A INPUT -s 아이피.0.0/16 -p tcp --dport 22 -j ACCEPT
$iptables -A INPUT -s 아이피.0/24 -p tcp --dport 22 -j ACCEPT

# etc service
# 25(메일), 80(웹)은 모든 곳에서 ACCEPT 입니다. 반드시...
$iptables -A INPUT -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

# AUTH 는 서비스를 하지 않더라도 열어야 합니다. 클라이언트에서 요청합니다.
$iptables -A INPUT -p tcp --dport 113 -m state --state NEW,ESTABLISHED -j ACCEPT

# mysql
# 기본적으로 mysql 은 local에서만 접속하면 됩니다. DB 공유를 할 경우 대역 지정.
$iptables -A INPUT -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

# mysql DB공유 대역설정
$iptables -A INPUT -s 아이피.0/24 -p tcp --dport 3306 -j ACCEPT

# ICMP service
# ping은 별 의미가 없지만...
$iptables -A INPUT -s 아이피.0.0/16 -p icmp --icmp-type echo-request -j ACCEPT

# 서버로 들어오는 SYN packet 을 모두 거절한다.
$iptables -A INPUT -p tcp --syn -j REJECT

# Drop All packet
# 원활한 서비스를 위해 65535 포트까지만 DROP 을 합니다. 물론 다 막아도 상관 없습니다.
$iptables -A INPUT -p tcp --dport 0:65535 -j DROP
$iptables -A INPUT -p udp --dport 0:65535 -j DROP
$iptables -A INPUT -p icmp --icmp-type echo-request -j REJECT

# 각종 서비스들에 대해 최대의 성능을 발휘할 수 있도록 TOS 설정을 한다.
$iptables -t mangle -A OUTPUT -p tcp -s 0/0 --sport 80 -j TOS --set-tos 0x10
$iptables -t mangle -A OUTPUT -p tcp -d 0/0 --dport 22 -j TOS --set-tos 0x10
$iptables -t mangle -A OUTPUT -p tcp -d 0/0 --dport 21 -j TOS --set-tos 0x10
$iptables -t mangle -A OUTPUT -p tcp -d 0/0 --dport 20 -j TOS --set-tos 0x08
$iptables -t mangle -A OUTPUT -p tcp -s 0/0 --sport 23 -j TOS --set-tos 0x10

# 외부 서비스를 위한 설정. / udp service
# dns 상호 쿼리를 위해서...
#$iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT

# TCP service
# ftp-data, 서버자체가 클라이언트가 될 경우...
$iptables -A INPUT -p tcp --dport 20 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
$iptables -A INPUT -i eth0 -p tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT

# ftp service
# ftp 를 이용할 수 있는 대역을 지정하였습니다. 좀더 세밀해 질 수 있겠죠.
#$iptables -A INPUT -s 아이피.0.0.0/8 -p tcp --dport 21 -j ACCEPT
#$iptables -A INPUT -s 아이피.0.0/16-p tcp --dport 21 -j ACCEPT
$iptables -A INPUT -s 아이피.0/24 -p tcp --dport 21 -j ACCEPT

# telnet
# telnet은 현재 서비스 하지 않습니다.
$iptables -A INPUT -s 아이피.0.0/16 -p tcp --dport 23 -j ACCEPT

# pop3s 를 이용하는 관계로 995번을 열고 있습니다.
#$iptables -A INPUT -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT

# ip 대역 예제.
# ip 대역뿐만 아니라 아래와 같이 상태접속을 지정할 수도 있습니다.
$iptables -A INPUT -s 아이피.0.0/16 -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -s 아이피.0.0/16 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -s 아이피.0/24 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -s 아이피.0.0/16 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

# UDP service
# udp 서비스는 하나뿐이죠?
#$iptables -A INPUT -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT

echo -e "\nDone.\n"

exit;

Inline Translator가 로드되지 못했습니다. 다시 시도하시려면 새로고침해주세요.
반응형

'오픈소스SW' 카테고리의 다른 글

http 패킷 보기  (1) 2010.06.13
보안서버 구축에 사용되는 무료인증서 StartSSL  (0) 2010.06.13
CentOS 5.2.x PHP UPDATE  (0) 2010.06.09
Apache 웹방화벽 ModSecurity 사용하기  (1) 2010.06.08
jquery datepicker 사용  (0) 2010.06.05
반응형

서버의 보안점검을 실시한 결과 php 패키지를 업데이트하라고 권고해서
업데이트하기로 결정.

To upgrade to PHP 5.2.x on CentOS/RHEL/Fedora:
http://www.atomicorp.com/wiki/index.php/PHP

yum update를 해보니..업데이트할패키지가 거의 1G정도..

업데이트가 끝나면 php.ini 와 php.conf 파일을 복구해주자.

mv /etc/php.ini.rpmnew /etc/php.ini
mv /etc/httpd/conf.d/php.conf.rpmnew /etc/httpd/conf.d/php.conf

이전에 사용하던 설정들이 있다면 *.rpmsave 에서 다시 확인해서 수정해준다.

웹서비스 재시작
service httpd restart



업데이트 전
[root@ns ~]# cat /etc/redhat-release
CentOS release 5.2 (Final)

업데이트 후
[root@ns ~]# cat /etc/redhat-release
CentOS release 5.5 (Final)
[root@ns ~]# php --version
PHP 5.2.5 (cli) (built: Sep 22 2008 14:55:04)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
    with Zend Extension Manager v1.2.2, Copyright (c) 2003-2007, by Zend Technologies
    with Zend Optimizer v3.3.0, Copyright (c) 1998-2007, by Zend Technologies
[root@ns ~]#


Inline Translator가 로드되지 못했습니다. 다시 시도시려면 새로고침해주세요.
Inline Translator가 로드되지 못했습니다. 다시 시도하시려면 새로고침해주세요.
반응형

'오픈소스SW' 카테고리의 다른 글

보안서버 구축에 사용되는 무료인증서 StartSSL  (0) 2010.06.13
iptable rule  (0) 2010.06.10
Apache 웹방화벽 ModSecurity 사용하기  (1) 2010.06.08
jquery datepicker 사용  (0) 2010.06.05
php 문자열처리 관련 function  (0) 2010.06.05
반응형

MVC 기반의 PHP Framework CakePHP 홈페이지 : http://cakephp.org/

매뉴얼 : http://book.cakephp.org/

한글 매뉴얼 :http://manual.cakephp.co.kr/


CakePHP의 장점

  • 스키마를 만들면 자동으로 HTML 폼(뷰, 수정, 삭제, 업데이트)을 생성 :  [스케폴딩]
  • HTML 폼의 벨리데이션을 할 경우, 폼 이름과 규칙을 선언만 하고 나머지 귀찮은 일들을 알아서 해 준다 : [벨리데이션과 헬퍼]
  • 기존의 많은 URL들을 통합하고 관리할 수 있다 : [라우터]
  • 비즈니스 로직에서 회원과 관련된 부분을 더 이상 신경 쓰지 않아도 된다 : [ACL]
  • 관리자 페이지를 따로 만들 필요가 없고, RSS와 같은, 말하자면 콘텐츠는 같지만 뷰만 다른 부분을 간단히 구현할 수 있다 : [렌더]
  • 소스를 체계적으로 관리할 수 있다 : [콤포넌트와 벤더, 그리고 플러그인]


INSTALL

최신 버전을 다운로드 받아서 cake 라는 폴더에 모두 풀었다.

http://자신의도메인/cake 로 접속해보면 해야할 일들이 표시된다.

(charset 관련 메세지와 simpletest를 이용한 테스트를 구동하기 위해서 php.ini  설정을 변경해야 했다.)

#php.ini File의 변경내용

memory_limit = 64M 

default_charset = "UTF-8"

시키는대로 진행하고 예제를 따라해보면 쉽게 이해가능하다.


참고 URL

Cake PHP API Document
- http://api13.cakephp.org/classes

Cake PHP 소개
-http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&keywords=%C0%D0%C0%BB%B0%C5%B8%AE%3B%C6%AF%C1%FD&page=4&wr_id=32017

Cake PHP Google Groups
- http://groups.google.com/group/cake-php

CakePHP와 Template_
- http://coolengineer.com/409
- http://www.xtac.net/


Demo : http://db.garada.co.cc/cake/


반응형

'개발도 하냐?' 카테고리의 다른 글

정규표현식(regular expressions)  (0) 2010.06.16
HTTP 응답코드  (0) 2010.06.13
editplus setting  (0) 2010.06.06
hidden frame  (0) 2009.12.27
SI프로젝트 산출물  (0) 2009.12.14
반응형
SW개발자에게 웹어플리케이션의 보안부분은 항상 머리가 아픈 부분입니다.
웹어플리케이션의 보안이슈를 웹서버에서 차단가능한 방법이 있으면, SW개발자는 개발에 집중할 수 있겠죠.

오늘 취약점 점검툴을 이용해서 배포하려는 사이트를 분석해보니, 해결해야 하는 취약점의 숫자가 좀 많습니다. ㅡ.ㅡ
서버측에서 접근하는 패킷에 대한 룰셋을 적용하는 방법과,  개발한 소스코드를 보정하는 방법 중, 해당 서버의 전체 어플리케이션에 대해서 웹방화벽을 설치하기로 결정하고 ModSecurity 를 적용하기로 했습니다..

ModSecurity의 설치법에 대해서는 KISA 홈페이지 를 방문해보시면. 한글로 된 가이드가 있습니다.
소스코드 설치를 원하시면 위 링크에서 컴파일에 대한 과정을 설명한 내용을 참고하시기 바랍니다.

저는 최근에는 부득이한 경우를 제외하고는 소스컴파일을 하지 않고, 설치한 패키지에 대한 운영상의 편리함을 생각해서 가능하면 apt, yum, rpm 등의 설치방식을 사용합니다. ModSecurity를 설치할 수 있는 repository를 구글링해서 Yum repository를 찾아냈습니다. (원문 url : http://portugalcode.com/index.php?topic=2850.0;wap2)

How to install mod_security by yum(Redhat-Centos 5)

(1/1)

@Scroll:
1.Download the EPEL repo :

Código
GeSHi (bash):
rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
Created by GeSHI 1.0.7.20

2.Then type the following command :

Código
GeSHi (bash):
yum install mod_security
Created by GeSHI 1.0.7.20

Note : Mod_security require liblua-5.1.so, If you don’t have this , it will throw an error while installing by yum.


Código
GeSHi (bash):
--> Processing Dependency: liblua-5.1.so for package: mod_security
--> Finished Dependency Resolution
mod_security-2.5.9-1.el5.i386 from epel has depsolving problems
--> Missing Dependency: liblua-5.1.so is needed by package mod_security-2.5.9- 1.el5.i386 (epel)
Error: Missing Dependency: liblua-5.1.so is needed by package mod_security-2.5.9 -1.el5.i386 (epel)
Created by GeSHI 1.0.7.20

Solution: You can download the rpm from this website

http://rpm.pbone.net/index.php3/stat/4/idpl/12580541/com/lua-5.1.4-1.i386.rpm.html

If your server complain you have installed already newer version then you can reinstall the installed version by using

Código
GeSHi (bash):
-bash-3.2# rpm -qa | grep lua
lua-5.1.4-1.el5.rf
-bash-3.2# rpm -e lua-5.1.4-1.el5.rf
-bash-3.2# rpm -Uvh lua-5.1.4-1.i386.rpm
Preparing… ########################################### [100%]
1:lua ########################################### [100%]
 
Created by GeSHI 1.0.7.20

Now type

Código
GeSHi (bash):
-bash-3.2# updatedb
 
-bash-3.2# locate liblua-5.1.so
/usr/lib/liblua-5.1.so
 
Created by GeSHI 1.0.7.20

So it shows that your server has the required file for it to install mod_security

Now run

Código
GeSHi (bash):
yum install mod_security
Created by GeSHI 1.0.7.20

It should installed now mod_security configuration files

/etc/httpd/conf.d/mod_security.conf – main configuration file for the mod_security Apache module.
/etc/httpd/modsecurity.d/ – all other configuration files for the mod_security Apache.
/etc/httpd/modsecurity.d/modsecurity_crs_10_config.conf – Configuration contained in this file should be customized for your specific requirements before deployment.
/var/log/httpd/modsec_debug.log – Use debug messages for debugging mod_security rules and other problems.
/var/log/httpd/modsec_audit.log – All requests that trigger a ModSecurity events (as detected) or a serer error are logged (”RelevantOnly”) are logged into this file.
After installing mod_security , Edit modsecurity_crs_10_config.conf file and make sure bellow line is enabled.

SecRuleEngine On

Now restart the httpd server by

Código
GeSHi (bash):
service httpd restart
Created by GeSHI 1.0.7.20

Check the /var/log/httpd/error_log for this lines
[Fri Aug 28 10:48:24 2009] [notice] ModSecurity for Apache/2.5.9 (http://www.mod security.org/) configured.

영문사이트는 아니지만 중요한 정보는 다 들어있으니 그대로 설치하기로 했습니다.

1) mod_security 설치
rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
위 명령으로 epel repository가 잘 설치되었다면

yum install mod_security
를 실행합니다.

두어번 의존패키지 설치를 묻는데 y를 눌러주면 설치는  끝납니다.(너무쉽죠?)


2) 방화벽에서 사용할 룰셋의 생성
설치를 마쳣으면 아파치 환경설정 디렉토리안의 mod_security.conf 파일을 확인합니다..



방화벽에서 적용할 룰셋은 자신이 직접 만들어서 사용가능하지만, 일단은 KISA에서 배포하는 룰셋을 다운로드 받아서 사용하자.
룰셋 다운로드 : http://toolbox.krcert.or.kr/ > ModSecurity 자료실 > 차단샘플 룰 을 찾아서 다운로드.

다운받은 룰셋을 yum 설치시 생성된 디렉토리에 복사하자.
아래의 modsecurity_kisa.conf 파일이 다운로드 받은 룰셋이다.
룰셋의 설정에 대한 자세한설명은 KISA홈페이지를 이용하거나 파일내의 주석을 참고하자.







룰셋파일의 내용중(modsecurity_kisa.conf)
# 웹서버의 헤더 정보 변경
# Apache 설정의 ServerTokens값이 Full로 설정되 있어야 함.
SecServerSignature "Microsoft-IIS/5.0"

# 아규먼트 구분자
SecArgumentSeparator "&"

# 다음의 메소드 이외에는 허용하지 않음.
SecRule REQUEST_METHOD "(PUT|DELETE|TRACE)" "deny, log"

SecRequestBodyAccess Off
SecResponseBodyAccess Off
SecResponseBodyMimeType (null) text/html text/plain
SecResponseBodyLimit 524288

#############################
# 3. PHP 인젝션 취약 공격 방지(공개 게시판 솔루션 대상 공격 포함)
SecRule REQUEST_URI "\.php" "chain, msg:'PHP Injection Attacks'"
# dir|page 가 들어가 있으면서 https가 요청되는 경우가 fckeditor 에서 발생하기 때문에 수정
SecRule REQUEST_URI "(dir|page|)" chain
#SecRule REQUEST_URI "=(http|https|ftp)\:/"
SecRule REQUEST_URI "=(https|ftp)\:/"
SecRule REQUEST_URI "shell_exec\(" "msg:'PHP Injection Attacks'"


참고) 저의 경우 RPM 패키지에서 제공되는 설정을 그대로 사용해서 kisa에서 배포하는 설정을 복사한 후 , 바로 룰셋을 적용하니 웹사이트가 열리지 않았습니다. 로그를 보면서 확인해본 결과
/etc/httpd/modsecurity.d/base_rules/modsecurity_crs_50_outbound.conf 파일의 설정이 문제를 일으켰고.
이 파일을 제거하고 서비스에 적용했을때 이상없는 서비스가 가능했습니다.


3) 설치 후 적용 확인

설치 및 룰셋의 설정이 완료되었으면 제대로 동작하는지 확인합니다.

modsecurity 로그파일에 아래와 같은 로그가 남는경우
ModSecurity: Failed to access DBM file "E:/tmp/resource": The system cannot find the path specified

로그를 확인하니 오류메세지가 보여서 구글링한 결과
기본설치시 제공되는 modsecurity_crs_10.config.conf 의 설정에 아래의 내용을 추가해야 한다는것을 알았습니다.
웹서버가 접근가능한 경로를 하나 생성해서 아래와 같은 내용을 추가해주어야 한다.
vi /etc/httpd/modsecurity.d/modsecurity_crs_10_config.conf

SecUploadDir /var/www/tmp
SecDataDir /var/www/tmp
SecTmpDir /var/www/tmp

웹서버를 재시작하면 이제 방화벽이 작동하게 됩니다.

룰셋이 작동하는 상태를 확인하려면 환경설정파일에서 지정한 로그파일을 확인하면 됩니다.
다운받은 룰셋을 아무수정없이 사용하는경우라면 로그파일은 아파치설치디렉토리/logs/modsec_audit.log 에 남게 되고,
파일의 내용을 확인하면 아래처럼 룰셋이 작동되고 있는 상태가 보여집니다.
















지금까지는 룰셋이 작동되기는 하지만, 차단시키지 않고 있는 상태입니다.
정상적인 작동여부를 확인하고, 자신이 원하는 형태로 룰셋이 적용되는것을 확인한 후, 반드시 환경설정파일에서 pass 부분을 deny 로 변경해야 차단이 시작됩니다.

방화벽을 적용했더니 작동안되는 부분이 있다면 항의가 많겠죠? 실 서버에 적용시에는 당연히 방화벽으로 인한 서비스의 중단이 없도록 정상적인 서비스를 방해하는 룰셋이 있다면 반드시 확인하고 사용해야 합니다.

변경 전
SecDefaultAction "pass,log,auditlog,phase:2,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase"

변경 후
SecDefaultAction "deny,log,phase:2,status:406,t:urlDecodeUni,t:htmlEntityDecode,t:lowercase"

여기까지 하면 방화벽의 설치는 끝났습니다.

4) 기타
로그파일의 비대해지는 것을 방지하기 위해서 로그를 날짜별로 나누어서 보관하는것이 좋겠죠.
KISA에서 제공하는 FAQ를 보니 잘 설명되어있어서 그대로 적용했습니다. 아래 링크에서 상세내용을 확인할 수 있습니다
http://toolbox.krcert.or.kr > ModSecurity FAQ > 로그파일의 사이즈가 너무 큰데 이를 날짜나 시간별로 분할할 수 없나요?






KISA에서 제공하는 룰셋의 주요 점검 항목

PHP 인젝션 취약 공격 방지(공개 게시판 솔루션 대상 공격 포함)
명령어 실행 방지
XSS 공격 방지
SSI 인젝션 관련 공격 차단
악성 프로그램 봇, User-Agent
검색엔진 Recon/Google 이용한 해킹 방지
PHPMyAdmin 관련 공격 취약점 적용
SQL Injection 공격 차단
WebShell 공격 방지
Tomcat 취약점 이용한 공격 방지


기타) 적용 후 추가한 내용
# dir|page 가 들어가 있으면서 https가 요청되는 경우가 fckeditor 에서 발생하기 때문에 수정
SecRule REQUEST_URI "(dir|page|)" chain
#SecRule REQUEST_URI "=(http|https|ftp)\:/"
SecRule REQUEST_URI "=(https|ftp)\:/"
SecRule REQUEST_URI "shell_exec\(" "msg:'PHP Injection Attacks'"

공개SW 웹방화벽 mod_security를 이용해서  여러분의 어플리케이션을 보호해보시는 것이 어떨까요?
반응형

'오픈소스SW' 카테고리의 다른 글

iptable rule  (0) 2010.06.10
CentOS 5.2.x PHP UPDATE  (0) 2010.06.09
jquery datepicker 사용  (0) 2010.06.05
php 문자열처리 관련 function  (0) 2010.06.05
JavaScript Tree Menu  (0) 2010.05.24
반응형
editplus 3.1 version에 맞는 컬러 및 stx파일들 셋팅.
http://850219.com/142 에서 다운로드


공개용 글꼴들을 이용해서 새로 제작한 코딩용 폰트

이 폰트는 영문글꼴 Bitstream Vera Fonts 와
네이버에서 배포하는 나눔고딕코디용 글꼴을 합쳐서 새롭게 만들었다.

폰트제작법은 http://gyuha.tistory.com/245 에서 자세히 설명하고 있다.


제작에 사용한 SW는 쉐어웨어 FontCreator_5.5_Setup.exe

폰트들의  홈페이지 라이센스 정보
 http://dev.naver.com/projects/nanumfont
 http://www.gnome.org/fonts/


  참고

코딩용 폰트를 사용하는 다른방법 : http://westzero.net/47

반응형

'개발도 하냐?' 카테고리의 다른 글

HTTP 응답코드  (0) 2010.06.13
CakePHP Framework  (0) 2010.06.09
hidden frame  (0) 2009.12.27
SI프로젝트 산출물  (0) 2009.12.14
BitTorrent 의 정리  (0) 2009.12.12
반응형


웹페이지에서 날짜와 관련한 입력을 받아야 할때
오픈소스로 각광받는 jquery의 플러그인 datepicker를 자주 사용하는 편이다.
우리에게 맞는 형태로 localization 하기 위해서 몇가지 설정을 조정하면 쉽게 사용가능하므로
사용해보지 않은분이 있다면 오픈소스 jquery ui를 사용해보자.

아직 jquery ui framework에 대해서 잘 모른다면 jquery ui 에 대한 다른 글을 참고해보는것도 좋다.


1) 우선 jquery-ui framework을 다운로드 받아야 사용가능하다.[다운로드]
datepicker만 사용하려면 구성요소중 해당 모듈만 선택한 후 다운로드하자.

2) 다운받은 css를 수정하여 폰트관련 설정을 변경하자(폰트종류, 폰트크기 등)

3) 한국어가 나오도록 조정한다.
- jquery 1.3.2 라면 별도의 한글부분이 담겨있는 i18n 이라는 디렉토리안에 ui.datepicker-ko.js라는 파일을 준비해야 한다.
- jquery 1.4.2 에는 기본으로 포함되어 있으므로 locale 설정만 변경하면 한글로 표시된다.

4) 년도표시가 왼쪽으로 나오도록 변경하자(기본은 년도가 오른쪽에 나오는 외국의 달력방식이다)
showMonthAfterYear:true 라는 옵션을 사용하면 된다.

5) 년도와 월이 셀렉트박스로 변경할수있도록 하는것이 사용자에게 좋으니 변경하자.
changeMonth: true
changeYear: true

6) 달력모양의 작은 아이콘이미지를 이용하여 표시하자.
showOn: 'button'
buttonImage: '/image/calendar.gif'
buttonImageOnly: true

7) 날씨의 표현형식을 yyyy-mm-dd 형태로 표시하도록 변경하자.
dateFormat: 'yy-mm-dd'

8) 모두 적용하고 나면 아래와 같은 형태가 된다.



jquery ui 중 datepicker는 여러가지 형태의 UI를 제공해주고 확장플러그인을 이용하면 다양한 방식의 사용이 가능하다.
jquery daterangepicker
http://www.filamentgroup.com/lab/date_range_picker_using_jquery_ui_16_and_jquery_ui_css_framework/

반응형

'오픈소스SW' 카테고리의 다른 글

CentOS 5.2.x PHP UPDATE  (0) 2010.06.09
Apache 웹방화벽 ModSecurity 사용하기  (1) 2010.06.08
php 문자열처리 관련 function  (0) 2010.06.05
JavaScript Tree Menu  (0) 2010.05.24
jqGrid 3.6.5 PHP CRUD  (2) 2010.05.23
반응형
yyyy년mm월dd일 포멧의 날짜를 yyyymmdd 형식으로 바꾸는 다양한 방법들.

$date = '2010년04월20일'; // 형태는 4년2월2일

이 값에서 숫자 부분인 '20100420'만 뽑는 방법입니다.



먼저 문자열(배열 관련 함수를 많이 사용하지만) 처리 방법입니다.


▶ 문자열 처리 #1

고정 길이기 때문에 substr() 함수를 이용합니다.

────────────────────────────────────────
$date = substr($date,0,4).substr($date,6,2).substr($date,10,2);
────────────────────────────────────────

substr() : http://php.net/manual/kr/function.substr.php

참고로 .은 문자열 결합 연산자입니다.
String Operators : http://php.net/manual/kr/language.operators.string.php



▶ 문자열 처리 #2

str_replace() 함수를 이용해 년, 월, 일 문자를 제거합니다.

────────────────────────────────────────
$date = str_replace('년','',$date); // 201004월20일
$date = str_replace('월','',$date); // 20100420일
$date = str_replace('일','',$date); // 20100420
────────────────────────────────────────

str_replace() : http://php.net/manual/kr/function.str-replace.php

참고로 해석이 필요없는 문자열 값은 '(Single Quote)로 감싸주세요.
문자열 관련 : http://php.net/manual/en/language.types.string.php


▶ 문자열 처리 #3

strtr() 함수를 이용하면 #2 과정을 한 번에 처리할 수 있습니다.

────────────────────────────────────────
$remove['년'] = '';
$remove['월'] = '';
$remove['일'] = '';

// 또는

$remove = array('년'=>'','월'=>'','일'=>'');

// 둘 중 편한 형태로 미리 연관 배열을 할당합니다.

$date = strtr($date,$remove);

// 물론 변수에 담지 않고 바로 이용도 가능합니다.

$date = strtr($date,array('년'=>'','월'=>'','일'=>''));
────────────────────────────────────────

strtr() : http://php.net/manual/en/function.strtr.php
연관 배열 : http://php.net/manual/kr/language.types.array.php


▶ 문자열 처리 #4

explode() 함수를 이용해 년, 월, 일을 잘라줍니다.

────────────────────────────────────────
$a = explode('년',$date); // [0] => 2010 [1] => 04월20일
$b = explode('월',$a[1]); // [0] => 04 [1] => 20일
$c = explode('일',$b[1]); // [0] => 20 [1] =>
$date = $a[0].$b[0].$c[0];
────────────────────────────────────────

reset() 함수로 배열의 첫 번째 값을 쉽게 가져올 수 있습니다.
array_shift() 함수로 배열의 첫 번째 값을 뺄 수 있습니다.

explode() : http://php.net/manual/kr/function.explode.php
reset() : http://php.net/manual/kr/function.reset.php
array_shift() : http://php.net/manual/kr/function.array-shift.php


▶ 문자열 처리 #5

list() 함수를 이용하면 #4 변수 사용이 좀 더 간편해집니다.

────────────────────────────────────────
list($y,$date) = explode('년',$date); // $y=2010, $date=04월20일
list($m,$d) = explode('월',$date); // $m=04, $d=20일
list($d) = explode('일',$d); // $d=20
$date = $y.$m.$d;
────────────────────────────────────────

list() : http://php.net/manual/kr/function.list.php


▶ 문자열 처리 #6

explode()와 함께하는 implode() 함수를 이용해보겠습니다.

────────────────────────────────────────
$date = implode('',explode('년',$date));
$date = implode('',explode('월',$date));
$date = implode('',explode('일',$date));
────────────────────────────────────────

implode() : http://php.net/manual/kr/function.implode.php


▶ 문자열 처리 #7

sscanf() 함수를 이용하면 형식에 맞게 값을 뽑을 수 있습니다.
다 만, 앞에 0이 붙었으면 0을 제거해주기 때문에 조정이 필요합니다.

────────────────────────────────────────
$temp = sscanf($date,'%4d년%2d월%2d일'); // [0] => 2010 [1] => 4 [2] => 20
if ( $temp[1]<10 ) $temp[1] = '0'.$temp[1]; // 4 => 04
if ( $temp[2]<10 ) $temp[2] = '0'.$temp[2];
$date = implode('',$temp); // $date = $temp[0].$temp[1].$temp[2];
────────────────────────────────────────

sscanf() : http://php.net/manual/kr/function.sscanf.php


▶ 문자열 처리 #8

#7의 코드에 그 위에서 언급한 list() 함수를 이용해볼까요?

────────────────────────────────────────
list($y,$m,$d) = sscanf($date,'%4d년%2d월%2d일'); // $y=2010, $m=4, $d=20
if ( $m<10 ) $m = '0'.$m;
if ( $d<10 ) $d = '0'.$d;
$date = $y.$m.$d;
────────────────────────────────────────

참고로 each() 함수를 살펴보세요. list() 함수와 궁합이 좋습니다.
each() : http://php.net/manual/kr/function.each.php


▶ 문자열 처리 #9

sscanf()에서 곧바로 변수 할당도 가능합니다.
이번에는 sprintf() 함수로 형식에 맞는 문자열을 만들어보겠습니다.

────────────────────────────────────────
sscanf($date,'%4d년%2d월%2d일',$y,$m,$d); // $y=2010, $m=4, $d=20
$date = sprintf('%04d%02d%02d',$y,$m,$d);
────────────────────────────────────────

sprintf() : http://php.net/manual/kr/function.sprintf.php


▶ 문자열 처리 #10

strpos() 함수를 이용하면 지정한 문자(열)의 위치를 구할 수 있습니다.

────────────────────────────────────────
$py = strpos($date,'년'); // 4
$pm = strpos($date,'월'); // 8
$pd = strpos($date,'일'); // 12
$date = substr($date,0,$py).substr($date,$py+2,2).substr($date,$pm+2,2);
────────────────────────────────────────

strpos() : http://php.net/manual/kr/function.strpos.php


▶ 문자열 처리 #11

이번에는 고전적인 방법을 이용해보겠습니다.
문자열의 길이만큼 반복하며 1바이트씩 읽어 숫자일 때 붙여주는 것이죠.
먼저 풀어쓴 코드부터 보시죠.

────────────────────────────────────────
$original = $date; // $original에 기존 $date값을 할당
$len = strlen($date); // 문자열 길이 구해주고
$date = ''; // 결과값을 이곳에 담기 위해 빈 문자열로
for ($i=0;$i<$len;$i++) // 길이만큼 반복
{
    if ( is_numeric($original[$i]) ) $date.= $original[$i]; // 숫자인 경우 붙임
}
────────────────────────────────────────

for() : http://php.net/manual/kr/control-structures.for.php
strlen() : http://php.net/manual/kr/function.strlen.php
is_numeric() : http://php.net/manual/kr/function.is-numeric.php
ctype_digit() : http://php.net/manual/kr/function.ctype-digit.php

편 의상 is_numeric() 함수를 이용했습니다.
그리고 위에서 보다시피 '2010년04월20일'은 문자열 값이지만
[] 를 이용해 배열처럼 접근할 수 있습니다.


▶ 문자열 처리 #12

#11보다 더 고전적인 방법입니다. 아스키 값을 이용합니다.

────────────────────────────────────────
$original = $date; // $original에 기존 $date값을 할당
$len = strlen($date); // 문자열 길이 구해주고
$date = ''; // 결과값을 이곳에 담기 위해 빈 문자열로
for ($i=0;$i<$len;$i++) // 길이만큼 반복
{
    $c = $original[$i]; // 1바이트 문자
    $asc = ord($c); // 아스키 코드
    if ( $asc<48 || $asc>57 ) continue; // 숫자 범위 아니면 Skip
    $date.= $c;
}
────────────────────────────────────────

숫자 범위가 아니면 위와 같은 조건이면 됩니다.
숫자 범위로 조건을 바꾼다면? ( $asc>47 && $asc<58 )입니다.

참고로 <= 비교보다 < 비교가 빠릅니다.
그래 서 ( $asc>=48 && $asc<=57 )로 하기보다 위 조건을 권장합니다.
누누이 강조하는 부분이지만 쓰기 나름이니까 편한 대로 쓰면 됩니다.

또는 어차피 숫자 외의 문자열이라봐야 년, 월, 일이니
아 스키 값이 127 이상인 경우를 걸러주면 됩니다.

ord() : http://php.net/manual/kr/function.ord.php
ASCII Table : http://www.asciitable.com/


▶ 문자열 처리 #13

#11, #12의 for()문을 줄인 형태입니다.

────────────────────────────────────────
for($i=0,$o=$date,$date='',$l=strlen($o);$i<$l;$i++)if(is_numeric($o[$i]))$date.=$o[$i];
────────────────────────────────────────


▶ 문자열 처리 #14

#13 을 아예 for()문으로 끝내는 것도 가능합니다.

────────────────────────────────────────
for ($i=0,$l=strlen($o=$date),$date='';$i<$len;$i++,$date.=is_numeric($o[$i-1])?$o[$i-1]:'');
────────────────────────────────────────

빠질 뻔 했는데 값의 할당은 오른쪽부터 왼쪽으로 진행됩니다.
$l=strlen($o=$date)
$o에 $date가 할당되고, $o의 길이가 $l에 할당됩니다.
할당 연산자 : http://php.net/manual/kr/language.opera ··· ment.php
연산자 우선권 : http://php.net/manual/kr/language.opera ··· ence.php


▶ 문자열 처리 #15

"키=값" 형태로 가공해 parse_str() 함수를 이용하는 방법입니다.

────────────────────────────────────────
$date = 'y='.substr($date,0,-2); // y=2010년04월20
$date = str_replace('년','&m=',$date); // y=2010&m=04월20
$date = str_replace('월','&d=',$date); // y=2010&m=04&d=20
parse_str($date);
$date = $y.$m.$d;

────────────────────────────────────────

parse_str() 함수를 보면, extract() 함수가 떠오르죠.

parse_str() : http://php.net/manual/kr/function.parse-str.php
extract() : http://php.net/manual/kr/function.extract.php

두 번째 인자를 주면 그 변수에 값을 받게 됩니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
// 위 3줄 동일
parse_str($date,$t); // 'y'=>'2010', 'm'=>'04', 'd'=>'20'
$date = implode('',$t); // $date = $t['y'].$t['m'].$t['d'];
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥


▶ 문자열 처리 #16

#11 ~ #14의 코드와 비슷합니다.
[]를 이용해 문자열도 배열 형태로 접근이 가능하다고 했죠?
이번에는 문자열을 정말 배열로 만들어 처리해보겠습니다.
그리고 똑같은 코드로 하면 재미없으니 다른 코드를 부르겠습니다.

────────────────────────────────────────
$temp = str_split($date);
$date = '';
foreach ( $temp as $char )
{
    if ( ord($char)<128 ) $date.= $char;
}
────────────────────────────────────────

1바이트로 나눠 배열 끝까지 반복, 아스키 값 비교로 결과값을 구합니다.
foreach()도 참 유용한 제어 구조 중 하나입니다. 배열과 찰떡 호흡!

str_split() : http://php.net/manual/kr/function.str-split.php
foreach() : http://php.net/manual/kr/control-structures.foreach.php


‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
$t=str_split($date);$date='';
foreach($t as $c)if(ord($c)<128)$date.=$c;
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥


▶ 문자열 처리 #17

substr_replace()를 깜빡했군요. str_replace()와 비교해보는 재미를···.

────────────────────────────────────────
$date = substr_replace($date,'',4,2); // 201004월20일
$date = substr_replace($date,'',6,2); // 20100420일
$date = substr_replace($date,'',8,2); // 20100420
────────────────────────────────────────

substr_replace() : http://php.net/manual/en/function.substr-replace.php



정규식으로 처리하는 방법 역시 다양합니다.


■ 정규식 처리 #1

제 일 간단한 방법은 숫자 외의 문자를 제거하는 것입니다.

────────────────────────────────────────
$date = preg_replace('/\D/','',$date);
────────────────────────────────────────

10진 숫자가 아닌 임의의 문자(\D)를 ''로 치환해주는 방법이죠.

정규 표현식 상세 : http://php.net/manual/kr/regexp.reference.php
정규 표현식 : http://php.net/manual/en/reference.pcre ··· ntax.php

임의의 10진 숫자는 \d로 표현합니다. 또는 [0-9]로 표현하죠.
여기에 부정 클래스를 사용하면 반대가 됩니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
$date = preg_replace('/[^0-9]/','',$date);
$date = preg_replace('/[^\d]/','',$date);
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

preg_replace() : http://php.net/manual/kr/function.preg-replace.php

참 고로 ereg_replace(), eregi_replace() 등 POSIX Regex 관련 함수들은
PHP 5.3 버전부터 중지됩니다.
POSIX Regex 관련 함수 : http://php.net/manual/kr/ref.regex.php

그러니 어서 펄 호환 정규식으로 갈아타시길···.
Regular Expressions (Perl-Compatible) : http://php.net/manual/kr/book.pcre.php


■ 정규식 처리 #2

숫자만 뽑아 묶어주는 방법입니다.

────────────────────────────────────────
preg_match_all('/\d/',$date,$matches);
$date = implode('',$matches[0]);
────────────────────────────────────────

위 와 같이 실행했을 때 $matches의 값입니다.
문자열 처리 과정에서 언급한 implode() 함수로 깔끔하게 묶어주면 됩니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
Array
(
    [0] => Array
        (
            [0] => 2
            [1] => 0
            [2] => 1
            [3] => 0
            [4] => 0
            [5] => 4
            [6] => 2
            [7] => 0
        )
)
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

preg_match_all() : http://php.net/manual/kr/function.preg-match-all.php


■ 정규식 처리 #3

preg_split() 함수로 대놓고 년, 월, 일로 잘라줘도 됩니다.

────────────────────────────────────────
list($y,$m,$d) = preg_split('/년|월|일/',$date);
$date = $y.$m.$d;
────────────────────────────────────────

preg_split() : http://php.net/manual/kr/function.preg-split.php

차근차근 읽어본 경우라면 위 두 줄의 코드를 한 줄로 바꿀 수 있겠죠?

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
$date = implode('',preg_split('/년|월|일/',$date));
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥


■ 정규식 처리 #4

#1의 코드와 기본은 같고 메타 문자만 다릅니다.

────────────────────────────────────────
$date = preg_replace('/\W/','',$date);
────────────────────────────────────────

어떠한 문자나 숫자, _가 \w며, \W는 그 반대입니다.
특성이 있지만, 년, 월, 일 정도야···. ^^);;;


■ 정규식 처리 #5

preg_grep()의 활용 예를 위해 하나 더 추가합니다.
str_split() 함수와 마찬가지로 잘라주고, 숫자 부분만 가져다 묶어줍니다.

────────────────────────────────────────
$split = preg_split('//',$date,-1,PREG_SPLIT_NO_EMPTY);
$date = implode('',preg_grep('/\d/',$split));
────────────────────────────────────────

preg_grep() : http://php.net/manual/kr/function.preg-grep.php

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
$date = implode('',preg_grep('/\d/',preg_split('/()/',$date,-1,PREG_SPLIT_NO_EMPTY)));
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥


■ 정규식 처리 #6

#2 에서 preg_match_all()을 사용했죠? 이번에는 preg_match() 사용입니다.

────────────────────────────────────────
preg_match('/(\d+)년(\d+)월(\d+)일/',$date,$match);
$date = implode('',array_slice($match,1));
────────────────────────────────────────

$match의 값은 아래와 같습니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
Array
(
    [0] => 2010년04월20일
    [1] => 2010
    [2] => 04
    [3] => 20
)
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥

여기서 array_slice() 함수를 이용해 두 번째 배열부터 가져와 묶어줍니다.
문자열의 substr() 함수와 사용 방법이 같습니다. 대상만 배열이죠.

preg_match() : http://php.net/manual/kr/function.preg-match.php
array_slice() : http://php.net/manual/kr/function.array-slice.php



■ 정규식 처리 #7

응용 예입니다.

────────────────────────────────────────
preg_match('/(\d+)(\W.)(\d+)(\W.)(\d+)(\W.)/',$date,$matches);
$date = $matches[1].$matches[3].$matches[5];
────────────────────────────────────────

$matches 값은 아래와 같습니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
Array
(
    [0] => 2010년04월20일
    [1] => 2010
    [2] => 년
    [3] => 04
    [4] => 월
    [5] => 20
    [6] => 일
)
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥



▣ 날짜 함수 이용

문자열 처리 응용, strtotime() 함수와 date() 함수가 등장합니다.
년, 월, 일을 제거하면 그것으로 끝이지만 응용 차원에서 추가했습니다.
참. 꼭 -으로 바꿀 필요는 없습니다.

────────────────────────────────────────
$date = str_replace('년','-',$date); // 2010-04월20일
$date = str_replace('월','-',$date); // 2010-04-20일
$date = str_replace('일','',$date); // 2010-04-20
$date = date('Ymd',strtotime($date));
────────────────────────────────────────

strtotime() : http://php.net/manual/en/function.strtotime.php
date() : http://php.net/manual/kr/function.date.php

한 줄로 줄이려면? 문자열 처리 #3에서 언급한 strtr()을 사용하면 됩니다.

‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
echo date('Ymd',strtotime(strtr($date,array('년'=>'/','월'=>'/','일'=> ''))));
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
반응형

'오픈소스SW' 카테고리의 다른 글

Apache 웹방화벽 ModSecurity 사용하기  (1) 2010.06.08
jquery datepicker 사용  (0) 2010.06.05
JavaScript Tree Menu  (0) 2010.05.24
jqGrid 3.6.5 PHP CRUD  (2) 2010.05.23
fckeditor에서 이미지경로를 위한 Tip  (0) 2010.05.13
반응형
자바스크립트만을 사용한 트리메뉴.

반응형

'오픈소스SW' 카테고리의 다른 글

jquery datepicker 사용  (0) 2010.06.05
php 문자열처리 관련 function  (0) 2010.06.05
jqGrid 3.6.5 PHP CRUD  (2) 2010.05.23
fckeditor에서 이미지경로를 위한 Tip  (0) 2010.05.13
PHP 게시판  (0) 2010.05.12

+ Recent posts