날짜: 1996-07-07 | 글쓴이: 도아 | 5707 번 | 프린트 | 메일로보내기

제 7강 - 기타


디버깅

스크립트를 명령행이나 펄의 내장 디버거로 기동한다면, 키워드의 목록이나 name=value 쌍을 명령행이나 표준 입력으로부터 스크립트로 전달할 수 있다(스크립트에서 환경변수를 읽는 기법에대해서는 걱정할 필요가 없다). 다음과 같은 방법으로 키워드를 전달할 수 있다.

your_script.pl keyword1 keyword2 keyword3

your_script.pl keyword1+keyword2+keyword3

your_script.pl name1=value1 name2=value2

your_script.pl name1=value1&name2=value2

심지어는 표준입력을 통해 개행문자까지 전달할 수 있다.

디버깅시 웹에서 사용한 것과 비슷한 방법으로 특수문자를 삽입하기위해 따옴표와 역슬래쉬를 사용할 수 있다. 따라서 공백이나 다른 문자를 name=value 쌍내에 둘 수 있다.

your_script.pl "name1='I am a long value'" "name2=two\ words"

모든 이름/값 쌍 출력하기

dump()
메소드는 name/value 쌍으로 구성된 모든 질의 문자열을 형식화된 목록으로 만든다. 이 것은 디버깅시에 아주 유용하다.

print $query->dump;

만들어 진것은 다음과 같다.

<UL>
	<LI>name1
	<UL>
		<LI>value1
		<LI>value2
	</UL>
	<LI>name2
	<UL>
		<LI>value1
	</UL>
</UL>

결과를 평문(<PRE> 섹션으로 병합하기에 적합한)으로 출력하기위해

dump()
에 "참" 값을 전달할 수 있다.

환경변수 가져오기

유용한 환경변수의 몇몇은 다음 방법을 통해 가져올 수 있다. 메소드는 다음과 같다.

accept()
원격 브로우저가 받아들일 수 있는 MIME 형식의 목록을 리턴한다. MIME 형식에따라 이 메소드에 하나의 인자를 주면 $query->accept('text/html')에서 처럼 이 타입에대한 브로우저의 등록정보(?)에 상응하는 실수값, 즉, 0.0(원하지 않음)~1.0까지의 실수 값을 리턴한다. 브로우저의 허용 목록에대한 묶음 형식(예: text/*)또한 올바르게 처리된다.

raw_cookie()
넷스케잎 1.1 이상의 버전에서 구현된 HTTP 확장인, HTTP_COOKIE 환경변수를 리턴한다. 쿠키는 특별한 형식을 가지고 있으며 이 메소드는 원래의 형식 그대로를 리턴한다. 쿠키의 설정과 복원은
<A HREF="perl-cgipm6.htm#NETSCAPE_COOKIES">cookie()</A>
를 본다.

매개변수 없이 호출하면
raw_cookie()
는 원래의 쿠기를 리턴한다. 이것을 세미콜론(;)으로 쪼갬으로서 개개의 쿠키를 분리할 수 있다. 쿠키의 이름으로 호출하면 쿠키에서 특수문자를 제거하지 않은 값을 리턴한다. 쿠키의 이름을 얻기위해
<A HREF="perl-cgipm6.htm#NETSCAPE_COOKIES">cookie()</A>
를 사용하거나 CGI::Cookie 모듈의
raw_fetch()
메소드를 사용할 수 있다.

user_agent()
HTTP_USER_AGENT 환경변수를 리턴한다. 이 메소드에 하나의 인자를 주면 이 변수에대해 패턴 매치를 수행한다. 즉, $query->user_agent(netscape);와 같이 수행할 수 있다.

path_info()
스크립트 URL로부터 추가젹인 경로정보를 리턴한다. 예: URL이 /cgi-bin/your_script/additional/stuff라면 $query->path_info()는 additional/stuff를 리턴한다.

주의: Money$oft의 멍청한 IIS는 추가적인 경로정보를 가져오지 못한다. 펄의 DLL 라이브러리(ISAPI)를 사용한다면 IIS는 추가적인 경로정보를 펄 스크립트로서 실행하려할 것이다. 정상적인 확장지 연결을 사용하면 경로정보는 환경변수로서 존재하지만 옳은 정보는 아니다. IIS를 사용할 때에는 CGI 스크립트내에서 추가적인 경로정보를 사용하지 않는 것이 최선이다.

path_translated()
path_info()
와 같지만 실제 시스템 경로로 변환된 경로정보를 리턴한다. 예:

/usr/local/etc/httpd/htdocs/additional/stuff

Money$oft의 멍청한 IIS는 이 것역시 제대로 처리하지 못한다.

remote_host()
원격 호스트의 이름(사용할 수 있다면)이나 IP를 리턴한다.

script_name()
자기 참조 URL의 경우, 부분 URL로서 스크립트의 이름을 리턴한다.

referer()
현재의 스크립트를 호출한 페이지의 URL을 리턴한다.

auth_type ()
스크립트에서 사용된 인증 방법(인증한 경우)을 리턴한다.

server_name ()
서버의 이름을 리턴한다(보통 컴퓨터의 호스트 명)

virtual_host ()
가상 호스트를 사용하는 경우 브로우저를 이용해서 실제 접속한 호스트의 이름을 리턴한다.

server_software ()
서버 소프트웨어와 판번호를 리턴한다.

remote_user ()
사용자 인증에 사용된 사용자 ID(인증된 경우)를 리턴한다.

user_name ()
여러가지 다양한 기법을 사용해서 원격 사용자의 이름을 구하려고 시도한다. 이 것은 단지 Mosaic과 같은 오래된 브로우저에서만 동작한다. 넷스케잎은 사용자의 이름을 전달하지 않는다.

request_method()
스크립트를 접근하는데 사용된 메소드를 리턴한다. 보통 'POST', 'GET' 또는 'HEAD' 중 하나이다.
환경변수 시험

  • Shell CGI를 이용하는 경우 env.cgi

  • ISAPI를 이용하는 경우 env.plx

부정적인 서비스 공격 피하기

CGI.pm이 갖는 잠재적인 문재는 크기에 관계없이 게시하려고 한다는 것이다. 교활한 해커는 수메가 바이트를 CGI 스크립트에 전송하으로서 특정 사이트를 공격할 수 있다. CGI.pm은 게시된 전체 데이타를 읽어 변수로 저장하려 하고 결과적으로 메모리 초과가 발생할 때까지 스크립트는 메모리를 점유하게된다. 스크립트가 메모리를 할당하려고 할 때 시스템은 극적으로 느려진다. 이 것이 서비스 공격의 부정적인 형태이다.

또 다른 가능한 공격은 원격 사용자가 강제로 CGI.pm으로하여금 큰 파일의 업로드하게 만드는 것이다. 스크립트가 업로드된 파일을 수신하지 않으려고 할 지라도 CGI.pm은 업로드 받아 임시 디렉토리에 이 파일을 저장한다. CGI.pm은 업로드가 종료되면 자동적으로 이 파일을 삭제한다. 그러나 그동안에 원격 사용자가 업로드한 데이타가 서버의 디스크 공간을 완전히 채울 수 있으며 이 것이 다른 프로그램에 문제를 일으킬 수 있다.

부적정인 서비스 공격을 피하는 최선의 방법은 CGI 스크립트가 사용할 수 있는 메모리 량, CPU 시간, 디스크 공간을 제한하는 것이다. 몇몇 웹 서버는 이 것을 수행하는 내장된 기능을 가지고 있다. 다른 경우에 CGI 자원 사용의 최고 한도를 설정하기위해 limit ulimit 를 사용할 수 있다.

CGI.pm은 또한 부정적인 서비스 공격에대한 몇몇 내장된 보호책을 가지고 있지만 이들은 사용하기전에 먼저 활성화시겨야 한다. 이들은 CGI 이름공간에서 두개의 전역 변수 형태를 취한다.

$CGI::POST_MAX
음수 이외의 값으로 설정되면 이 변수는 게시할 수 있는 크기에대한 최고한도(바이트)를 설정한다. CGI.pm이 최고한도보다 큰 데이타를 게시하려고 하면 즉시 오류메시지를 출력하며 스크립트를 종료한다. 이 값은 일반적인 게시와 multipart 게시(파일업로드) 모두에 효과가 있으며 이 것은 파일 업로드시 파일의 최대 크기를 제한하는 의미도 갖는다. 이 값을 적당히 큰 값(1 MB와 같은)으로 설정할 수 있다.

$CGI::DISABLE_UPLOADS
"0"이 아닌 값이 설정하며 파일 업로드 기능을 완전히 사용할 수 없게된다. 다른 폼 값은 정상적으로 동작한다.

두 가지 다른 방법으로 이들 변수를 사용할 수 있다.

  1. 스크립트대 스크립트 스크립트의 시작부분(use문 바로 다음)에 이 변수를 설정한다.

    use CGI qw/:standard/;
    use CGI::Carp 'fatalsToBrowser';
    $CGI::POST_MAX=1024 * 100;	# 최대 100KB만 게시
    $CGI::DISABLE_UPLOADS = 1;	# 업로드 하지 못함
    

  2. 모든 스크립트에 대해 CGI.pm을 열고
    $POST_MAX
    와 $DISABLE_UPLOADS에대한 부분을 찾아 이 것을 원하는 값으로 설정한다. 파일 선두의
    initialize_globals()
    라는 서브루틴에서 이들을 찾을 수 있을 것이다.

$POST_MAX
보다 큰 파일을 게시하려는 시도는 치명적인 오류를 발생한다. 앞서의 예에서 보여진 것처럼 브로우저 창에 치명적 오류 메시지를 출력하기 위해 CGI::Carp 모듈을 사용할 수도 있다. 그렇치 않으면 원격 사용자는 일반적인 "500 Internal Server" 오류 메시지만 보게될 것이다.

CGI-LIB.PL과의 호환성

cgi-lib.pl을 사용한 프로그램의 변경을 보다 쉽게하기 위해 ReadParse라는 호환루틴이 제공된다. 프로그램의 변경은 간단하다.

cgi-lib.pl로 작성된 프로그램

require "cgi-lib.pl"; 
&ReadParse; 
print "키값은 $in{key}이다.\n"

CGI.pm으로 포팅된 프로그램

use CGI; 
CGI::ReadParse;
print "키값은 $in{key}이다.\n"

CGI.pm의

ReadParse()
루틴은 %in이라는 변수를 생성하며 질의 변수를 얻기위해 이 변수에 접근하면 된다. cgi-lib.pl의 ReadParse와 같이 자신의 변수를 제공할 수도 있다.
@in
$in
변수와같이 자주 사용되지 않는 ReadParse의 기능은 지원되지 않는다.

일단 ReadParse를 사용하면 다음과 같은 방법으로 질의 개체를 복원할 수 있다.

$q = $in{CGI};
print $q->textfield(-name=>'wow',
	-value=>'진짜로 동작할까?');

이 것으로 cgi-lib.pl을 이용해서 작성한 스크립트를 다시 작성하지 않고 CGI.pm의 특징을 사용할 수 있다.



다음글: 제 8강 - 간단한 예 (7213)1996-07-08
이전글: 제 6강 - 고급기능 (6068)1996-07-06

세상사는 이야기

  • 컴퓨터를 IPTV로 만들 >
  • Warning.or.kr도 우회 >
  • 한국의 100대 부자, 어 >
  • 세상을 바꾼 크롬: 크 >
  • 장난(?)으로 시작한 여 >
  • 탈옥의 필수, QuickDo >
  • 윈도 10, 한영 전환도 >
  • 바보도 할 수 있는 War >
  • 북마크에도 확장 아이 >
  • 크롬은 가라, 비발디가 >


  • RSS 구독 (익명 | 회원 | 강좌 | 포럼)
    (C) 1996 ~ 2014 QAOS.com All rights reserved.