"바다에 사는 수많은 물고기 가운데
유독 상어만 부레가 없다. 부레가 없으면
물고기는 가라앉기 때문에 잠시라도 멈추면 죽게 된다.
그래서 상어는 태어나면서부터 쉬지 않고
움직여야만 하고, 그 결과 몇 년 뒤에는
바다 동물 중 가장 힘이 센
강자(强者)가 된다."
- 장쓰안의《평상심》중에서 -
* 완벽하지 않은 조건이
오히려 멈출 수 없는 이유가 되고,
바로 그 멈출 수 없는 이유가 강자로 만듭니다.
부레 없는 상어의 멈출 수 없는 조건이 바다의 왕이
되게 했습니다. 우리도 마찬가지입니다.
멈출 수 없는 조건을 기회로 받아 들인다면
언제인가 반드시 희망의 언덕에 서서
감사하며 살게 될 것입니다.
깊이 바라보는 것은
우리에게 이해하는 법을 가르쳐 준다.
고통의 원인과 직접 부딪혀 해답의 소리에 깊이 귀 기울여
많은 깨달음을 얻는다. 그 깨달음이 바로 고통에서
자유를 향한, 본래의 고향으로 돌아오는 길을
안내해 주는 이해와 통찰이다.
- 브라이언 피어스의《동행》중에서 -
* 이해, 깨달음, 통찰, 사랑, 관심...
모두가 같은 뜻, 하나로 통하는 말입니다.
진정으로 깊이 바라보아야만 가능한 일들이니까요.
깊이 바라보는 사람이 진정한 인생의 동반자입니다.
지나치듯 겉만 보면 어디가 아프고 괴로운지
그 원인과 해답을 바로 볼 수가 없습니다.
깊이 바라보아야만 보입니다.
/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 배열을 통해서 이루어 집니다.
"눈물 속에 잠이 든 때가
한두 번이 아니었다. 그러나 꿈속에서
더할 나위 없이 매력적인 존재들이 나를 위로하고
즐겁게 해주어서, 나는 늘 새로운 기분과
기쁜 마음으로 일어났다." (괴테)
- 스티븐 라버지의《루시드 드림》중에서 -
* 누구에게나 불면의 밤이 있습니다.
남모를 슬픔과 번민의 밤이 깊어도 새벽은 어김없이 찾아옵니다.
새벽 빛을 등에 지고 다가오는 '매력있는 사람'의 그림자!
꿈 같기도 하고, 환영(幻影)같기도 한 그 실루엣에
새로운 기운을 얻어, 어제보다 더 기쁘고
희망찬 하루를 다시 시작합니다.
select tbl.name from ( select id, name from sysobjects where xtype = 'U' ) tbl
select * from sysobjects where xtype = 'U'
select a.name, tbl.name from syscolumns a join sysobjects tbl on a.id = tbl.id
where a.id in( select id from sysobjects where xtype = 'U' )
--커서 선언
DECLARE moneta_replace CURSOR
FOR
select tbl.name, a.name from syscolumns a join sysobjects tbl on a.id = tbl.id
where a.id in( select id from sysobjects where xtype = 'U' )
나는 15살이던 어느 날 에베레스트 등정, 남태평양 횡단, 세계일주,
달 탐험 같은 127개의 목표를 글로 적었습니다.
1980년, 나는 우주 비행사가 되어 달에 감으로써
127개의 목표를 전부 이루었습니다.
- 탐험가 존 고다드
127개의 ‘나의 인생 목표’를 작성한지 40년 만에
존 고다드는 127개의 꿈을 다 이루었습니다.
그가 미래의 주인공인 어린이들에게 말합니다.
"꿈을 이루는 가장 좋은 방법은 목표를 세우고, 그 꿈을 향해 모든 것을 집중하는 거야.
그렇게 하면 단지 희망사항이었던 것이 ‘꿈의 목록’으로 바뀌고,
다시 그것이 ‘해야만 하는 일의 목록’으로 바뀌고,
마침내 ‘이루어 낸 목록’으로 바뀐단다.
꿈을 가지고 있기만 해서는 안돼.
꿈은 머리로 생각하는 것이 아니란다.
얘야. 가슴으로 느끼고 손으로 적어 발로 뛰는 게 꿈이지."