/include/secure.inc.asp
< %
'공격 위험성이 존재하는 문자들을 필터링
'문자열 입력값을 검증
'숫자형은 데이터 타입을 별도로 체크하도록 한다.
Function sqlFilter(search)
Dim strSearch(5), strReplace(5), cnt, data
for each p in bad_file
if instr(FileEndName, p)>0 then
Check_Ext = "error"
Exit Function
end if
next
'허용할 확장자 체크
if avaext <> "" Then
ok_file = split(avaext, ",")
for each p in ok_file
if instr(FileEndName, p)>0 then
Check_Ext = "ok"
Exit Function
End If
next
End If
Check_Ext = "error"
End Function
'다운로드 경로 체크 함수
'$dn_dir - 다운로드 디렉토리 경로(path)
'$fname - 다운로드 파일명
'리턴 - true:파운로드 파일 경로, false: "error"
Function Check_Path(dn_dir, fname)
'디렉토리 구분자를 하나로 통일
dn_dir = Replace(dn_dir, "/", "\")
fname = Replace(fname, "/", "\")
strFile = Server.MapPath(dn_dir) & "\" & fname '서버 절대경로
strFname = Mid(fname,InstrRev(fname,"\")+1) '파일 이름 추출, ..\ 등의 하위 경로 탐색은 제거 됨
Response.Write strFname
strFPath = Server.MapPath(dn_dir) & "\" & strFname '웹서버의 파일 다운로드 절대 경로
If strFPath = strFile Then
Check_Path = strFile '정상일 경우 파일 경로 리턴
Else
Check_Path = "error"
End If
End Function
'IP 체크 함수
Function Check_IP(IP_Addr)
If Request.Servervariables("REMOTE_ADDR") = IP_Addr Then
Check_IP = "TRUE"
Else
Check_IP = "FALSE"
End If
End Function
%>
/head.asp
< %
'페이지에서 에러가 발생하여도 페이지 오류를 외부로 출력하지 않기위해 사용
On Error Resume Next
'On Error GoTo 0도 가능하나 2003에서는 실행되지 않음
if err.number <> 0 then
'Response.Write err.description & " " & err.source & " "
err.clear
End if
%>
/content.asp
< !--#include virtual="/include/connection.inc.asp"--> <% 'DB연결 헤더 %>
< !--#include virtual="/include/secure.inc.asp"--> <% '보안관련라이브러리 %>
< !--#include virtual="/include/config.inc.asp"--> <% '전역변수리스트 %>
< !--#include virtual="/head.asp"--> <% '초기 설정 페이지(에러 메세지 미출력) %>
< %
Dim strSQL
Dim intSeq, strName, strEmail, strSubject, strContent, intCount, dtmReg_Date, intExist
Dim blnTag, strUserIP
Dim atag
'입력값이 숫자형인 경우 IsNumeric 함수를 사용한다.
If IsNumeric(seq) Then
intSeq = Request.QueryString("seq")
Else
Response.Write "허용하지 않는 입력값입니다."
Reponse.End
End If
'문자(열)인 경우 sqlfilter 사용
'intSeq = sqlFilter(Request.QueryString("seq")) 'SQL Injection 필터링
'읽은 횟수 검색
strSQL = "SELECT count(*) FROM board WHERE intSeq='" &amp; intSeq &amp; "'"
objRs.Open strSQL, objDBConn
intExist = objRs(0)
objRs.Close
If intExist <> 1 Then
Response.Write "해당글이 없습니다."
Else
'읽은 횟수 증가
strSQL = "UPDATE board SET intCount=intCount+1 WHERE intSeq='" &amp; intSeq &amp; "'"
objRs.Open strSQL, objDBConn
'게시물 SELECTZ
strSQL = "SELECT strName,strEmail,strSubject,strContent,intCount,strUserIP,blnTag,dtmReg_Date FROM board WHERE intSeq='" &amp; intSeq &amp; "'"
objRs.Open strSQL, objDBConn
'게시물 출력값에 XSS 필터링
'사용자가 입력하는 출력되는 값은 strName, strEmail, strSubject, strContent으로 이 부분은 XSS 공격이 가능한 부분들이다.
'일반적으로 본문만 선택적으로 HTML 태그 사용을 허용하며 나머지 부분들은 사용할 수 없도록 하는것이 바람직하다.
strName = clearXSS(strName, atag)
strEmail = clearXSS(strEmail, atag)
strSubject = clearXSS(strSubject, atag)
strContent = clearXSS(strContent, atag)
'////////////////////////////////////////////////////////////////////
'//다. SQL 구문 삽입 가능성
'////////////////////////////////////////////////////////////////////
SQL Injection은 쿼리문의 잘못 해석함에서 발생하는 문제이다. 이를 해결하기 위해서는 쿼리문을 생성시에 입력된 값에 대한 유효성 검사를 수행하면 된다. ‘, “ 문자를 \’, \”로 변경해 주거나 아예 공백으로 처리하는 방법이다.
삭제해야 할 프로시저
xp_cmdshell
xp_stratmail
xp_sendmail
xp_grantlogin
xp_makewebtask
dn_dir = Request("dir")
fname = Request("fname") '파일 이름
' IE 5.01에서는 이 방식을 사용할때 메모리 관련 문제가 발생할 수 있다.
strUA = Request.ServerVariables("HTTP_USER_AGENT")
If Instr(strUA, "MSIE") Then
intVersion = CDbl(mid(strUA, Instr(strUA, "MSIE")+5, 3))
If intVersion < 5.01 Then
Response.Write "error"
End If
End If
오늘날 동적 웹 페이지를 개발하는 최고의 언어가 PHP라는 것은 누구나 다 아는 사실입니다. 하지만 PHP가 쉘 스크립트 언어로도 사용할 수 있다는 것은 모르는 사람이 많은 것 같습니다. 쉘 스크립트 언어로써의 PHP는 Bash나 Perl만큼 튼튼하지는 않지만 많은 이접이 있습니다.
PHP를 쉘 언어로 사용하기 위해 요구되는 것은 PHP를 아파치 모듈 대신 CGI 바이너리로 설치해야 합니다. 보안 문제가 걸려 있기 때문에 PHP메뉴얼의 참고하기 바랍니다.
일반적인 PHP 웹 페이지와 PHP 쉘 스크립트 사이의 단 한가지 차이점은 PHP스크립트의 제일 첫 번째 줄에 다음과 같이 쉘 호출을 해주어야 하는 점입니다.
#!/usr/local/bin/php -q
-q 옵션은 HTTP헤더를 사용하지 않겠다는 뜻입니다. 또한 PHP태그를 사용해서 스크립트의 시작과 끝을 지정해 주어야 합니다.
이제 모든이가 알고 사랑하는 표준 예를 들어봅시다.
#!/usr/local/bin/php -q
print("Hello, world!\n");
?>
이 코드는 예상하다 시피 화면에 "Hello, world!"를 출력하게 됩니다.
-쉘 스크립트에 매개변수 전달하기(Passing arguments to the shell script)
일반적으로 쉘 스크립트에는 매개변수를 전달 할 수 있어야합니다. 매개변수를 전달하는 것은 다음과 $argv 배열을 통해서 이루어 집니다.
1. Flex는 유료다.
Flex는 3가지 패키지로 구성되어 있는데 무료인 SDK만 가지고도 개발이 가능합니다.(자바 JDK와 동일한
개념입니다.)
SDK를 사용하면 기본적으로 HttpService,WebService를 사용하여 XML데이터를 처리 할 수 있습니다.
그리고 오픈소스를 사용하여 Flex에서 자바 클래스 호출하는 형태의 기능도 사용 할 수가 있습니다.
2. Flex(Flash)는 무겁다.
다른 플랫폼 솔루션과 비교해본적은 없지만 개인적으로 2년여동안 사용해본 결과 Flash9버젼 출시되면서
엄청난 성능향상이 이루어졌습니다. 요즘 가장 각광받고 있는 Ajax와 비교해도 그리 큰 차이는 느끼지 못할
것입니다.
3. 유지보수가 힘들다.
솔루션 개발에 있어 가장 큰 걸림돌이라 볼 수 있는 유지보수 측면을 전혀 무시할순 없겠죠...
Flex는 일반 언어 형태로 개발되기 때문에 다른 언어로 개발했을때와 동일한 유지보수적인 문제가 적용될수
있습니다.
단지 Flex라서 유지보수가 힘들다는 건 아니죠. 하지만 아직까지 Flex를 다룰수있는 개발자가 부족하다는건
Risk가 될 수도 있습니다.
4. 대용량 데이터 처리가 힘들다.
대용량 데이터 처리를 위한 대한들을 사용하면 될 듯 합니다. 가령 페이지네이션 처리를 한다든지...
오히려 서버파트 측면을 더 고려해야 겠지요.
5. Flex 개발 생산성.
Flex는 대부분의 기능들을 컴포넌트 형태로 제공을 하고 사용자가 별도 필요로 하는 기능들은 컴포넌트화해
서 정의가 가능합니다.정의된 컴포넌트들은 swc형태로(자바의 jar와 같은개념) 묶어 배포도 가능하며 swc만
있으면 동일한 기능을 그대로 사용 할 수 있습니다.
재사용이 가능하기 때문에 노하우만 축적된다면 빠른 시간안에 원하는 요구사항을 충족 시킬 수 있습니다.
6. Flex를 어디에 적용 할 것인가?
요즘 Vista문제가 큰화두로 떠오르고 있습니다. OS 또는 브라우져에 종속되어 있기때문이죠. 이런 측면에서
Flex는 정말 매력적인 플랫폼으로 각광받는 이유 중에 하나 입니다. 일단 Flex는 복잡한 화면 구조라든지
Grapic요소들을 표현 한다든지 실시간 데이터를 처리한다든지. 이런 분야에서 효과적으로 사용 할 수 있습니
다. 전체 사이트가 아닌 필요한 사이트 일부분만으로도 구현 될 수 있습니다.
복잡한 화면 구조에 대한 예를 하나 들어보자면 네이버 메인에서 날씨,달력,시계,문자에 대한 정보를 볼 수
있는 Flash화면이 있습니다. 적은 공간을 사용해서 다양한 정보들을 효과적으로 보여 줄 수가 있습니다.