Search Results for '프로그래밍/Asp'
198 posts related to '프로그래밍/Asp'
- 2018/08/03 PHP 유용한 일반 함수 모음 (PHP)
- 2017/02/26 (ASP버전) 페이팔 연동하기
- 2017/02/26 클라우드플레어의 캐시서버 이용시 IP 적용하기 For ASP
- 2012/07/23 InStr 과 Mid 테스트
- 2012/07/23 InStr 함수로 문자열 찾기
- 2012/02/07 이미지캐시 적용되지 않게 하기
- 2012/02/07 ASP에서 BASE64를 지원해주는 라이브러리입니다.
- 2012/02/07 xmlHTTP를 이용해서 웹페이지 가져오기
- 2012/02/07 MSXML2.ServerXMLHTTP 이용해서 웹페이지 읽기
- 2012/02/07 특정 html 허용 및 javascript style 등등 완전 제거 함수 [ASP 정규식] 1
- 2012/02/07 ASP에서 FTP 사용을 가능하게 해주는 컴포넌트
- 2012/01/02 ASP 파일 경로 접근 에러(Path/File access error)
- 2012/01/02 ASP 해킹 방지 보안 방법(injection, cross site scripting...)
- 2011/11/23 ABCUpload Component 4.1 1
- 2011/11/23 컴포넌트를 이용한 블로그 XML RSS 구현
- 2011/11/23 홈페이지 자동링크 함수
- 2011/11/23 HTML가져오기 1
- 2011/11/23 ASP 페이지를 엑셀로 불러올때 숫자를 문자 형태
- 2011/11/23 유용한 ASP소스
- 2011/11/19 ASP - 드라이브 용량 알아내기
- 2011/11/19 ASP - URL Encode 엔코더
- 2011/11/19 ASP 파일 목록(리스트) 얻어오기
- 2011/11/19 aspuploader가 유료라 찾은 Free ASP Upload입니다. 1
- 2011/11/19 [asp] server.urlencode + download
- 2011/11/19 ASP에서 글씨를 그림으로 만들기 [ImageMagick 활용]
- 2011/11/09 asp용 JSON 라이브러리
- 2011/11/09 [ASP] imagemagick 사용법 - 바탕 그림에 글자 쓰기
- 2011/10/23 URL에서 특수문자 오류나는 것 처리하기(escape, unescape)
- 2011/10/21 ASP용 로그 기록 클래스
- 2011/10/21 GeoIP 국가별 IP체크
클라우드플레어를 사용하는데요 실제 접속자 IP를 가져오고 싶을 경우...
그런데 ASP일 경우 자료가 없더라구요..
물론 클플사이트에 가면 아래와 같은 자료가 있기는 있어요
관련 파일은 업로드 해봅니다.
----------------------------------------------------------------
IIS Module (third party)
Installation
Create a directory for the HTTP Module. Example:
C:\> md c:\HttpModules
Copy the files from the Release build of your target platform (x86 for 32-bit or x64 for 64-bit). Example:
C:\> xcopy <zip_dir>\x64\Release\* c:\HttpModules
Copy the Install-XFF-ps1 PowerShell script to the target directory. Example:
C:\> xcopy <zip_dir>\Install-XFF.ps1 c:\HttpModules
Change directory to the install path
C:\> cd c:\HttpModules
Register the Module with the install script (or via IIS admin).
C:\HttpModules\> .\Install-XFF.ps1 -cmd install -module_path c:\HttpModules\F5XFFHttpModule.dll
The module should now be installed in your top level IIS server Module settings as well as each existing application. You can selectively add/remove them from the IIS admin at this point.
Customization for Cloudflare
The F5 XFF Http Module supports a configuration file named F5XFFHttpModule.ini. It looks in the same directory as the configured .DLL for a file of the same name as it self with the .INI extension. An example file is included but renamed to F5XFFHttpModule.ini.bak. Once you get rid of the ".bak" extension and restart the application the settings will take effect. In this configuration file, you should override the default header name of X-Forwarded-For to CF-Connecting-IP.
-----------------------------------------------------------------------------
그래서 요놈을 적용하려고 하다보니...
아랫놈을 찾게 되어서요.. 굳이 위엣 놈을 삽질하지 않아도 되더라구요...
-----------------------------------------------------------------------------
' ######################################################################
' Function name : getUserIP
' Parameter :
' Return : String
' Description :
' ######################################################################
<%
Function getUserIP()
Dim httpXForwardedFor, remoteAddr
Dim result
httpXForwardedFor = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
remoteAddr = Request.ServerVariables("REMOTE_ADDR")
If httpXForwardedFor = "" OR InStr(httpXForwardedFor, "unknown") > 0 Then
result = remoteAddr
ElseIf InStr(httpXForwardedFor, ",") > 0 Then
result = Mid(httpXForwardedFor, 1, InStr(httpXForwardedFor, ",")-1)
ElseIf InStr(httpXForwardedFor, ";") > 0 Then
result = Mid(httpXForwardedFor, 1, InStr(httpXForwardedFor, ";")-1)
Else
result = httpXForwardedFor
End If
getUserIP = Trim(Mid(result, 1, 30))
End Function
%>
---------------------------------------------------------------------------
근데 그냥 ...
Request.ServerVariables("HTTP_X_FORWARDED_FOR")
요넘을 써도 되더군요..
참고 아래 내용 남깁니다.
----------------------------------------------------------
1. Request.ServerVariables("REMOTE_ADDR")
- 기본 환경변수로 주로 사용
- 일반적인 아이피
2. Request.ServerVariables("HTTP_CLIENT_IP")
- 로드밸런싱(L4, L7)을 사용하는 다중웹서버의 경우 사용
- REMOTE_ADDR값은 로드밸런싱서버 아이피
3. Request.ServerVariables("HTTP_X_FORWARDED_FOR")
- Proxy를 통해 웹서버에 접근하는 경우 사용
- REMOTE_ADDR값은 Proxy 아이피
<%
a = "test"
b = Instr(a,"t")
Response.Write b '값은 1 이다.
Response.Write "<br>"
c = Mid(a,1,2)
Response.Write c '출력값 te
%>
InStr 로 문자열을 찾는경우,
없으면 0 을 반환하지만, 첫번째에서 찾은 경우는 1 을 반환한다.
일반적으로 객체들이 배열과 마찬가지로 첫번째 인자의 위치가 0 이지만,
InStr 의 경우, 첫번째에서 찾았다고 0 을 반환하면, 찾지 못한경우와 구별이 안되기 때문에 1부터 시작하는듯 하다.
또한, Mid 용법에서도 첫번째는 0 이 아닌 1 부터 시작이어서,
Mid(a,1,2) 하면, 첫번째 문자인 t 부터 시작하여 두개를 가져온다.
따라서 출력값은 te 가 된다.
str = "search list"
chk = Instr(str,"list")
Response.Write chk
%>
대상 문자열에서 지정한 문자열이 있으면 몇번째에 있는지 숫자를 반환하고, 없으면 0 을 반환한다.
PHP 의 substr 과 같은 역할을 하는 함수.
주의할점은, 대소문자를 구별하므로, 대소문자가 틀릴경우 0 을 반환하며,
대소문자 구별없이 찾으려면 먼저 UCase 또는 LCase 로 변환한후 비교하여야 한다.
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="expires" content="wed, 04 jul 1973 16:00:00 gmt">
(2)
<meta http-equiv='Content-type' content='text/html; charset=utf-8'>
<meta http-equiv="cache-control" content="no-cache, must-revalidate">
<meta http-equiv="pragma" content="no-cache">
2. 이미지에 파라미터값을 넣어준다.
이렇게 하면 이미지값이 자동으로 변동되기 때문에 캐시에서 값을 불러오지 않고 새로 불러올 수가 있다.
- LastCount As Double. Returns the amount of time that the last operation took, in seconds.
Methods:
- Encode (strDatos As String) As String. Encodes data passed in strDatos and returns the result in a String var.
- EncodeArr (arrDatos() As Byte) As String. Encodes data passed in the array Datos and returns the result in a String var.
- EncodeArrArr (arrDatos() As Byte). This method will take data to encode from arrData() and will return the encoded data in the same array. It's the fastest one.
- EncodeFromFile (strPath As String) As String. Encodes the file specified in strPath and returns the result in a String var.
- Decode (strDatos As String) As String. Decodes data passed in strDatos and returns the result in a String var.
- DecodeArr (strDatos As String). Decodes data passed in strDatos and returns the result in an array.
- DecodeArrArr (arrDatos() As Byte). This method will take data to decode in arrDatos() and will return the decoded data in the same array. It's the fastest one.
- DecodeToFile (strDatos As String, strPath as String). Decodes data passed in strDatos and saves the result to the file given in strPath. If another file exists with the same name, it will try to overwrite it.
사용방법
1. 레지스트리 등록 (시작->실행->cmd 하신후 프럼프트에서 regsvr32 c:\base64.dll)
2. IIS재시작
* 인코딩Set objEncode = Server.CreateObject("Base64Lib.Base64")
strEncodeData = objEncode.Encode(strContents)
Set objEncode = Nothing
Response.Write strEncodeData
* 디코딩
Set objDecode = Server.CreateObject("Base64Lib.Base64")
strDecodeData = objDecode.Decode(strContents)
Set objDecode = Nothing
Response.Write strDecodeData
※ 한글지원도 잘 됩니다.
삭제시에는 regsvr32 -u c:\base64.dll 하시면 됩니다.
<%
' ===========================
' Function to GetHTMLBin
' ===========================
Function GetHTMLBin(URLaddress)
Dim Http
Set Http = CreateObject("Microsoft.XMLHTTP")
Http.Open "GET", URLaddress, False
Http.Send
GetHTMLBin = Http.responseBody
Set Http = Nothing
End Function
' ===========================
' Function to BinToText
' ===========================
Function BinToText(varBinData, intDataSizeInBytes) ' as String
Const adFldLong = &H00000080
Const adVarChar = 200
Set objRS = CreateObject("ADODB.Recordset")
objRS.Fields.Append "txt", adVarChar, intDataSizeInBytes, adFldLong
objRS.Open
objRS.AddNew
objRS.Fields("txt").AppendChunk varBinData
BinToText = objRS("txt").Value
objRS.Close
Set objRS = Nothing
End Function
GetURL = "http://www.naver.com/"
HTMLBin = GetHTMLBin(GetURL)
html = BinToText(HTMLBin,32000)
%>
<%=html%>
ResponseText를 이용하여 값을 받아서 출력하면 한글이 깨지게 됩니다. 그래서 바이너리타입으로 값을 전송하여 변환하는 함수를 이용하여 출력하는 방식입니다.
< %
sUrl = "http://www.youngsam.kr/"
set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
oHttp.Open "GET", sUrl, False
oHttp.Send ""
Response.Write oHttp.ResponseText
Set oHttp = Nothing
%>
GET 메쏘드로 갖고온 HTML을 화면에 출력하는 루틴이다.
게시판등에 글을 쓰거나 할 때는 POST 메쏘드를 사용하는데 이 방법도 가능한다.
<%
sUrl = "http://youngsam.kr/form.asp"
set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
oHttp.Open "POST", sUrl, False
oHttp.Send "subject=test&contents=message+body"
Response.Write oHttp.ResponseText
Set oHttp = Nothing
%>
오류 처리는 Send 메쏘드를 호출하기 전에 On Error Resume Next를 적어주고 오류발생여부를 체크하면 된다.
<%
sUrl = "http://youngsam.kr/form.asp"
set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
On Error Resume Next
oHttp.Send "subject=test&contents=message+body"
If Err Then
Response.Write "Error:" & oHttp.ParseError.URL & "<br>" & oHttp.ParseError.Reason
Else
Response.Write oHttp.ResponseText
End If
Set oHttp = Nothing
%>
사용법
content = StripHTML(content)
Function StripHTML(oSource)
dim Result_Text
Result_text = ReplaceText(oSource," ( )+"," ")
Result_text = Replace(Result_text,"=" & vbcrlf,"")
Result_text = Replace(Result_text,";" & vblrcf,"")
' Remove the header (prepare first by clearing attributes)
' head 태그 안의 모든 내용을 지운다
Result_text = ReplaceText(Result_text,"<( )*head([^>])*>","<head>")
Result_text = ReplaceText(Result_text,"(<( )*(/)( )*head( )*>)","</head>")
Result_text = ReplaceText(Result_text,"(<head>)[\s\S]*(</head>)","")
' remove all scripts (prepare first by clearing attributes)
' script 태그 안의 모든 내용을 지운다
Result_text = ReplaceText(Result_text,"<( )*script([^>])*?>","<script>")
Result_text = ReplaceText(Result_text,"(<( )*(/)( )*?script()*>)","</script>")
Result_text = ReplaceText(Result_text,"(<script>)([^(<script>\.</script>)])*?(</script>)","")
Result_text = ReplaceText(Result_text,"(<script>)[\s\S]*?(</script>)","")
' remove all styles (prepare first by clearing attributes)
' style 태그 안의 모든 내용을 지운다
Result_text = ReplaceText(Result_text,"<( )*style([^>])*?>","<style>")
Result_text = ReplaceText(Result_text,"(<( )*(/)( )*?style( )*>)","</style>")
Result_text = ReplaceText(Result_text,"(<style>)[\s\S]*?(</style>)","")
' remove all object (prepare first by clearing attributes)
' object 태그 안의 모든 내용을 지운다
Result_text = ReplaceText(Result_text,"<( )*object([^>])*?>","<object>")
Result_text = ReplaceText(Result_text,"(<( )*(/)( )*?object( )*>)","</object>")
Result_text = ReplaceText(Result_text,"(<object>)[\s\S]*?(</object>)","")
' Remove the link (prepare first by clearing attributes)
' link 태그 안의 모든 내용을 지운다
Result_text = ReplaceText(Result_text,"<( )*link([^>])*>","<link>")
Result_text = ReplaceText(Result_text,"(<( )*(/)( )*link( )*>)","</link>")
Result_text = ReplaceText(Result_text,"(<link>)[\s\S]*(</link>)","")
' 자바스크립트 함수 치환
Result_text = ReplaceText(Result_text,"onclick=","xonclick=")
Result_text = ReplaceText(Result_text,"onmouseover=","xonmouseover=")
Result_text = ReplaceText(Result_text,"onmouseout=","xonmouseout=")
Result_text = ReplaceText(Result_text,"onchange=","xonchange=")
Result_text = ReplaceText(Result_text,"href=""javascript","href=""xjavascript")
' span 및 div 태그의 속성을 제거
Result_text = ReplaceText(Result_text,"<( )*span([^>])*?>","<span>")
Result_text = ReplaceText(Result_text,"(<( )*(/)( )*?span( )*>)","</span>")
Result_text = ReplaceText(Result_text,"<( )*div([^>])*?>","<div>")
Result_text = ReplaceText(Result_text,"(<( )*(/)( )*?div( )*>)","</div>")
' input 태그를 지운다
Result_text = ReplaceText(Result_text,"<( )*input([^>])*?>","")
' Remove remaining tags like <a>, links, images, comments etc - anything thats enclosed inside < >
' 허용태그 이외의 태그 제거
Result_text = ReplaceText(Result_text,"<[^(image|a|div|span|table|tr|td|li|p)]*?>","")
' Thats it.
StripHTML = Result_Text
End Function
Function ReplaceText(str1, patrn, replStr)
Dim regEx
Set regEx = New RegExp
with regEx
.Pattern = patrn
.IgnoreCase = True
.Global = True
end with
ReplaceText = regEx.Replace(str1, replStr)
End Function
ASPFTP 라는 이름이며, 압축파일에는 설치법과 예제 , 그리고 dll 파일이 포함되어 있습니다.
컴포넌트는 첨부되어 있는 파일을 사용하면 됩니다.
DLL등록하는 방법은
regsvr32 경로\aspftp.dll
라고 하면 되고요, 경로는 DLL 파일의 경로 입니다
압축을 풀면 나오는 파일의 aps파일의 소스를 참고 하시면 쉽게 사용
가능 합니다.
그래도 잠깐 살펴 본다면..
‘대충 변수를 설정하고요
Dim objFTP
Dim ftpErrMsg
ftpErrMsg = ""
'객체를 만들어 줍니다
Set objFTP = Server.CreateObject("NIBLACK.ASPFTP")
'인자1 서버이름
'인자2 아이디
'인자3 패스
'인자4 소스파일
'인자5 타겟파일
'인자6 전송형태
'인자7 overWrite
If objFTP.bQPutFile("주소","아뒤","패스워드","경로", "대상",TRANSFER_TYPE_ASCII) Then
ftpErrMsg = ""
Else
ftpErrMsg = "objFTP.sError" '실패시 실패이유가 변수에 저장 됩니다
End If
'이제 객체를 닫아 주고요
Set objFTP = Nothing
if ftpErrMsg = "" then
call 성공시 실행할 함수
else
response.Write "전송실패 : "&ftpErrMsg
end if
머 대충 이렇게 사용하면 됩니다
제품 : DEXTUpload Pro 분류 : 컴포넌트 일반
[설명]
2.4x 버전과 Professional
3.0에서 DefaultPath프로퍼티 설정시 차이점이 있습니다.
[DEXTUpload 2.4x]
DefaultPath로 지정된
곳은 EveryOne 읽기, 쓰기, 수정 권한이 있어야 합니다. 그러나, 객체 생성후 DefaultPath를 지정 해주지 않으시면 C:\ 를
참조 하게 됩니다. C:\에 EveryOne 권한을 주시거나 또는 DefaultPath를 지정 해주시고 그곳에 권한을 주시면 됩니다.
[DEXTUpload Professional 3.0]
DefaultPath를 지정하지 않으면, 에러를 발생시키고 파일을 업로드
시키지 않습니다.
따라서, 명시적으로 DefaultPath를 지정해야 합니다.
DEXTUpload Professional에서는
DefaultPath를 지정한 폴더가 존재하지 않을시 AutoMakeFolder를 True로 지정함으로써, 자동 폴더 생성을 지원 합니다.
본 문서의 정보는 다음의 제품에 적용됩니다.
DEXTUpload Professional 3.0
DEXTUpload 2.4x
DEXTUpload 2.0x
'////////////////////////////////////////////////////////////////////
'//가. 명령어 삽입(Command Injection) 가능성
'////////////////////////////////////////////////////////////////////
Dim title, str
title = "What's Up!!! <what happen> Oh my god!!!! & goodness"
str = ""
//변환을 수행할 함수
Sub ReplaceStr(content, byref str)
content = replace(content, "'", """)
content = replace(content, "&", "&")
content = replace(content, "<", "<")
content = replace(content, ">", ">")
str = content
End Sub
ReplaceStr title, str
response.write str
%>
'////////////////////////////////////////////////////////////////////
'//나. 크로스 사이트 스크립팅 (XSS) 가능성
'////////////////////////////////////////////////////////////////////
/include/config.inc.asp
<%
atag = "p,br" 'XSS 허용할 태그 리스트
UploadedPath = "/Uploaded_Files/" '업로드 기본 경로
fileext = "jpg,gif,png,pcx" '허용할 확장자 리스트
%>
/include/secure.inc.asp
<%
'공격 위험성이 존재하는 문자들을 필터링
'문자열 입력값을 검증
'숫자형은 데이터 타입을 별도로 체크하도록 한다.
Function sqlFilter(search)
Dim strSearch(5), strReplace(5), cnt, data
'SQL Injection 특수문자 필터링
'필수 필터링 문자 리스트
strSearch(0)="'"
strSearch(1)=""""
strSearch(2)="\"
strSearch(3)=null
strSearch(4)="#"
strSearch(5)="--"
strSearch(6)=";"
'변환될 필터 문자
strReplace(0)="''"
strReplace(1)=""""""
strReplace(2)="\\"
strReplace(3)="\"&null
strReplace(4)="\#"
strReplace(5)="\--"
strReplace(6)="\;"
data = search
For cnt = 0 to 6 '필터링 인덱스를 배열 크기와 맞춰준다.
data = replace(data, LCASE(strSearch(cnt)), strReplace(cnt))
Next
sqlFilter = data
End Function
'XSS 출력 필터 함수
'XSS 필터 함수
'$str - 필터링할 출력값
'$avatag - 허용할 태그 리스트 예) $avatag = "p,br"
Function clearXSS(strString, avatag)
'XSS 필터링
strString = replace(strString, "<", "<")
strString = replace(strString, "\0", "")
'허용할 태그 변환
avatag = replace(avatag, " ", "") '공백 제거
If (avatag <> "") Then
taglist = split(avatag, ",")
for each p in taglist
strString = replace(strString, "<"&p&" ", "<"&p&" ", 1, -1, 1)
strString = replace(strString, "<"&p&">", "<"&p&">", 1, -1, 1)
strString = replace(strString, "</"&p&" ", "</"&p&" ", 1, -1, 1)
next
End If
clearXSS = strString
End Function
'확장자 검사
'$filename: 파일명
'$avaext: 허용할 확장자 예) $avaext = "jpg,gif,pdf"
'리턴값: true-"ok", false-"error"
Function Check_Ext(filename,avaext)
Dim bad_file, FileStartName, FileEndName
If instr(filename, "\0") Then
Response.Write "허용하지 않는 입력값"
Response.End
End If
'업로드 금지 확장자 체크
bad_file = "asp,html,htm,asa,hta"
filename = Replace(filename, " ", "")
filename = Replace(filename, "%", "")
FileStartName = Left(filename,InstrRev(filename,".")-1)
FileEndName = Mid(filename, InstrRev(filename, ".")+1)
bad_file = split(bad_file, ",")
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 & "<BR>" & err.source & "<BR>"
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='" & intSeq & "'"
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='" & intSeq & "'"
objRs.Open strSQL, objDBConn
'게시물 SELECTZ
strSQL = "SELECT strName,strEmail,strSubject,strContent,intCount,strUserIP,blnTag,dtmReg_Date FROM board WHERE intSeq='" & intSeq & "'"
objRs.Open strSQL, objDBConn
strName = objRs(0)
strEmail = objRs(1)
strSubject = objRs(2)
strContent = objRs(3)
intCount = objRs(4)
strUserIP = objRs(5)
blnTag = objRs(6)
dtmReg_Date = objRs(7)
objRs.Close
Set objRs = Nothing
objDBConn.Close
Set objDBConn = Nothing
'게시물 출력값에 XSS 필터링
'사용자가 입력하는 출력되는 값은 strName, strEmail, strSubject, strContent으로 이 부분은 XSS 공격이 가능한 부분들이다.
'일반적으로 본문만 선택적으로 HTML 태그 사용을 허용하며 나머지 부분들은 사용할 수 없도록 하는것이 바람직하다.
strName = clearXSS(strName, atag)
strEmail = clearXSS(strEmail, atag)
strSubject = clearXSS(strSubject, atag)
strContent = clearXSS(strContent, atag)
'줄넘김 처리
strContent = replace(strContent, vbLf, vbLf & "<br>")
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ks_c_5601-1987">
<title>내용보기</title>
</head>
<body>
<div align=center>
<table border=1>
<tr>
<td>이름</td>
<td><%=strName%></td>
<td>등록일</td>
<td><%=dtmReg_Date%></td>
</tr>
<tr>
<td>이메일</td>
<td><%=strEmail%></td>
<td>조회</td>
<td><%=intCount%></td>
</tr>
<tr>
<td>제목</td>
<td colspan=3><%=strSubject%></td>
</tr>
<tr>
<td>내용</td>
<td colspan=3><%=strContent%></td>
</tr>
<tr>
<td colspan=4>
<a href="list.asp">목록으로</a> <a href="edit.asp?seq=<%=intSeq%>">수정하기</a> <a href="delete.asp?seq=<%=intSeq%>">삭제하기</a>
</td>
</tr>
</table>
</div>
</body>
</html>
<%
End If
%>
'////////////////////////////////////////////////////////////////////
'//다. SQL 구문 삽입 가능성
'////////////////////////////////////////////////////////////////////
SQL Injection은 쿼리문의 잘못 해석함에서 발생하는 문제이다. 이를 해결하기 위해서는 쿼리문을 생성시에 입력된 값에 대한 유효성 검사를 수행하면 된다. ‘, “ 문자를 \’, \”로 변경해 주거나 아예 공백으로 처리하는 방법이다.
삭제해야 할 프로시저
xp_cmdshell
xp_stratmail
xp_sendmail
xp_grantlogin
xp_makewebtask
'////////////////////////////////////////////////////////////////////
'//사. 다운로드 취약성
'////////////////////////////////////////////////////////////////////
<!--#include virtual="/include/connection.inc.asp"--> <% 'DB연결 헤더 %>
<!--#include virtual="/include/secure.inc.asp"--> <% '보안관련라이브러리 %>
<!--#include virtual="/include/config.inc.asp"--> <% '전역변수리스트 %>
<!--#include virtual="/head.asp"--> <% '초기 설정 페이지(에러 메세지 미출력) %>
<%
Dim dn_dir, fname, val_ok
Dim UploadedPath
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
if fname = "" Then
Response.Write "<script language=javascript>"
Response.Write "alert(""파일명을 입력해 주세요"");"
Response.Write "history.back();"
Response.Write "</script>"
End If
dn_dir = UploadedPath & dn_dir
val_ok = Check_Path(dn_dir, fname)
If val_ok <> "error" Then '사용자가 다운 받는 파일과 웹서버의 파일 다운로드 경로가 맞는지 비교
Set objStream = Server.CreateObject("ADODB.Stream") 'Stream 이용
Response.ContentType = "application/unknown" 'ContentType 선언
Response.AddHeader "Content-Disposition","attachment; filename=" & fname
objStream.Open
objStream.Type = 1
objStream.LoadFromFile val_ok
download = objStream.Read
Response.BinaryWrite download
End If
Set objstream = nothing '객체 초기화
%>
사실 RSS 를 구현할때 사실 단순히 텍스트 파일로 뿌려주고 ContentType 만 xml 로 선언해줘도 가능합니다. 그러나 조금은 다르게 해보고 싶다는 저의 호기심도 있고, 확장성과 향후 유지보수에 조금이라도 더 손쉽게 하기위해서 윈도우즈 2000 에 기본제공되어 있는 XML 관련 컴포넌트를 이용하여 구현해보았습니다. 물론 아래 소스는 지금 제 블로그 RSS 의 원형이 되고 있습니다.
한가지 주의 하실점은 XML 선언전에 어떠한 개행(\n) 이나 문자가 들어가서는 안됩니다. PHP 에서의 쿠키과 마찬가지 입니다.
<?xml version="1.0" encoding="EUC-KR" ?>
<%
Response.ContentType = "text/xml"
Set xmlPars =
Server.CreateObject("Msxml2.DOMDocument")
' 여기서 부터 rss 정보를 담는다.
Set rss = xmlPars.CreateElement("rss")
rss.setAttribute "version", "2.0"
rss.setAttribute "xmlns:dc",
"http://purl.org/dc/elements/1.1/"
rss.setAttribute "xmlns:sy",
"http://purl.org/rss/1.0/modules/syndication/"
rss.setAttribute
"xmlns:admin", "http://webns.net/mvcb/"
rss.setAttribute "xmlns:rdf",
"http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlPars.AppendChild(rss)
'<channel> 시작
Set Channel = xmlPars.CreateElement("channel")
rss.AppendChild(Channel)
'<title>정보
Set title = xmlPars.CreateElement("title")
Channel.AppendChild(title)
Channel.childnodes(0).text = "블로그 제목"
'<link>정보
Set channel_link = xmlPars.CreateElement("link")
Channel.AppendChild(channel_link)
Channel.childnodes(1).text = "블로그 주소"
'<description>정보
Set description =
xmlPars.CreateElement("description")
Channel.AppendChild(description)
Channel.childnodes(2).text = "블로그 설명"
'<dc:language>정보
Set language =
xmlPars.CreateElement("dc:language")
Channel.AppendChild(language)
Channel.childnodes(3).text = "ko"
'<image>정보
Set image = xmlPars.CreateElement("image")
Channel.AppendChild(image)
'이미지 정보에 들어갈 것들
set i_title = xmlPars.CreateElement("title")
set
i_url = xmlPars.CreateElement("url")
set i_width =
xmlPars.CreateElement("width")
set i_height =
xmlPars.CreateElement("height")
image.AppendChild(i_title)
image.AppendChild(i_url)
image.AppendChild(i_width)
image.AppendChild(i_height)
image.childnodes(0).text = "이미지 제목"
image.childnodes(1).text = "이미지 경로"
image.childnodes(2).text = "이미지 가로 사이즈"
image.childnodes(3).text = "이미지
세로 사이즈"
' 여기서 부터는 포스트에 대해서 출력
' 우선 데이터를 읽어오자
SQL = "해당되는 포스트에 대한 쿼리문"
set rs =
Server.CreateObject("ADODB.Recordset")
rs.Open
SQL,접근문자열,adOpenForwardOnly,adLockPessimistic,adCmdText
' 여기서 부터 루프를 돌리자.
Do until rs.EOF
'<item> 이라는 노드를 추가
Set item = xmlPars.CreateElement("item")
Channel.AppendChild(item)
' 여기서부터 해당 포스트의 세부 정보를 출력
set title = xmlPars.CreateElement("title") '
set link = xmlPars.CreateElement("link")
set description =
xmlPars.CreateElement("description")
set dcdate =
xmlPars.CreateElement("dc:date")
set dcsubject =
xmlPars.CreateElement("dc:subject")
item.AppendChild(title)
item.AppendChild(link)
item.AppendChild(description)
item.AppendChild(dcdate)
item.AppendChild(dcsubject)
item.childnodes(0).text = rs("제목필드")
item.childnodes(1).text = rs("포스트 고유
url 필드")
item.childnodes(2).text = rs("내용 필드")
item.childnodes(3).text =
rs("날짜")
item.childnodes(4).text = rs("포스트의 분류")
rs.movenext
loop
' 마지막으로 최종적으로 뿌려주자.
Response.Write xmlPars.xml
'마무리 ^^;
rs.close
set rs = nothing
Set xmlPars = nothing
%>
Function RegExpContent(str)
Dim ptrn, repstr
ptrn = "((http|https|ftp|telnet|news):\/\/[a-z0-9-]+\.[][a-zA-Z0-9:&#@=_~%;\?\/
\.\+-]+)"
repstr = "<a href=""$1"" target=""_blank"">$1</a>"
RegExpContent = ReplaceEreg(ptrn, repstr, str)
End Function
Function ReplaceEreg(ptrn, repstr, str)
Dim regEx
Set regEx =
New RegExp
regEx.Pattern = ptrn
regEx.IgnoreCase =
True
regEx.Global = True
ReplaceEreg = regEx.Replace(str,
repstr)
End Function
content = "다음은 asprun 홈페이지 주소이다. http://www.naver.com/ 기억해주세요"
content = RegExpContent(content)
content = "<pre>"& content
&"</pre>"
response.write content
%>
<%
' ===========================
' Function to GetHTMLBin
'
===========================
Function GetHTMLBin(URLaddress)
Dim Http
Set Http = CreateObject("Microsoft.XMLHTTP")
Http.Open "GET", URLaddress,
False
Http.Send
GetHTMLBin = Http.responseBody
Set Http =
Nothing
End Function
' ===========================
' Function to BinToText
'
===========================
Function BinToText(varBinData,
intDataSizeInBytes) ' as String
Const adFldLong = &H00000080
Const adVarChar = 200
Set objRS = CreateObject("ADODB.Recordset")
objRS.Fields.Append "txt",
adVarChar, intDataSizeInBytes,
adFldLong
objRS.Open
objRS.AddNew
objRS.Fields("txt").AppendChunk
varBinData
BinToText = objRS("txt").Value
objRS.Close
Set objRS =
Nothing
End Function
GetURL =
trim(cizleUrl)&"?CHNL_ID="&trim(CHNL_ID)&"&CHNL_PWD="&trim(CHNL_PWD)&"&CHNL_CD="&trim(CHNL_CD)&"&USER_ID="&chk_id
HTMLBin
= GetHTMLBin(GetURL)
html = BinToText(HTMLBin,32000)
Response.write html & "<BR>"
%>
mso-number-format:\@
mso-number-format:"0\.000"
mso-number-format:\#\,\#\#0\.000
mso-number-format:"mm\/dd\/yy"
mso-number-format:"d\\-mmm\\-yyyy"
mso-number-format:Percent
ex)
CSS style sheet:
td.accountnum
{mso-number-format:\@}
<td class="accountnum">01070000<td>
'=================================================================== Dim StrLen, TmpStr, i, Midcnt, Start, Surplus '
################################################################################## '
################################################################################## '
################################################################################## FUNCTION autolink(CONTENT) '
################################################################################## '################################################################################## '################################################################################## If chkCnt < chkLen then End Function '################################################################################## '################################################################################## '################################################################################## Function makeNull(str) '################################################################################## Function stripHTML(strHTML, patrn) objRegExp.IgnoreCase = True 'objRegExp.Pattern = "<.+?>" '' 태그완전히없앰 strOutput = objRegExp.Replace(strHTML, "") stripHTML = strOutput Set objRegExp = Nothing '################################################################################## 별건 아니구요..그냥 가끔 디버깅시에 쓰는
함수에요 Dim errLoop ########폼값 확인할때################### Dim item | |
첨부파일이 없습니다. |
<%
Set fs = Server.CreateObject("Scripting.FileSystemObject")
Set c_drive = fs.GetDrive("c:")
Set g_drive = fs.GetDrive("g:")
Set h_drive = fs.GetDrive("h:")
Dim cmax, gmax, hmax
Dim c, g, h
Dim cper, gper, hper
Dim cfmt, gfmt, hfmt
Dim gbyte
gbyte = 1024*1024*1024
' C, G, H 드라이브 총 용량
cmax = CInt(c_drive.TotalSize /
gbyte)
gmax = CInt(g_drive.TotalSize
/ gbyte)
hmax = CInt(h_drive.TotalSize /
gbyte)
' C, G, H 드라이브 남은 용량
c = CInt(c_drive.FreeSpace / gbyte)
g = CInt(g_drive.FreeSpace / gbyte)
h = CInt(h_drive.FreeSpace / gbyte)
'남은 비율 계산
div100 = cmax / 100
cper = CInt(c / div100)
div100 = gmax / 100
gper = CInt(g / div100)
div100 = hmax / 100
hper = CInt(h / div100)
'NTFS, FAT, FAT32등 드라이브 포멧형식
cfmt = c_drive.FileSystem
gfmt = g_drive.FileSystem
hfmt = h_drive.FileSystem
%>
<html>
<head>
<title> 하드 드라이브 용량 알아내기 </title>
</head>
<body
style="font-size:9pt;">
<h1>하드 드라이브 용량 체크 예제</h1><p>
<b>C: 드라이브의 용량<b> :
<%=cmax%> / <%=c%> GB [남은 비율:<%=cper%>%]
형식:<%=cfmt%><br>
<table border="0" height="50" style="font-size:9pt;"
cellspacing="0">
<tr>
<td
align="center" bgcolor="#FF0000" width="<%=600-(cper*6)%>">사용
용량(<%=cmax%>GB)</td>
<td align="center" bgcolor="#00FF00"
width="<%=cper*6%>">사용 가능 용량(<%=c%>GB)</td>
</tr>
</table>
<p>
<b>G: 드라이브의 용량<b> : <%=gmax%> / <%=g%> GB [남은
비율:<%=gper%>%] 형식:<%=gfmt%><br>
<table border="0" height="50"
style="font-size:9pt;" cellspacing="0">
<tr>
<td align="center" bgcolor="#FF0000"
width="<%=600-(gper*6)%>">사용
용량(<%=gmax%>GB)</td>
<td align="center" bgcolor="#00FF00"
width="<%=gper*6%>">사용 가능 용량(<%=g%>GB)</td>
</tr>
</table>
<p>
<b>H: 드라이브의 용량<b> : <%=hmax%> / <%=h%> GB [남은
비율:<%=hper%>%] 형식:<%=hfmt%><br>
<table border="0" height="50"
style="font-size:9pt;" cellspacing="0">
<tr>
<td align="center" bgcolor="#FF0000"
width="<%=600-(hper*6)%>">사용
용량(<%=cmax%>GB)</td>
<td align="center" bgcolor="#00FF00"
width="<%=hper*6%>">사용 가능 용량(<%=h%>GB)</td>
</tr>
</table>
</body>
</html>
<html>
<head>
<title> URL encode
</title>
</head>
<body>
<h2><font
color='blue'>장인수</font></h2><br>
<%=Server.HTMLEncode("<h2><font
color='blue'>장인수</font></h2>")%><p>
<%=Server.HTMLEncode("<%=Server.ScriptTimeout%\>")%><p>
<a
href="ok.asp?width=<%=Server.URLEncode("50%오십")%>">50%</a><p>
<a href="ok.asp?width=50%오십">50%</a>
</body>
</html>
<%
Set fs =
Server.CreateObject("Scripting.FileSystemObject")
Set folderObj =
fs.GetFolder(Server.MapPath("."))
Set files = folderObj.Files
%>
<html>
<head>
<title> 파일 리스트 얻기 예제
</title>
</head>
<body>
<h2><%=Server.MapPath(".")%>디렉토리 목록</h2>
<table
border="1" width="900" style="font-size:9pt;" cellpadding="2">
<tr>
<th>이름</th>
<th>크기</th>
<th>형식</th>
<th>생성 시각</th>
<th>마지막 엑세스 시간</th>
<th>마지막 수정 시간</th>
</tr>
<%
For Each file in files
%>
<tr>
<td><a
href="<%=file.name%>"><%=file.name%></a></td>
<td><%=file.size%> byte</td>
<td><%=file.type%></td>
<td><%=file.DateCreated%></td>
<td><%=file.DateLastAccessed%></td>
<td><%=file.DateLastModified%></td>
</tr>
<%
Next
%>
</table>
</body>
</html>
무료인 줄 알았던 aspuploader가 굉장히 비싼 놈이란 걸 알고 나서 찾아 나섰더니
비슷하지만(순수 asp code로 만든 upload) 기능은 upload기능만 있는 무료 프로그램이 있네요.
upload기능만 있으면 되지 다른 거야 뭐...
어차피 다른 것들로 할 때도 구현해 줘야 했던 거니까 (용량 제한이나, 확장자 제한 같은 것들)
단점이라고까지 할 건 아닌 듯.
딱 upload기능만 있기 때문에 뭔가 더 설명할 필요를 못 느끼겠네요.
아래 주소로 가면 받을 수 있습니다.
ImageMagick는 방대한 옵션을 가진 사용하기 까다로운 도구이다.
그 중에서도 한글 표현을 위해서는 좀 더 까다로운 과정을 거쳐야 한다.
1. 일단 ImageMagick을 설치하자.
http://www.imagemagick.org/script/binary-releases.php#windows
내려 받아서 서버에 설치하면 된다.
물론 ASP니까 VBScript!용 OLE 어쩌구를 선택하고 설치한다.
2. 한글을 표현하려면 두 가지에 주의해야 한다.
-font와 -encoding (-encoding은 중요하지 않다. 변경)
예제)
%@Language="VBScript!" CODEPAGE="65001"%
<%option explicit%>
<%
response.charset="utf-8"
session.codepage="65001"
response.codepage="65001"
Response.ContentType="text/html;charset=UTF-8"
Dim objImg
Set objImg = Server.CreateObject("ImageMagickObject.MagickImage.1")
objImg.Convert "-background=lightblue","-fill=blue","-font=Gulim-&-GulimChe-&-Dotum-&-DotumChe","-encoding=Unicode","-pointsize=36","-size=320x","caption:한글 Test입니다.",server.mappath("test.jpg")
Set objImg = Nothing
%>
<img src=test.jpg>
흔히 gulim.ttf 정도를 쓰면 폰트 파일이 지정이 되는데 2008부터는 폰트 파일 이름이 달라서 고생 좀 했다.
서버 시스템의 폰트 이름을 확인하려면 아래 명령어를 실행하면 된다.
설치할 때 Path를 잡아 주지 않았다면 설치된 폴더에서 실행하자.
convert -list font | more
처음에는 자체 포스트스크립트 폰트(한글 미지원)가 나오고, 이후 시스템에 설치되어 있는 폰트들이 나온다.
-family로 지정해서 사용하는 방법은 실패했다.
-font 방법이 성공해서 더 이상 실험해 보지 않는다.
-encoding이 unicode일 때 이미지 생성할 때 1분 12초가 걸렸고, wansung일 때 1분 8초가 걸렸다.
이 정도는 유의미한 차이가 없다고 볼 수 있고, 둘 다 느리기는 마찬가지다.
참고로, 예제의 짧은 문장이 아니라 200자가 넘는 상당히 긴 문장으로 실험을 했다.
Malgun-Gothic으로 -font를 변경하니 1초만에 결과물이 나온다.
예제의 Gulim-&-GulimChe-&-Dotum-&-DotumChe를 Malgun-Gothic으로 바꿔서 사용하시길.
2008에서 실험한 결과임을 상기하고 2003 이하에서는 각자 실험해서 사용하시길.
jQuery.ajax 로 JSON 사용시 euc-kr등에서 유니코드 문자 안깨지게 처리하는게 귀찮아서 만들었습니다
대충 아래처럼 씁니다
<!--#include file="json_disp.asp"-->
<%
Function AjaxTest1(result)
result.Add "ip", Request.ServerVariables("REMOTE_ADDR")
AjaxTest1 = True
End Function
Set json = new JsonDispatcher
Call json.AcceptParamValue("AjaxTest1", "mode", "test1")
%>
<script type="text/javascript">
$(function(){
$.post('test.asp',{mode:'test1'},function(result){
alert(result.ip);
},'json');
});
</script>
각각의 글 내용들을 그림으로 만든 후 바탕 그림과 합성을 하는 방법을 사용한다. (공식 사이트에서도 같은 방법을 쓴다.)
Dim objImg
Set objImg = Server.CreateObject("ImageMagickObject.MagickImage.1")
'차종
objImg.Convert "-background=white","-fill=black","-font=Malgun-Gothic","-pointsize=28","-size=800x","caption:차종",server.mappath("차종경로")
'차량번호
objImg.Convert "-background=white","-fill=black","-font=Malgun-Gothic","-pointsize=28","-size=800x","caption:차량번호",server.mappath("차량번호경로")
'확인서 내용
objImg.Convert "-background=white","-fill=black","-font=Malgun-Gothic","-pointsize=28","-size=900x","caption:확인서 내용, 엔터는 vbcrlf를 쓰거나 \n를 쓸 수 있다. 사용법은 각각 asp와 자바스크립트에 준한다.",server.mappath("확인서 내용경로")
'발급일
objImg.Convert "-background=white","-fill=black","-font=Malgun-Gothic","-pointsize=28","-size=300x","-gravity=East","caption:발급일",server.mappath("발급일경로")
'발급자
objImg.Convert "-background=white","-fill=black","-font=Malgun-Gothic","-pointsize=28","-size=800x","-gravity=East","caption:발급자",server.mappath("발급자경로")
'차종 합성
objImg.composite "-geometry=+270+295",server.mappath("차종경로"),server.mappath("원본경로"),server.mappath("확인서경로")
'차량번호 합성
objImg.composite "-geometry=+270+330",server.mappath("차량번호경로"),server.mappath("확인서경로"),server.mappath("확인서경로")
'확인서 내용 합성
objImg.composite "-geometry=+90+520",server.mappath("확인서 내용경로"),server.mappath("확인서경로"),server.mappath("확인서경로")
'발급일 합성
objImg.composite "-geometry=+700+1100",server.mappath("발급일경로"),server.mappath("확인서경로"),server.mappath("확인서경로")
'발급자 합성
objImg.composite "-geometry=+130+1270",server.mappath("발급자경로"),server.mappath("확인서경로"),server.mappath("확인서경로")
Set objImg = Nothing
1. 엔터는 vbcrlf를 쓰거나 \n를 쓸 수 있다. 사용법은 각각 asp와 자바스크립트에 준한다.
2. gravity는 정렬을 나타낸다. 8방위(NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast)를 사용한다.
3. geometry는 왼쪽 제일 위를 0,0으로 하는 좌표다.
<script language=javascript>
function goPage(cc_val) {
var param = "";
param += "?aa=11";
param += "&bb=22";
param += "&cc=" + escape(cc_val);
location = "test.asp" + param;
}
< /script>
2. 자바스크립트를 서버단 스크립트 언어로 이용
<script language=javascript runat=server>
function asp_escape(val) {
return escape(val)
}
< /script>
< a href="test.asp?aa=11&bb=22&cc=<%=asp_escape(cc_val)%>">링크다</a>
많은 개발자들이 개발을 하면서 중간 중간 소스에 Response.Write 변수 를 추가 합니다.
이유는 디버깅 용이죠! ^^
하지만, 개발 완료 후 삭제도 해야 하고 혹여나 깜빡하고서 누락하는 경우가 있는데요.
누락한 것 중 지저분 해지기만 하고 문제가 되진 않지만 어떤 사람들은 dB 커넥션 문자열을 찍어서
노출이 되는 경우도 있기도 합니다. ㅎㅎㅎ
공개 소스 중에는 Log4J라는 모듈이 있습니다만, 이건 JSP, Ruby, .Net 용으로만 있고 ASP용은 없지요.
그래서 아쉬운 대로 만들어 봤습니다.
제가 생각했을 때 이 클래스를 사용하므로서 얻을 수 있는 이득을 나열해 보죠.
1. 운영 중에도 에러나 기타 정보를 기록하여 디버깅 및 유지보수에 용의합니다.
2. 실수로 중요 정보가 외부에 노출되는 것을 방지합니다. (예: Response.Write에 의해)
3. 확장 함수를 이용하여 받아들인 파라미터 등을 기록하는 것이 가능합니다.
4. 로그 레벨을 이용 하여 기록 기준을 정의 할 수 있으므로 성능이 나빠지는 것에 대응 할 수 있습니다.
5. 파일에 기록이 되므로 언제든 역 추적이 가능합니다. ( 1번과 비슷 한 내용이네요 ^^ )
다음은 사용 예입니다.
<!--#include virtual="ClsLogger.asp"//-->
<%On Error Resume Next%>
<%
'// Logger
Dim oLog : Set oLog = New ClsLogger
'// Request Log
TraceRequestParameter oLog
'// FATAL : 치명적 에러
oLog.Fetal "치명적 에러!!! 관리자 빨리 보삼. : " & Err.Description
'// ERROR : 수행 가능한 정도의 에러
oLog.Error "또 에러냐!!! : " & Err.Description
'// WARN : 문제를 일으킬 가능성의 정보
oLog.Warn "이건 귀찮아서 처릴 안했단 말이오!!! : "
'// INFO : 정보를 나타낼 때 사용
oLog.Info "게시판 목록 시작"
'// DEBUG : 상세 정보를 나타낼 때 사용
oLog.Debug "지금은 개발 중..."
If ( Err.Number = 0 ) Then
oLog.Debug "완료"
Else
oLog.Error Err.Description
End If
'------------------------------------------------------------------------------------
'// Request 객체의 파라미터 값을 로그에 기록한다.
'// 이 함수는 ClsLogger에 포함 시킬지 말지 고민중 ... ㅠㅠ
'------------------------------------------------------------------------------------
Sub TraceRequestParameter(ByRef pLog)
On Error Resume Next
Dim pContentType : pContentType = LTrim(Request.ServerVariables("CONTENT_TYPE"))
If ( InStr(pContentType, "multipart/form-data") > 0 ) Then
Exit Sub
End If
If ( Not IsObject(pLog) ) Then
Exit Sub
End If
Dim z
Dim pKeyName
pLog.Debug "============= FORM PARAMETER ============="
For z = 1 To Request.Form.Count
pKeyName = Request.Form.Key(z)
pLog.Debug "Dim " & pKeyName & " : " & pKeyName & " = RequestForm(""" &
pKeyName & """)"
Next
For z = 1 To Request.Form.Count
pLog.Debug Request.Form.Key(z) & " : " & Request.Form(z)
Next
pLog.Debug "========== QUERYSTRING PARAMETER ========="
For z = 1 To Request.QueryString.Count
pKeyName = Request.QueryString.Key(z)
pLog.Debug "Dim " & pKeyName & " : " & pKeyName & " = RequestQuery(""" &
pKeyName & """)"
Next
For z = 1 To Request.QueryString.Count
pLog.Debug Request.QueryString.Key(z) & " : " & Request.QueryString(z)
Next
pLog.Debug "=========================================="
Err.Clear
On Error GoTo 0
End Sub
%>
저의 경우 주로 .Error와 .Debug를 사용합니다.
일단 속는 셈 치고 한번 사용해보셔요. ^^
많은 분들이 자기가 원하던 거라고 하시더군요. 다행 다행.
아 그리고 로그뷰어는 "mtail" 이라는 프로그램을 이용합니다. 네이년에서 mtail로 검색을 하시면 쉽게 구 할 수 있어요.
간단하게 소개하면
기록되는 로그를 실시간으로 모니터링 할 수 있고,
필터링도 가능합니다. 이 필터링을 이용하면 Error만 볼수도 있고 Debug만 볼수도 있습니다.
로그분석 업체에서는 이미 사용중인 기능이기도 합니다.
로그분석에 어떤 국가의 IP인지 확인할 수 있다면 악의적인 IP의 접근 차단도 할수 있을것이며
인젝션 공격등 방어를 위해 특정 국가의 접속을 막을수도 있을 것입니다.
위 사이트에서는 데모 버전이 올라와 있습니다.
ASP 버전으로 데모버전에는 데모데이터를 활용하고 있습니다.
데모데이터를 실제 마지막으로 업데이트된 데이터로 교체하여 사용하시면 된답니다.
첨부파일에는 2009년 2월 데이터와 예제 프로그램이 있으니 필요하신 분은 첨부파일을 받아 사용하세요~
--------------------------------------------------------------------------------------------------------------------
사용법
1. GeoIPCOM.dll을 system32 폴더에 복사
2. regsvr32 GeoIPCOM.dll - 레지스트리에 DLL등록
3. ASP 프로그램에 적용
set geoip = Server.CreateObject("GeoIPCOM.GeoIP")
geoip.loadDataFile("C:\Program Files\GeoIP\GeoIP.dat")
country_code = geoip.country_code_by_name(hostname)
country_name = geoip.country_name_by_name(hostname)