Search Results for '프로그래밍'


1208 posts related to '프로그래밍'

  1. 2010/11/15 Logparser를 이용한 IIS 로그 Forensic 방법
  2. 2010/11/15 awstats를 이용한 로그분석 세팅(윈도우즈 IIS용)
  3. 2010/11/06 IIS 명령줄 관리 도구, AppCmd : 사이트 속성 조회 및 변경
  4. 2010/11/06 C# Programming 에 유용한 툴 목록
  5. 2010/11/06 C# DNS nslookup 컴포넌트
  6. 2010/11/06 svchost.exe 에서 호스팅 하는 서비스 목록 조회
  7. 2010/11/06 ASP.NET, Sql Injection 필터 예제 코드
  8. 2010/11/06 C#, IPAddress 및 Port 변환
  9. 2010/11/06 C#, gzip 압축 예제 코드
  10. 2010/11/06 Server Utility Tools - 윈도우서버 툴 - 일부 추가
  11. 2010/11/06 Windows Script Encoder
  12. 2010/11/06 IIS 명령줄 관리 도구, AppCmd : 사이트 및 응용 프로그램 풀 상태
  13. 2010/11/06 IIS 6 에서 PHP 5.x 설치하기
  14. 2010/11/06 SVN 사용법과 용어 설명
  15. 2010/11/06 Centos telnet 한글 깨짐
  16. 2010/11/06 [함수]트위터(?) 처럼 날짜데이터를 간소하게 출력
  17. 2010/11/06 PHP 서브도메인 세션 쿠키 공유하기
  18. 2010/10/12 [ASP] 구글 지메일 smtp를 이용한 메일 발송
  19. 2010/10/01 [알고리즘] 동일폴더내 파일들 일괄 rename 간단한 팁
  20. 2010/09/29 ASP 암호를 역변환 하기...
  21. 2010/09/26 RWAPM X-Server 32bit 5.7.4.4 릴리즈
  22. 2010/09/26 [함수] iframe resize 함수
  23. 2010/09/26 [정보] 다음 실시간이슈 검색어 XML 출력하기
  24. 2010/09/26 [정보] 다음/네이버 실시간 검색 XML
  25. 2010/09/26 [정보] 다음/네이버 실시간 검색 XML
  26. 2010/09/26 [함수] JPEG EXIF 정보 얻는 함수(read_exif_data 사용 안함)
  27. 2010/09/20 긴주소 줄이기
  28. 2010/09/02 아파치 웹서버 사용시 무단 링크 방지법
  29. 2010/09/02 ping 응답하지않게 하기
  30. 2010/09/02 핑으로 서버의 운영체제를 알자

Logparser는 MS에서 만든 강력한 IIS, W3C, 이벤트 로그 분석툴로서 SQL 쿼리타입으로 조건별 검색할 수 있는 강력한 툴입니다.

1) 가장 최근에 생성된 시간을 기준으로 ASP 스크립트를 변조한 Trojan Files 여부를 진단
 
C:\logparser2.2\logparser -i:FS "SELECT TOP 20 Path, CreationTime FROM C:\inetpub\wwwroot\*.* ORDER BY CreationTime DESC" -rtp:-1 


2). 가장 최근에 수정된 Files 로그 찾기

C:\logparser2.2\logparser -i:FS "SELECT TOP 20 Path, LastWriteTime FROM C:\inetpub\wwwroot\*.* ORDER BY LastWriteTime DESC" -rtp:-1   
  
3). 해커가 Trojan Files을 삭제한 경우에 HTTP 200 서버코드 흔적 로그를 찾는다.
 
C:\logparser "SELECT DISTINCT TO_LOWERCASE(cs-uri-stem) AS URL, Count(*) AS Hits FROM ex*.log WHERE sc-status=200 GROUP BY URL ORDER BY URL"    -rtp:-1  
 
* nc.exe, tini.exe, root.exe, cmd.exe, upload.asp, aspexec.asp, cmd.asp 같은 파일 이름이 있으면 의심

4) Script Abuse 분석(가장 많은 Request 요청을 받은 Executable 파일의 확장자 확인)

C:\logparser -i:FS "SELECT TO_LOWERCASE(SUBSTR(Name, LAST_INDEX_OF(Name, '.'),  STRLEN(Name))) AS Extenstion, Count(*) AS Files FROM C:\inetpub \wwwroot\*.*, C:\inetpub\scripts\*.* WHERE Attribute NOT LIKE 'D%' GROUP BY Extenstion ORDER BY Files DESC" -rtp:-1 

* 특히, .ASP, .DLL 파일 요청을 유심히 봐야함

5) HTTP 서버 500 에러코드 검사

C:\logparser "SELECT [cs-uri-stem], [cs-uri-query], Count(*) AS [Hits] FROM c:\logs\web\ex*.log WHERE sc-status = 500 GROUP BY [cs-uri-stem], [cs-uri-query] ORDER BY [hits], [cs-uri-stem] DESC" -rtp:-1 -i:iisw3c
 

6) 가장 많은 Request Hit 수를 높음 ASP, DLL 파일 확인

C:\logparser "SELECT TO_STRING(TO_TIMESTAMP(date, time), 'yyyy-MM-dd') AS Day, cs-uri-stem, Count(*) AS Total ex*.log WHERE (sc-status<400 or sc-status>=500) AND (TO_LOWERCASE(cs-uri-stem) LIKE '%.asp%' OR TO_LOWERCASE(cs-uri-stem) LIKE '%.exe') GROUP BY Day, cs-uri-stem ORDER BY cs-uri-stem, Day" -rtp:-1 

7) 시간당 에러수가 가장 많이 발생한 날짜 확인
 
C:\logparser "SELECT date, QUANTIZE(time, 3600) AS hour, sc-status, Count(*) AS Errors FROM ex03*.log WHERE sc-status>=400 GROUP BY date, hour, sc-status HAVING Errors>25 ORDER BY Error DESC" -rtp:-1 

* 25개 이상의 에러코드(404코드)를 발생한 날짜와 시간 결과를 출력

8) 하루동안 50번이상 동일 페이지에 접속을 시도한 클라이언트 IP 확인
 
C:\logparser "SELECT DISTINCT date, cs-uri-stem, c-ip, Count(*) AS Hits FROM ex*.log GROUP BY date, c-ip, cs-uri-stem HAVING Hits>50 ORDER BY Hits DESC" -rtp:-1 

9) 하루동안 50번이상 동일 페이지에 접속을 시도한 클라이언트 IP 확인
 
C:\logparser "SELECT DISTINCT date, cs-uri-stem, c-ip, Count(*) AS Hits FROM ex*.log GROUP BY date, c-ip, cs-uri-stem HAVING Hits>50 ORDER BY Hits DESC" -rtp:-1 

10)  모든 ASP 에러 기록 확인
 
C:\logparser "SELECT cs-uri-query, Count(*) AS Total FROM ex*.log WHERE sc-status>=500 GROUP BY cs-uri-query ORDER BY Total DESC" -rtp:-1 

* 특히, ODBC와 ADO 에러는 SQL Injection 가능성이 있으므로 주의깊게 살펴봐야 함

11) 스크립트 및 Executable 파일의 HTTP 서버 코드 기록 확인
 
C:\logparser "SELECT cs-uri-stem, sc-status, Count(*) AS Total FROM ex*.log WHERE TO_LOWERCASE(cs-uri-stem) LIKE '%.asp%' or TO_LOWERCASE(cs-uri-stem) LIKE '%.exe%' GROUP BY cs-uri-stem, sc-status ORDER BY cs-uri-stem, sc-status" -rtp:-1 

12) Win32 Status Code 분석을 통한 Attack 확인
 
C:\logparser "SELECT cs-uri-stem, WIN32_ERROR_DESCRIPTION(sc-win32-status) AS Error, Count(*) AS Total FROM ex*.log WHERE sc-win32-status>0 AND (TO_LOWERCASE(cs-uri-stem) LIKE '%.asp%' OR TO_LOWERCASE(cs-uri-stem) LIKE '%.exe%') GROUP BY cs-uri-stem, Error ORDER BY cs-uri-stem, Error" -rtp:-1
 

13) HTTP Method 통계 분석
 
C:\logparser "SELECT cs-uri-stem, cs-method, Count(*) AS Total FROM ex*.log WHERE (sc-status<400 or sc-status>=500) AND (TO_LOWERCASE(cs-uri-stem) LIKE '%.asp%' or TO_LOWERCASE(cs-uri-stem) LIKE '%.exe%') GROUP BY cs-uri-stem, cs-method ORDER BY cs-uri-stem, cs-method" -rtp:-1

2010/11/15 08:02 2010/11/15 08:02
일단 perl을 설치한다.
http://www.perl.com

D:\Perl 에 설치되어 있다고 가정하고,


awstats를 다운받는다.
http://awstats.sourceforge.net

압축을 해제하든 exe 파일을 실행시키든 어쨌든 설치한다.
D:\awstats 에 설치되었다고 가정한다.


D:\awstats\wwwroot\cgi-bin\ 폴더를 해당 webroot/awstats/ 에 카피한다.
D:\awstats\wwwroot\icon\ 폴더를 해당 webroot/awstats/ 에 카피한다.

웹사이트명을 mylog.com 이라고 가정하면,

webroot/awstats/cgi-bin/awstats.model.conf 파일을 같은 폴더에 복사한다.
파일명은 반드시 awstats.mylog.conf 로 한다.

awstats.mylog.conf 파일을 편집한다.

LogFile="D:\LogFiles\W3SVC12345678\ex%YY-24%MM-24%DD-24.log
LogType=W
LogFormat=2
SiteDomain="mylog.com"
DirIcons="/awstats/icon"
AllowAccessFromWebToFollowingIPAddresses="192.168.0.1-192.168.0.254"
UseFramesWhenCGI=0
Lang="ko"


도스창에서 실행한다.
D:> perl awstats.pl -config=mylog -update

기본적으로 awstats는 현재날짜의 로그를 적용하지 않는다.
그래서 보통 매일새벽에 스케줄링으로 업데이트를 한다.

브라우저에서 실행시킨다.

http://mylog.com/awstats/cgi-bin/awstats.pl?config=mylog

간혹, 텍스트만 출력되기도 하는데 그럴땐 브라우저에 다시 입력해보면 제대로 출력된다.
왜 그런지 이유는 모르겠음.



IIS설정을 확인해 보자.

먼저, IIS에서 perl을 해석할 수 있어야 한다.
IIS관리에서 mylog.com 의 속성->홈디렉토리->구성->매핑 탭에 들어가서 "pl" 확장자를 추가한다.
이때 실행파일을 D:\perl\bin\perl.exe 로 하면 안되고 D:\perl\bin\perlis.dll 로 해야한다.

당연하겠지만 "W3C 확장 로그 파일 형식"으로 IIS 로그사용에 체크되어 있어야 한다.
로깅 속성은 다음과 같다.

date
time
c-ip
cs-username
cs-method
cs-uri-stem
cs-uri-query
sc-status
sc-bytes
cs-version
cs(User-Agent)
cs(Referer)

위 내용빼고는 전부 체크해제해야 한다.
간혹, 윈도우즈 서버의 버전 또는 IIS 버전에 따라 기본속성이 틀릴수 있으니 반드시 확인해 봐야한다.

자세한 내용은 awstats 웹사이트의 doc을 확인해라.

http://awstats.sourceforge.net/docs/index.html
2010/11/15 07:57 2010/11/15 07:57
특정 사이트의 환경 설정값 전체 조회

appcmd.exe list config "youngsam.kr"


특정 사이트의 환경 설정값중 특정 섹션

appcmd.exe list config "youngsam.kr" /section:asp

<system.webServer>
  <asp>
    <session />
    <comPlus />
    <cache diskTemplateCacheDirectory="%SystemDrive%\inetpub\temp\ASP Compiled Templates" />
    <limits />
  </asp>
</system.webServer>



특정 사이트의 환경 설정값중 특정 섹션의 속성값

appcmd.exe list config "youngsam.kr" /section:asp /config:*

<system.webServer>
  <asp appAllowClientDebug="false" appAllowDebugging="false" errorsToNTLog="false" ..........



환경 설정값 에서 어떤 섹션이 있는지 조회

appcmd.exe list config /section:?

system.net/authenticationModules
system.web/deployment
system.web/httpModules
system.webServer/directoryBrowse
system.webServer/cgi .................



웹서버 또는 특정 사이트의 특정 섹션값 변경

appcmd.exe set config /section:asp /appAllowClientDebug:false

구성 커밋 경로 "MACHINE/WEBROOT/APPHOST"에서 "MACHINE/WEBROOT/APPHOST"의 "system.webServer/asp" 섹션에 구성 변경을 적용했습니다.


등록되어 있는 모듈 조회

appcmd.exe list config /section:system.webServer/modules

<system.webServer>
  <modules>
    <add name="HttpCacheModule" />
    <add name="StaticCompressionModule" />
    <add name="DefaultDocumentModule" />
    <add name="DirectoryListingModule" />
    <add name="ProtocolSupportModule" />
    <add name="StaticFileModule" />
    <add name="AnonymousAuthenticationModule" />
    <add name="RequestFilteringModule" />
    <add name="CustomErrorModule" />
    <add name="IsapiModule" />
    <add name="HttpLoggingModule" />
    <add name="BitrateModule" />
  </modules>
</system.webServer>



특정 모듈 추가 및 제외 [+/-]

appcmd.exe set config /section:system.webServer/modules /-[name='HttpCac
heModule']



특정 노드 또는 속성값 조회

appcmd.exe search config "youngsam.kr"

CONFIGSEARCH "MACHINE/WEBROOT/APPHOST/youngsam.kr"

2010/11/06 06:15 2010/11/06 06:15
실제 링크는 다음 문서에서...
http://msdn.microsoft.com/ko-kr/vcsharp/aa336818(en-us).aspx



Featured Tools
IMSL™ C# Numerical Library for Microsoft® .NET Applications
Extreme Optimization Mathematics Library for .NET
devAdvantage : C# Source Code Analyzer for Visual Studio .NET

Libraries and Other Stuff
Visual Guard
LibCheck
AQdevTeam
C-Sharpener For VB
{smartassembly}
SmartInspect
Visual Studio Spell Check Add-In - StudioSpell

C# Compilers and Frameworks
.NET Framework SDK Downloads
Visual C# 2005, Express Edition
Rotor?The Microsoft Shared Source CLI Implementation
Mono
eXtensible C#
DotGnu

Obfuscators

{smartassembly}
Dotfuscator .NET Obfuscator
Salamander .NET Obfuscator
Semantic Designs: C# Source Code Obfuscator
Spices.Net
Thinstall
Demeanor for .NET
Xenocode Postbuild 2006
.NET Reactor

Decompilers
Dis#
Decompiler.NET
Exemplar/Anakrino
Reflector .NET Decompiler
Salamander .NET Decompiler (C#, C++, Visual Basic .NET, IL, MSIL)
Xenocode Fox 2006

Profiler/Optimization Tools
NCover
ANTS Profiler
{smartassembly}
Salamander .NET Decompiler (C#, C++, Visual Basic .NET, IL, MSIL)
.NET Memory Profiler
AQtime .NET Edition 2 - Automated Profiling and Debugging
Compuware DevPartner Studio Professional Edition
Allocation Profiler
CoverageEye.NET
NProf
Rational PurifyPlus - Product Overview - IBM Software

Refactoring
C# Refactory
dotEASY
devAdvantage : C# Source Code Analyzer for Visual Studio .NET
ReSharper
DocumentatorMacros

Object Browsers
Reflector for .NET
.NET Component Inspector
LSW DotNet-Reflection-Browser

Editors
C# for emacs
Improve C# Plugin for Eclipse
CodeObject
Semantic Designs: C# Source Code Formatter

Development Environments (IDEs)

SharpDevelop
PowerToys for Visual Studio .NET 2003

Build Tools

NAnt?A .NET Build Tool
CruiseControl.NET
FinalBuilder
Visual Build Professional
Hippo.NET
MegaBuild

Standard Verifiers
FxCop

Testing

TestRunner for NUnit
HarnessIt
POCMock
.NETUnit
NUnit
TestComplete
X-Unity
csunit

Documentation
NDOC?Code Documentation Generator for .NET
SoftSteel C# Tutorial on Documentation
NetDoc
Roland Weigelt's GhostDoc

Database

ADO.NET Express
Data Access Application Block for .NET
DataLG: Generate Assemblies for Visual C# and Visual Basic .NET
DeKlarit
OlyMars

Regular Expressions

GotDotNet User Sample: Regular Expression Workbench (V2.00)
Regular Expression Designer
Expresso?A Tool for Building and Testing Regular Expressions

Graphics, Games and Drawing
CadLib
Sharp3D.Math Library
Animated Vector Graphics
2010/11/06 06:13 2010/11/06 06:13
C# DNS nslookup 컴포넌트
http://www.codeproject.com/KB/IP/dnslookupdotnet.aspx

명령행에서, 보통 사용하는 nslookup 을 사용자 프로그래밍에서 가능하게 하는 공개 컴포넌트 입니다. - 필요한곳에 잘 써먹음...^^ -

물론 이런 컴포넌트가 아닌, nslookup.exe 의 쉘을 받아서 구현이 가능하겠지만,. 구조적이지 않다는 점이 있겠지요..^^

사용법은, 참조에서 Bdev.Net.Dns.dll 를 참조하고, 다음 예제와 같은 코드를 또는 해당 메쏘드를 기반으로 하는 추가 코드를 구현하면 됩니다.


IPAddress dnsServerAddress = IPAddress.Parse("168.126.63.1");

MXRecord[] records = Resolver.MXLookup("wssplex.net",  dnsServerAddress);

foreach (MXRecord record in records)
{
    Console.WriteLine("{0}, preference {1}", record.HostName, record.Preference);
}

특정 쿼리 타입 메쏘드 또는 공용 메쏘드에서 특정 쿼리 타입을 지정 해주거나...

IPAddress dnsServerAddress = IPAddress.Parse("168.126.63.1");

Request request = new Request();
request.AddQuestion(new Question("wssplex.net", DnsType.MX, DnsClass.IN));

Response response = Resolver.Lookup(request, dnsServerAddress);

foreach (Answer answer in Answers)
{
    MXRecord record = (MXRecord)answer.Record;
    Console.WriteLine("{0}, preference {1}", record.HostName, record.Preference);
}


그리고, 같이 배포되는 데모 프로젝트의 소스를 보면, 좀더 응용이 가능합니다. 한가지 버그?? 라면,. 도메인을 정규편식으로 체크하는 Question 클래스의 아래 정규편식 입니다.

!Regex.IsMatch(domain, @"^[a-z|A-Z|0-9|-|_]{1,63}(\.[a-z|A-Z|0-9|-|_]{1,63})+$")

보통의 도메인은 맞긴 하나,. "-" 가 들어간 도메인은 매칭이 되지 않는 정규편식 입니다. 물론 소스코드 까지 배포가 되므로,. 직접 수정후 빌드해서 참조하면 되겠습니다.^^;
2010/11/06 06:12 2010/11/06 06:12
아는 사람들은 다 아는.... tasklist.exe

특정 svchost 프로세스

C:\>tasklist /svc /FI "pid eq 880"
이미지 이름                       PID        서비스
========================= ======== ============================================
svchost.exe                    880          AeLookupSvc, AudioSrv, CryptSvc, dmserver,
                                                    EventSystem, helpsvc, lanmanserver,
                                                    lanmanworkstation, Netman, Nla, RasMan,
                                                    Schedule, seclogon, SENS, SharedAccess,
                                                    ShellHWDetection, winmgmt, wuauserv, WZCSVC

전체 서비스 조회는  C:\>tasklist /svc 이며,
또는 tasklist /svc /FI "IMAGENAME eq svchost.exe"다음과 같은 필터가 가능

필터 이름       유효한 연산자             유효한 값
-----------     ---------------           --------------------------
STATUS          eq, ne                    RUNNING |
          NOT RESPONDING | UNKNOWN
IMAGENAME       eq, ne                    이미지 이름
PID             eq, ne, gt, lt, ge, le    PID 값
SESSION         eq, ne, gt, lt, ge, le    세션 번호
SESSIONNAME     eq, ne                    세션 이름
CPUTIME         eq, ne, gt, lt, ge, le    CPU 시간
          (hh:mm:ss 형식)
          hh - 시간,
          mm - 분, ss - 초
MEMUSAGE        eq, ne, gt, lt, ge, le    메모리 사용(KB)
USERNAME        eq, ne                    사용자 이름([domain\]user
          형식)
SERVICES        eq, ne                    서비스 이름
WINDOWTITLE     eq, ne                    창 제목
MODULES         eq, ne                    DLL 이름

GUI 에서는 볼수 없을까요?..
Process Explorer 에서도 볼수가 있습니다.

사용자 삽입 이미지
2010/11/06 06:12 2010/11/06 06:12
닷넷 프레임워크 2.0 이상에서는, HttpModule 을 등록하여 사용하는 방법에 대한 것이고, 닷넷 1.1 기반에서는 응용프로그램 시작 지점에 체크 루틴을 넣는 방법 입니다.

public static string[] blackList =
 {"--",";--",";","/*","*/","@@","@",
    "char","nchar","varchar","nvarchar",
    "alter","begin","cast","create","cursor","declare","delete","drop",
    "end","exec","execute",
    "fetch","insert","kill","open",
    "select", "sys","sysobjects","syscolumns",
    "table","update"};

Sql Injection 이 가능한 문자열을 배열로 지정을 해놓고, 웹서버에 요청되는 내용을 위 내용으로 필터링을 하는 것입니다.

특히 요즘에는,. 쿼리문을 바이너리 문자열로 인코딩하여 실제 SQL Server 에서는 실행시 정상적인 쿼리문으로 실행되도록 Cast 형변환,. 즉 Declare 와 Cast 를 많이 쓰는것 같습니다.

사이트의 개별 코드와는 상관없이 사이트 전역에 영향을 주는 방법이긴 합니다만, Form 값으로 들어오는 부분도 필터링을 하므로,. 보통 게시판을 글 내용에 있는 것도 필터가 될수도 있겠네요.

요즘,. Sql Injection 이 극성인데,..
조금이나마 도움이 될수도 있을것 같습니다.^^
2010/11/06 06:11 2010/11/06 06:11
//IPAddress 를 숫자형으로 반환 받은 경우 문자열로 변환
public string LongToIPAddress(uint IPAddr)
{
  return new System.Net.IPAddress(IPAddr).ToString();
}

//문자열 IPAddress 를 숫자형으로 변환
public uint IPAddressToLong(string IPAddr)
{
  System.Net.IPAddress oIP=System.Net.IPAddress.Parse(IPAddr);
  byte[] byteIP=oIP.GetAddressBytes();

  uint ip=(uint)byteIP[3]<<24;
  ip+=(uint)byteIP[2]<<16;
  ip+=(uint)byteIP[1]<<8;
  ip+=(uint)byteIP[0];

  return ip;
}

//byte 단위 값을 숫자형 값으로 변환
public int LocalPort(uint dwLocalPort)
{
    return (int)(((dwLocalPort & 0xFF00) >> 8) | ((dwLocalPort & 0x00FF) << 8));
}
2010/11/06 06:10 2010/11/06 06:10
닷넷 프레임워크 2 에서 부터 제공하는 GZipStream 압축 클래스

  using System.IO; 
  using System.IO.Compression;

  FileStream fs = new FileStream("c:\\wssplex.gz",FileMode.CreateNew);
  GZipStream gz = new GZipStream(fs, CompressionMode.Compress);
  StreamWriter sw = new StreamWriter(gz);
  sw.Write("data");
  sw.Close();

http://msdn.microsoft.com/ko-kr/library/system.io.compression.gzipstream.aspx


2010/11/06 06:09 2010/11/06 06:09

Server Utility Tools

Windows Script Encoder - 스크립트 인코더로 스크립트 소스코드 보호
 Windows Installer 3.0 Redistributable - Windows Installer 3.0 버젼. msi 배포시 필요.
 Windows Script 5.6 - Windows 2003용 Windows Script 5.6 버젼
 Windows Script 5.6 - Windows 2000,XP용 Windows Script 5.6 버젼
 Microsoft Network Monitor 3 패킷분석기
 SyncBack Freeware - Freeware 파일 백업/동기화 유틸
 Reflector for .NET - 닷넷디컴파일러
 Sourceforge Project - Clam AntiVirus - 실시간 바이러스DB 업데이트 제공
 Sourceforge Project - Packetyzer - 패킷분석기
 Microsoft Data Access Components (MDAC) 2.8 한글
 Microsoft .NET Framework 2.0 베타 2(x86)
 Microsoft .NET Framework 1.1 Redistributable 한글
 WMI Code Creator v1.0
 WMI Administrative Tools
 Debug Diagnostic Tool v1.1 디버깅툴
 Debugging Tools for Windows - WinDbg 디버깅툴

 Sysinternals - Diskmon v2.01 - HDD 작동상태 모니터링
 Sysinternals - Filemon v7.02 - 실시간 파일시스템 모니터링
 Sysinternals - Junction 1.032 - NTFS 심볼릭 링크 생성
 Sysinternals - PsTools v2.24 - 프로세스관리툴 모음
 Sysinternals - Autoruns v8.31 - Autorun 관리툴
 Sysinternals - RootkitRevealer - 루트킷 검색툴
 Sysinternals - Tokenmon - 토큰모니터
 Sysinternals - TDIMon - TCP/IP 실시간 모니터
 Sysinternals - Process Explorer - 프로세스탐색기
 Sysinternals - Portmon for Windows NT/9x - 네트워크포트 모니터
 Sysinternals - Regmon for Windows NT/9x - 레지스트리 모니터
 Sysinternals - CPUMon - CPU 모니터
 Sysinternals - Filemon for Windows - 파일 모니터
 Sysinternals - BlueScreen Screen Saver - 블루스크린 세이버

Windows Server
 Web Application Stress Tool
 Windows Server™ 2003 Performance Advisor
 Windows Server 2003 Resource Kit Tools
 IIS 5.0 Process Recycling Tool - IIS 5 재생을 통해 가용성을 높이는 툴
 User Profile Hive Cleanup Service(EventlogID:1000..)
 Internet Information Services (IIS) 6.0 Resource Kit Tools
 IIS Diagnostics Toolkit (x86)
 Urlscan 2.5 Install Package
 IIS Crash/Hang Agent & IIS Dump
 Active Directory Migration Tool v3.0 한글

SQL Server
 SQL Server Web Data Administrator
 SQL Server Express Utility
 SQL Server Health and History Tool (SQLH2)
 Best Practices Analyzer Tool for Microsoft SQL Server 2000 1.0
 Microsoft SQL Server Report Pack for Internet Information Services (IIS Logs)

Exchange Server
 Exchange 지능형 메시지 필터 - Exchange Server 2003 버젼용
 Exchange Server Stress and Performance 2003
 Microsoft Exchange Server 2003 Load Simulator (LoadSim)
 Microsoft Exchange Server User Monitor
 Microsoft Exchange Server Mailbox Merge Wizard (ExMerge)
 Exchange Server 2003 Exchange 배포 도구
 Exchange Server Performance Troubleshooting Analyzer Tool v1.0
 Exchange Server Best Practices Analyzer Tool 한글
2010/11/06 06:07 2010/11/06 06:07

간략한 설명

Script Encoder는 사용하기 쉬운 명령줄 도구입니다. Script Encoder를 사용하면
스크립트 디자이너가 자신의 최종 스크립트를 인코딩할 수 있어서 웹 호스트나 웹 클라이언트가 원본을 보거나 수정할 수 없게 됩니다. 그러나 이렇게
인코딩하면 사용자의 코드를 쉽게 볼 수만 없을 뿐, 전문 해커들이 사용자가 어떻게 스크립트를 작성했는지 보는 것을 막지는 못합니다.

개요


Script Encoder는 사용하기 쉬운
명령줄 도구입니다. Script Encoder를 사용하면 스크립트 디자이너가 자신의 최종 스크립트를 인코딩할 수 있어서 웹 호스트나 웹
클라이언트가 원본을 보거나 수정할 수 없게 됩니다. 그러나 이렇게 인코딩하면 사용자의 코드를 쉽게 볼 수만 없을 뿐, 전문 해커들이 사용자가
어떻게 스크립트를 작성했는지 보는 것을 막지는 못합니다.
2010/11/06 06:04 2010/11/06 06:04
IIS 명령줄 관리 도구, AppCmd : 사이트 및 응용 프로그램 풀 상태
응용 프로그램 풀 상태

C:\Windows\System32\inetsrv>appcmd.exe list apppool /text:*
에서 또는 응용 프로그램 풀 관련 xml 에서 지원하는 속성값을 확인하여 파라미터를 추가하여 조회 가능

C:\Windows\System32\inetsrv>appcmd.exe list apppool www.wssplex.net
APPPOOL "www.wssplex.net" (MgdVersion:v2.0,MgdMode:Integrated,state:Started)

C:\Windows\System32\inetsrv>appcmd.exe list apppool /state:started
C:\Windows\System32\inetsrv>appcmd.exe list apppool /enable32BitAppOnWin64:"false"


실행중인 작업자 프로세스

C:\Windows\System32\inetsrv>appcmd.exe list wps
WP "3880" (applicationPool:DefaultAppPool)

C:\Windows\System32\inetsrv>appcmd.exe list wps /apppool.name:DefaultAppPool
WP "3880" (applicationPool:DefaultAppPool)

C:\Windows\System32\inetsrv>appcmd list wp "3897"


현재 요청 내역 확인

C:\Windows\System32\inetsrv>appcmd.exe list requests
REQUEST "f500000080000005" (url:GET /favicon.ico, time:16 msec, client:localhost, stage:SendResponse
, module:IIS Web Core)


C:\Windows\System32\inetsrv>appcmd.exe list requests /apppool.name:DefaultAppPool
C:\Windows\System32\inetsrv>appcmd.exe list requests /wp.name:3897
C:\Windows\System32\inetsrv>appcmd.exe list requests /wp.name:3897
2010/11/06 06:02 2010/11/06 06:02

1. PHP 설치

1.1 최신 버젼인 PHP 5.1.2 버젼을 다운로드 : http://www.php.net/downloads.php

다운로드를 할때, 버젼은 "Collection of PECL modules for PHP 5.1.2 " 을 다운로드를 한다. PECL은 PHP의 광범위한 확장 라이브러리 모듈을 제공한다 한다.

msi 인스톨러보다는, zip 압축을 다운받기를 바람..

확장라이브러리는 http://pear.php.net/packages.php 에서 필요한 수많은 모듈을 다운로드 할수있다.

블로그중에, PECL 관련 포스트도 참고해 보기 바란다.
http://blog.naver.com/jegom?Redirect=Log&logNo=120004156186

1.2 php.ini-recommand 를 php.ini 로 변경

압축을 푼 PHP 디렉토리에서, php.ini* 로 되어 있는 파일은, PHP에서 권장하는 설정값이 적용되어 있는 파일이다.

2. PHP 환경설정

2.1 php.ini에서 cgi.force_redirect 값이 0 인지 확인.

2.2 browscap.ini 파일 설치하기

꼭 설치할 필요는 없다. 다만, PHP에서 브라우져 특성에 따라 최적의 스크립트 작동을 하게 된다.

php_browscap.ini는 http://www.garykeith.com/browsers/downloads.asp 에서 다운로드가 가능하며,  PHP 설치디렉토리의 extras에 복사해 넣고, php.ini에서 browscap 에 다음과 같이 경로를 지정해 준다.

browscap=C:\PHP\extras\browscap.ini

2.3 php.ini 에서 세션파일 저장 경로 설정.

session.save_path=C:\PHP\Sessions

2.4 PHP 확장 라이브러리 설정

추가적인 확장모듈을 설치하고자 한다면 다음 웹사이트를 방문해 보기 바란다.
http://ca3.php.net/manual/en/install.windows.extensions.php

php.ini 에서 extension_dir 확장모듈 경로를 지정해준다.

 "C:\PHP\extension"

extension=php_mbstring.dll
extension=php_bz2.dll
extension=php_cpdf.dll
extension=php_curl.dll
extension=php_dba.dll
extension=php_dbase.dll
extension=php_dbx.dll
;extension=php_exif.dll
extension=php_fdf.dll
extension=php_filepro.dll
extension=php_gd2.dll
extension=php_gettext.dll
;extension=php_ifx.dll
extension=php_iisfunc.dll
extension=php_imap.dll
extension=php_interbase.dll
extension=php_java.dll
extension=php_ldap.dll
;extension=php_mcrypt.dll
extension=php_mhash.dll
extension=php_mime_magic.dll
extension=php_ming.dll
extension=php_mssql.dll
extension=php_msql.dll
extension=php_mysql.dll
extension=php_mysqli.dll
;extension=php_oci8.dll
extension=php_openssl.dll
;extension=php_oracle.dll
extension=php_pdf.dll
extension=php_pgsql.dll
extension=php_shmop.dll
extension=php_snmp.dll
extension=php_sockets.dll
;extension=php_sybase_ct.dll
extension=php_tidy.dll
extension=php_ffi.dll
extension=php_xmlrpc.dll
extension=php_xsl.dll
;extension=php_yaz.dll
extension=php_zip.dll

위와 같이 on 인 확장모듈은 굳이 on을 하지 않아도 된다. 그러나 on을 해도 대부분 오류가 없다. 다 off 해도 좋은나, 예로 mssql을 이용한다면 php_mssql.dll 은 on을 해야 한다.

2.5 php dll 파일 경로설정.

다음 2가지 방법중 1가지를 하면 된다. 대부분 첫번째 a 방법을 선택한다.

a. C:\PHP의 php-dll 이 아닌 모든 dll 파일을 System32에 복사한다. 또는,

b. Windows PATH 경로에서 "C:\PHP" 를 추가해 준다.
이 방법은 추후 업그레이드나 삭제를 훨씬 쉽게 한다. System32에 복사해서 여기저기 퍼져 있으면 추후 업그레이드나 삭제시 잊어버리게 된다.

2.6 레지스트리에 PHP 설치경로 추가. 

이 설정은 php의 환경설정을 지정된 경로에서 찾게 한다. 굳이 php.ini를 Windows 디렉토리에 복사해 넣을 필요가 없다.

HKEY_LOCAL_MACHINE\SOFTWARE\PHP\IniFilePath = C:\PHP

다음을 텍스트파일에 .reg 확장자로 저장후 실행하면 쉽게 적용된다.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\PHP]
"IniFilePath"="C:\\PHP"

3. IIS에 PHP 설정하기

3.1 IIS의 웹서비스 확장에 추가한다.

확장 이름에는 "PHP ISAPI Extension" 를 추가하고 확장모듈 dll을 PHP 설치디렉토리의 php5isapi.dll 파일을 지정한다. 그런다음에 허용설정을 해준다.

php를 실행하는 방법은 지금과 같이 ISAPI 모듈을 이용하는 것과 php-cgi.exe 를 이용하는 방법이 있다. 되도록이면, ISAPI 모듈을 이용하는 것이 좋다.

*php를 적용하는 방법에는 2가지가 있다. 웹 루트에 적용하는 것과 특정 웹사이트에 적용하는 방법이 있으니 적용코자 하는 경우에 따라 선택하면 된다.

3.2 .php 확장자를 추가해 준다.

역시 .php 확장에 대한 실행경로는 php5isapi.dll 을 지정해 주며, 동사에는 GET, POST, HEAD 만 허용해 준다. 굳이 많이 허용을 해줘봤자 보안에 구멍만 만들어 줄 뿐이다.

3.3 IIS를 재시작 한다. 만약 Window PATH 에 적용했다면 리붓팅을 해준다.

4. 웹페이지 테스트

<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
  <!-- testing sessions -->
  <?php session_start(); ?>
 
  <!-- testing browscap.ini -->
  <?php
   echo $_SERVER['HTTP_USER_AGENT'] . "<br/><br/>";
   $browser = get_browser(null, true);
   print_r($browser);
   echo "<br/><br/>";
  ?>
 
  <!-- a general PHP test -->
  <?php phpinfo(); ?>
 </body>
</html>

test.php 파일에 다음과 같은 코드로 php 실행 여부 및 환경설정값을 확인할 수 있다.

5. 트러블슈팅 

5.1 작동하지 않는다면,..

해당 웹사이트의 ISAPI 필터에 필터이름 "PHP" 에 실행파일을 php5isapi.dll 을 지정해 줘 본다. 물론 등록후에는 IIS를 재시작 해야 만이 필터가 로드된다.

ISAPI 필터에 등록되면, 웹서버의 성능상 그리 권장사항은 아니다. 필터가 많을수록 웹요청에 대한 필터 처리를 통과해야 하기 때문이다.

5.2 browscap.ini 에서 오류 발생시...,

php.ini에서 browscap의 실제 경로를 다시 확인하여 지정해줘 본다.

5.3 401 권한오류 또는 403 퍼미션 거부 오류.

이 부분은 ISAPI 모듈이 아니라, CGI(php-cgi.exe)를 이용한 경우가 그렇다. cgi를 이용한다면 해당 웹사이트를 실행하는 어플리케이션 풀의 실행 계정이 PHP 설치경로 권한이 있는지 확인해 본다.

5.4 세션이 저장되지 않는다.,,,

세션은 앞서 지정했던 php.ini 파일에 지정한 경로에 인터넷게스트계정(IUSR_) 이 쓰기권한 정도의 권한을 지정해 준다.
2010/11/06 06:00 2010/11/06 06:00
SVN 용어

용어 설명
저장소 : 리포지토리(Repository)라고도 하며 모든 프로젝트의 프로그램 소스들은 이 저장소 안에 저장이 됩니다. 그리고 소스뿐만이 아니라 소스의 변경 사항도 모두 저장됩니다. 네트워크를 통해서 여러 사람이 접근 할 수 있습니다. 버전 관리 시스템 마다 각각 다른 파일 시스템을 가지고 있으며 Subversion은 Berkeley DB를 사용합니다. 한 프로젝트 마다 하나의 저장소가 필요합니다.

리비전(Revision) : 소스 파일등을 수정하여 커밋하게 되면 일정한 규칙에 의해 숫자가 증가 합니다. 저장소에 저장된 각각의 파일 버전이라 할 수 있습니다. Subversion의 경우 파일별로 리비전이 매겨지지 않고 한번 커밋 한 것으로 전체 리비전이 매겨 집니다. 리비전을 보고 프로젝트 진행 상황을 알 수 있습니다.

trunk : 단어 자체의 뜻은 본체 부분, 나무줄기, 몸통 등 입니다. 프로젝트에서 가장 중심이 되는 디렉토리입니다. 모든 프로그램 개발 작업은 trunk 디렉토리에서 이루어집니다. 그래서 위의 구조에서 trunk 디렉토리 아래에는 바로 소스들의 파일과 디렉토리가 들어가게 됩니다.

branches : 나무줄기(trunk)에서 뻗어져 나온 나무 가지를 뜻합니다. trunk 디렉토리에서 프로그램을 개발하다 보면 큰 프로젝트에서 또 다른 작은 분류로 빼서 따로 개발해야 할 경우가 생깁니다. 프로젝트안의 작은 프로젝트라고 생각하면 됩니다. branches 디렉토리 안에 또 다른 디렉토리를 두어 그 안에서 개발하게 됩니다.

tags : tag는 꼬리표라는 뜻을 가지고 있습니다. 이 디렉토리는 프로그램을 개발하면서 정기적으로 릴리즈를 할 때 0.1, 0.2, 1.0 하는 식으로 버전을 붙여 발표하게 되는데 그때그때 발표한 소스를 따로 저장하는 공간입니다. 위에서 보면 tags 디렉토리 아래에는 버전명으로 디렉토리가 만들어져 있습니다.

명령어 의미
Import : svn import sampledir svn+ssh://svn-domain/svn/sample/trunk
맨 처음 프로젝트 시작할때 저장소에 등록하는 명령어 한 번 하고 나면 쓸일이 잘 없을 듯.

Checkout : svn checkout svn+ssh://svn-domain/svn/sample/trunk sample
저장소에서 소스를 받아 오는 명령어. 받아온 소스에는 소스 뿐만이 아니라 버젼관리를 위한 파일도 같이 받아 온다. 지우거나 변경시 저장소와 연결 불가능

Export : svn export svn+ssh://svn-domain/svn/sample2/trunk sample
체크아웃과는 달리 버젼관리 파일을 뺀 순수한 소스만 가져오는 명령어 마지막에 사용.

Commit : svn commit
체크아웃 한 소스를 수정, 파일 추가, 삭제 등을 한 뒤 저장소에 저장하여 갱신 하는 명령어. Revision이 1 증가 한다.

Update : svn update
체크아웃 해서 받은 소스를 최신의 소스로 업데이트 하는 명령어. 소스 수정이나 Commit 하기전에 한 번씩 해줘야 할 듯. 잘 못하면 소스 망치는 경우가 있을 듯.

Log : svn log
저장소에 어떠한 것들이 변경 되었는지 확인 할 수 있는 log 명령어

Diff : svn diff --revision 4 sample.c
diff 명령은 예전 소스 파일과 지금의 소스 파일을 비교해 보는 명령어

Blame : svn blame sample.c
Blame은 한 소스파일을 대상으로 각 리비전 대해서 어떤 행을 누가 수정했는지 알아보기 위한 명령어

lock : svn lock hello.c
파일에 락을 걸어 락을 건 사용자만이 수정할 수 있게 해주는 명령어. 해제는 svn unlock.
왜 파일에 락을 걸었는지 로그를 기록 할 수 있다.

Add : svn add hello.c
새 파일을 만들었을 경우에 파일을 추가 해주는 명령어. 그 뒤엔 꼭 svn commit를 꼭 해줘야 한다.
새 파일을 생성해서 올릴 때에도 꼭 add를 해줘야 함. 안해주면 commit을 해도 안 올라감.

파일 백업및 복구
dump : svnadmin dump sample > sample.dump
load : svnadmin load sample < sample.dump
새 파일을 만들었을 경우 
1. svn add filename.* 
2. svn ci filename.*

그냥 기존 소스 수정할 경우 
1. svn ci filename.* 

항상 svn update는 꼭 해주자

svn status : 자신이 수정하고 있는 파일의 상태를 알려주는 명령어
2010/11/06 01:12 2010/11/06 01:12
텔넷에서 한글깨짐. vi /etc/sysconfig/i18n
1. UTF-8 모드로 운영할때
LANG="ko_KR.UTF-8"
SUPPPORTED="ko_KR.UTF-8:ko_KR.eucKR:ko_KR:ko"
SYSFONT="lat0-sun16" <---여기서 lat0 의 0은 숫자0이다
SYSFONTACM="8859-15"
2. euc_KR 모드로 사용할때
LANG="ko_KR.eucKR"
SUPPORTED="ko_KR.eucKR:ko_KR:ko"
SYSFONT="lat0-sun16"
SYSFONTACM="8859-15"
----------------------------------------------------------------------------------------------------
Putty에서 한글 깨짐 Putty환경 설정에서 수신 문자셋을
서버가 EUC_KR 이면 CP949 로 서버가 UTF8 이면 UTF8 로 마추면 한글 입출력이 가능 하다.
 
CentOS 5 에서는
LANG="ko_KR.eucKR"
SUPPORTED="en_US.UTF-8:en:ko_KR.eucKR:ko_KR:ko"
SYSFONT="lat0-sun16"
SYSFONTACM="8859-15"
2010/11/06 00:59 2010/11/06 00:59
블로그 모듈 만들면서 날짜 데이터를 간소하게 출력할 필요성이 생겨서 만들어놓은건데 필요하신분이 계실거라 생각해서 올려봅니다.
허접한 소스라 입맛에 맛게 고쳐서 쓰시면 될것같아요;;
 
========================================================
#출력예제

echo diffDate('2010-01-01 00:00:20','2010-02-07 12:01:20');
//result : 1달 전

echo diffDate('2010-01-01 00:00:20',date('Y-m-d H:i:s'));
//현재 날짜의 차이를 계산에서 출력함
//result : 6달 전 (2010-07-24일 작성일 기준)

<?php
  
/**
* Params 
* $sDate 시작일 (게시물 작성일)
* $eDate 종료일 (현재 시간 기준)
*/
function diffDate($sDate,$eDate)
{
    $date[0]=strtotime($sDate);
    $date[1]=strtotime($eDate);
    if($date[0] >= $date[1])
    {
        return false;
    }
    $date[2]=strtotime(date('Y-m-d  H:i:s',$date[1] - $date[0]));
  
    $Y=date('Y',$date[2])-1970;
    $m=date('n',$date[2])-1;
    $d=date('j',$date[2])-1;
    $H=intval(date('H',$date[2]))-9; //그리니치 표준시 우리나라일경우 -9
    $i=intval(date('i',$date[2]));
    $s=intval(date('s',$date[2]));
    if($Y)
    {
        $returnDate= $Y;
        $returnDate.= '년 전';
    }
    elseif($m)
    {
        $returnDate= $m;
        $returnDate.= '달 전';
    }
    elseif($d)
    {
        $returnDate= $d;
        $returnDate.= '일 전';
    }
    elseif($H)
    {
        $returnDate= $H;
        $returnDate.= '시간 전';
    }
    elseif($i)
    {
        $returnDate= $i;
        $returnDate.= '분 전';
    }
    else
    {
        $returnDate= $s;
        $returnDate.= '초 전';
    }
    return $returnDate;
}
  
?>
2010/11/06 00:58 2010/11/06 00:58
예로 도메인이 http://www.naver.com 

                    http://se.naver.com

이라면 아래처럼 빨간색 부분만 처리하면 된다.




//ini_set("session.use_trans_sid", 0);
//ini_set("session.cache_expire", 86400);
//ini_set("session.gc_maxlifetime", 86400);
//ini_set('session.save_path', "/session");

session_set_cookie_params(0, "/", ".naver.com");
ini_set("session.cookie_domain", ".naver.com");

/*
if(isset($SESSION_CACHE_LIMITER)){  
    @session_cache_limiter($SESSION_CACHE_LIMITER);
}else {
    @session_cache_limiter("no-cache, must-revalidate");
}
*/  
session_start();

주의할 점은 session_start() 부분을 ini_set 아래에 사용해야 하며

사용해야 할 페이지로는 session_start() 부분이 들어간 페이지의 첫번째 페이지가 된다.

보통 index 페이지에서 사용하면 되긴 하는데 관리자페이지 등 session 체크하는 로직을 넣은 경우

session 체크하는 로직이 있는 페이지 상단에 넣어두면 사용자가 어느 url로 첫페이지를 열더라도

세션공유가 된다.
2010/11/06 00:56 2010/11/06 00:56

구글 지메일 (Gmail)의 smtp 서버를 이용하면 외부에서도 공짜로 메일 발송 서버를 구축할 수 있습니다.
CDO(Collaboration Data Objects)를 이용한 asp 구현 소스를 어디서 참고해서 지메일 smtp에 적용해보았습니다.

지메일의 smtp 서버는 smtp.gmail.com, 포트는 465 입니다.
테스트해보니 잘되네요. 다른 언어로 구현하더라도 어려울 건 없겠죠? ^-^

<%
Function GoogleSendMail(strTo, strFrom, strSubject, strBody)
On Error Resume Next

Set iMsg = CreateObject("CDO.Message")
Set iConf = CreateObject("CDO.Configuration")
Set Flds = iConf.Fields

schema = "http://schemas.microsoft.com/cdo/configuration/"
Flds.Item(schema & "sendusing") = 2
Flds.Item(schema & "smtpaccountname") = "홍길동 <홍길동@gmail.com>"
Flds.Item(schema & "sendemailaddress") = "홍길동 <홍길동@gmail.com>"
Flds.Item(schema & "smtpuserreplyemailaddress") = "홍길동 <홍길동@gmail.com>"
Flds.Item(schema & "smtpserver") = "smtp.gmail.com"
Flds.Item(schema & "smtpserverport") = 465
Flds.Item(schema & "smtpauthenticate") = 1
Flds.Item(schema & "sendusername") = "홍길동@gmail.com"
Flds.Item(schema & "sendpassword") = "메일암호"
Flds.Item(schema & "smtpusessl") = 1
Flds.Update

Set Flds = Nothing
Set iMsg =  Server.CreateObject("CDO.Message")
With iMsg
  .Configuration = iConf
  .To       = strTo                 ' 받는넘
  .From     = strFrom            ' 보내는넘
  .Subject  = strSubject         ' 제목     
  .HTMLBody = strBody        ' 내용
  SendEmailGmail = .Send
End With

set iMsg = nothing
set iConf = nothing
set Flds = nothing

If Err.number <> 0 Then
  GoogleSendMail = Err.Description
Else
  GoogleSendMail = 0
End If

End Function
%>

<%
  ' 사용예
  Ret = GoogleSendMail("받은사람 이메일", "홍길동 <홍길동@gmail.com>", "제목이구", "내용이얌") 
%>

2010/10/12 22:47 2010/10/12 22:47
<?
//리눅스에서 리스트 출력 저장 -> aa.txt
//sample
dnature03_member_1218850633.thumb  이런 형태를 member_1218850633.jpg 로 일괄 변환 방법

//폴더에는 약 12135개 파일이 존재함

$row =0;
$fp = fopen ("./aa.txt","r");

for($i=1;$i<12126;$i++){
    $data = fgetcsv ($fp, 5000, ",");

    $num = count ($data);

    $tr1 = explode("_",$data[0]); // 각 _
배열 구분자로 나눔

    if($tr1[1] == "member"){    // member 있는것만 체크

        $tr2 = $tr1[1]."_".$tr1[2];  //첫전째 접두어 떼어냄
        $tr3 =
explode(".",$tr2);    //. 구분자로 다시 나움
        $tr4 =
$tr3[0].".jpg";        // 접미어 변환 -- jpg 로
    //        if($i == 1) echo
$tr4;  exit;  //테스트 출력해봄

        rename($data[0], $tr4);
           
        $row++;


    }

    if($i == 12125) echo "$row 개가
변환되었습니다.";
}

?>
2010/10/01 01:25 2010/10/01 01:25

ASP 암호화 하기

function form_submit() {

  var letters = 'ghijklabvwxyzABCDEFef)_+|<>?:mnQRSTU~!@#$%^VWXYZ`1234567opGHIJKLu./;'+"'"+'[]MNOP890-='+'\\'+'&*("{},cdqrst'+"\n";
  var split = letters.split("");
  var num = '';
  var encrypted = '';
 
<%
  if f_jumin = 1 then
%>

  encrypted = '';
  var it = document.ps_user.jumin2.value;
  var c = '';
  var b = '0';
  var chars = it.split("");
  while(b<it.length)
  {c = '0';while(c<letters.length)
  {if(split[c] == chars[b])
  {if(c == "0") { c = ""; }
  if(eval(c+10) >= letters.length){
  num = eval(10-(letters.length-c));
  encrypted += split[num];}
  else{num = eval(c+10);encrypted += split[num];}
  }
  c++;}
  b++;}

  document.ps_user.jumin2.value = encrypted;encrypted = ''; 

<%
  end if
%>

  encrypted = '';
  var c1 = '';
  var it1 = document.ps_user.pin.value;
  var b1 = '0';
  var chars1 = it1.split("");
  while(b1<it1.length){c1 = '0';
  while(c1<letters.length){if(split[c1] == chars1[b1]){if(c1 == "0") { c1 = ""; }if(eval(c1+10) >= letters.length){num = eval(10-(letters.length-c1));
  encrypted += split[num];}else{num = eval(c1+10);encrypted += split[num];}}c1++;}b1++;}document.ps_user.pin.value = encrypted;encrypted = '';

  document.ps_user.submit();
}

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

  var encrypted = '';
  var it = document.ps.pin.value;
  var b = '0';var chars = it.split("");
  while(b<it.length) {
       c = '0';
       while(c<letters.length)
          {if(split[c] == chars[b])
     {if(c == "0") { c = ""; }
     if(eval(c+10) >= letters.length)
      {num = eval(10-(letters.length-c));
      encrypted += split[num];}else{num = eval(c+10);
      encrypted += split[num];}
      }
      c++;
      }
      b++;
      }document.ps.pin.value = encrypted;encrypted = '';
---------------------------------------------------------------------------------------------------------------------

역변환

<script>
function decode_letters(it){

    var letters = 'ghijklabvwxyzABCDEFef)_+|<>?:mnQRSTU~!@#$%^VWXYZ`1234567opGHIJKLu./;'+"'"+'[]MNOP890-='+'\\'+'&*("{},cdqrst'+"\n";

    var split = letters.split("");
    var num = '';
    var c = '';

    var decrypted = '';

    var b = '0';
    var chars = it.split("");
    while(b<it.length){
        c = '0';
        while(c<letters.length){
            if(split[c] == chars[b]){
                if(c == "0") { c = ""; }
                if(eval(c-10) < 0){
                    num = eval(letters.length+(c-10));
                    decrypted += split[num];
                }else{
                    num = eval(c-10);
                    decrypted += split[num];
                }
            }
            c++;
        }
        b++;
    }
 alert(decrypted);
    return decrypted;

}
</script>

2010/09/29 01:48 2010/09/29 01:48
  출처 : http://ncafe.kr/qna.xml
. 파일크기 : 21.39 MB
. 지원 OS : 2003/XP/Vista/2008/7
. 개발환경 : Microsoft Visual Studio C++, asm,cygwin,Python .ETC
. 사용제한 : GNU General Public License (GPL)

. 자료설명 :


Changes with Rwapm 32bit 5.7.4.4(2010.09.11)


Apache 2.2.17-dev (OpenSSL, Zlib , ASM, SVN), ZLIB 1.2.5, PCRE 8.10
mod_korea, mod_bw, mod_evasive, mod_fastcgi, mod_security 2.5.12 etc..
mod_bw, mod_evasive 코드 수정.
OpenSSL 1.0.0a + SEED + ASM
Subversion 1.6.12 (SSL,zlib,Quantify,Sqlite3,Neon enable)
PHP-5.2.14 Patch (APC, eAccelerator, Xdebug, Suhosin)
GD extension: freetype-2.4.2, jpeg-8, libpng-1.2.44, libxpm-3.5.7, t1lib-5.1.2
FreeType, T1Lib, GIF Read, GIF Create, JPG, PNG, WBMP, XPM, XBM,
JIS-mapped Support enabled
Curl-7.21.1, libiconv-1.13, libmcrypt-2.5.8, libxml2-2.7.7,
Sqlite-3.7.2, ZLIB 1.2.5
Sendmail/Smtp (SSL,TLS)
eAccelerator-1.0.0
MYSQL 5.1.50(MYSQLI 5.1.50)
GeoIP Webalizer2.21-02 (Korean Lang Patch) 코드 수정


RWAPM X-Server 간단 소개:
RWAPM은 윈도우 환경에서 간단히 서버를 운영할 수 있도록 Apache,Php,Mysql등을 모아놓은 패키지 형태의 프로그램입니다.
최신의 Apache2.2를 사용해 Apache1에 비해 윈도우에서 월등한 성능을 보여줍니다.
또한 RWAPM은 컴퓨터의 레지스터리를 건들지 않으며,기본적으로 mod_evasive HTTP DoS or DDoS 공격 방어
모듈과 Mod_Security 방화벽이 설정되어 있습니다.
2010/09/26 23:36 2010/09/26 23:36
<script>
<!--
function resize_frame(obj) {
    var obj_document = obj.contentWindow.document;
    if(obj_document.height) {
        obj.style.height = obj_document.height;
        obj.style.width = obj_document.width;
    } else {
        obj.style.height = obj_document.body.scrollHeight;
        obj.style.width = obj_document.body.scrollWidth;
    }
}
//-->
</script>

위에다가 살포시 복사해서 붙여 넣으시고
onload='resize_frame(this)' 추가 하시면 됩니다.

예제 코드 ex)
<iframe src="" frameborder=0 scrolling="no" onload='resize_frame(this)'></iframe>
2010/09/26 23:34 2010/09/26 23:34
우연히 다음 실시간 순위 XML을 필요로 해서 만들게 되었습니다.
올만에 글을 쓰기는 하네요..피식.
필요하신분.....ㅋㅋ 조심히 쓰세요.....

======================================================
Header("Content-type: text/xml; charset=UTF-8");
$fp = fopen("http://img.search.daum-img.net/jumpkeyword/tot.js","r");            
while(!feof($fp)) {                
    $data=fread($fp,2048);
    $text = iconv("CP949","UTF-8",$data);                    
    preg_match_all("/K:\"(.*?)\r\n/i",$text,$matches);
    for($i=0;$i<=sizeof($matches[0]);$i++) {
        $cno = $matches[0][$i];
        $cno = str_replace("K:\"","",$cno);
        $cno = str_replace("\"","",$cno);
        $cno = str_replace(",","",$cno);
        $cno = str_replace("\r\n","",$cno);
        $cno = trim($cno);
        $chart[$i] = $cno;
    }
}
fclose($fp);

$xml = '<?xml version="1.0" encoding="UTF-8" ?>';
$xml .= '<root>';
for($i=0;$i<$chart_cnt;$i++) {
    $xml .= "<cno><![CDATA[{$chart[$i]}]]></cno>";
}
$xml .= '</root>';    
echo $xml;
======================================================

Link1 http://banner.adget.co.kr/_mkXML/webseach.xml.php?fs=daum
Link2 http://banner.adget.co.kr/_mkXML/webseach.xml.php?fs=naver
2010/09/26 23:31 2010/09/26 23:31
예전에 만든거 좀더 보안해서
그냥 추가적으로 작성한 내역 공유해 드립니다.
참고항목으로 `네이버 코드` 부분이 있는데
이 부분은 네이버 openAPI 사용시 코드를 발급하셔야 합니다.
1개의 코드에 보낼수 있는 쿼리양이 정해져있어서 그부분을 해결해보고자
코드 2~3개 를 추가발급받으신후 등록하면 무리없으실거에요.

그리고 저번에 정규식 부분에 대해
`\r\n` 로 한건 해당 입력부분안에 대한 내용물중에 , 부분도 있을 경우를 대비한겁니다.
참고로......허접해도....자비좀 부탁드려요..^^

<?

    //################ MB- SKM - 쿠레이지쌩 ###################
    Header("Content-type: text/xml; charset=UTF-8");
    //Header("Content-type: text/html; charset=UTF-8");
    $chart_cnt = 10;
    switch($_GET["fs"]) {
        case "daum" :    
            $fp = fopen("http://img.search.daum-img.net/jumpkeyword/tot.js","r");            
            while(!feof($fp)) {                
                $data=fread($fp,2048);
                $text = iconv("CP949","UTF-8",$data);
                $chart = load_Daum($chart, $text,"K","K");            // 타이틀        
                $chart = load_Daum($chart, $text,"S","S");         // 아이콘설정                
                $chart = load_Daum($chart, $text,"V","V");            // 등업                
            }
            fclose($fp);
            break;        
        default :
            //##################################### 기본 naver
            $chart    = load_Naver("nexearch",10);                         
            //##################################### 기본 naver
            break;
    }
    //print_r($chart);    
    $xml = '<?xml version="1.0" encoding="UTF-8" ?>';
    $xml .= '<root>';
    for($i=0;$i<$chart_cnt;$i++) {
        if(!empty($chart[$i]["K"])) {
            switch($chart[$i]["S"]) {
                case "n"    : $chart_S="http://www.adget.co.kr/_global/_img/chart/new.png";        break;
                case "+"    : $chart_S="http://www.adget.co.kr/_global/_img/chart/up.png";        break;
                case "-"    : $chart_S="http://www.adget.co.kr/_global/_img/chart/down.png";         break;                    
                default    : $chart_S="http://www.adget.co.kr/_global/_img/chart/none.png";        break;
            }
            $xml    .= "<chart>";
            $xml    .= "    <K><![CDATA[".$chart[$i]["K"]."]]></K>";
            $xml    .= "    <S><![CDATA[".$chart_S."]]></S>";
            $xml    .= "    <V><![CDATA[".$chart[$i]["V"]."]]></V>";
            $xml    .= "</chart>";        
        }
    }
    $xml .= '</root>';        
    echo $xml;

//#################################################### 다음용
    function load_Daum($chart, $value,$str,$avalue) {
        preg_match_all("/{$str}:\"(.*?)\r\n/i",$value,$matches);
        for($i=0;$i<sizeof($matches[0]);$i++) {
            $value = $matches[0][$i];                    
            $value = str_replace("{$str}:\"","",$value);
            $value = str_replace("\"","",$value);
            $value = str_replace(",","",$value);
            $value = str_replace("\r\n","",$value);
            $value = trim($value);
            if($str=="S") {
                switch($value) {
                    case "new"    : $value="n";        break;
                    case "++"    : $value="+";        break;
                    case "--"    : $value="-";        break;                    
                    default        : $value="";            break;
                }
            }
            $chart[$i][$avalue] = $value;
        }        
        return $chart;
    }
//#################################################### 다음용

//#################################################### 네이버 API
    function load_Naver($query,$cnt) {                
        $err = "";
        $naver_key = array(
            "네이버 코드1",
            "네이버 코드2",
            "네이버 코드3",
            "네이버 코드4",
            "네이버 코드5");                
        $key = array_rand($naver_key);
        $xmlURL     = "http://openapi.naver.com/search?key={$naver_key[$key]}&query={$query}&target=rank";
        $xmlView = simplexml_load_file($xmlURL);
        for($i=1;$i<=$cnt;$i++) {
            $K     = $xmlView->item->{"R{$i}"}->K;
            $S     = $xmlView->item->{"R{$i}"}->S;
            $V     = $xmlView->item->{"R{$i}"}->V;
            
            switch($S) {
                case "new"    : $S="n";        break;
                case "+"        : $S="+";        break;
                case "-"        : $S="-";        break;                    
                default        : $S="";            break;
            }
            
            if(empty($K) || empty($S) || empty($V))    { $err = "Y"; break; }
            else {
                $chart[] = array(
                    "K"     => $K,
                    "S" => $S,
                    "V"     => $V,
                );
            }
        }
        if($err == "Y" ) $chart = load_Naver($query,$cnt);    
        return $chart;
    }    

    /* load_Naver( A, B );
        // A 입력값
        nexearch    : 통합검색
        cafe            : 카페검색
        blog            : 블로그 검색
        dic                : 사전검색
        image            : 이미지검색
        kin                : 지식iN검색
        music            : 음악검색
        video            : 동영상검색
        webkr            : 웹문서검색
        site            : 사이트검색
        news            : 뉴스검색
        // B 입력값 ( 노출갯수 )
    */
//#################################################### 네이버 API
?>
2010/09/26 23:30 2010/09/26 23:30
예전에 만든거 좀더 보안해서
그냥 추가적으로 작성한 내역 공유해 드립니다.
참고항목으로 `네이버 코드` 부분이 있는데
이 부분은 네이버 openAPI 사용시 코드를 발급하셔야 합니다.
1개의 코드에 보낼수 있는 쿼리양이 정해져있어서 그부분을 해결해보고자
코드 2~3개 를 추가발급받으신후 등록하면 무리없으실거에요.

그리고 저번에 정규식 부분에 대해
`\r\n` 로 한건 해당 입력부분안에 대한 내용물중에 , 부분도 있을 경우를 대비한겁니다.
참고로......허접해도....자비좀 부탁드려요..^^

<?

    //################ MB- SKM - 쿠레이지쌩 ###################
    Header("Content-type: text/xml; charset=UTF-8");
    //Header("Content-type: text/html; charset=UTF-8");
    $chart_cnt = 10;
    switch($_GET["fs"]) {
        case "daum" :    
            $fp = fopen("http://img.search.daum-img.net/jumpkeyword/tot.js","r");            
            while(!feof($fp)) {                
                $data=fread($fp,2048);
                $text = iconv("CP949","UTF-8",$data);
                $chart = load_Daum($chart, $text,"K","K");            // 타이틀        
                $chart = load_Daum($chart, $text,"S","S");         // 아이콘설정                
                $chart = load_Daum($chart, $text,"V","V");            // 등업                
            }
            fclose($fp);
            break;        
        default :
            //##################################### 기본 naver
            $chart    = load_Naver("nexearch",10);                         
            //##################################### 기본 naver
            break;
    }
    //print_r($chart);    
    $xml = '<?xml version="1.0" encoding="UTF-8" ?>';
    $xml .= '<root>';
    for($i=0;$i<$chart_cnt;$i++) {
        if(!empty($chart[$i]["K"])) {
            switch($chart[$i]["S"]) {
                case "n"    : $chart_S="http://www.adget.co.kr/_global/_img/chart/new.png";        break;
                case "+"    : $chart_S="http://www.adget.co.kr/_global/_img/chart/up.png";        break;
                case "-"    : $chart_S="http://www.adget.co.kr/_global/_img/chart/down.png";         break;                    
                default    : $chart_S="http://www.adget.co.kr/_global/_img/chart/none.png";        break;
            }
            $xml    .= "<chart>";
            $xml    .= "    <K><![CDATA[".$chart[$i]["K"]."]]></K>";
            $xml    .= "    <S><![CDATA[".$chart_S."]]></S>";
            $xml    .= "    <V><![CDATA[".$chart[$i]["V"]."]]></V>";
            $xml    .= "</chart>";        
        }
    }
    $xml .= '</root>';        
    echo $xml;

//#################################################### 다음용
    function load_Daum($chart, $value,$str,$avalue) {
        preg_match_all("/{$str}:\"(.*?)\r\n/i",$value,$matches);
        for($i=0;$i<sizeof($matches[0]);$i++) {
            $value = $matches[0][$i];                    
            $value = str_replace("{$str}:\"","",$value);
            $value = str_replace("\"","",$value);
            $value = str_replace(",","",$value);
            $value = str_replace("\r\n","",$value);
            $value = trim($value);
            if($str=="S") {
                switch($value) {
                    case "new"    : $value="n";        break;
                    case "++"    : $value="+";        break;
                    case "--"    : $value="-";        break;                    
                    default        : $value="";            break;
                }
            }
            $chart[$i][$avalue] = $value;
        }        
        return $chart;
    }
//#################################################### 다음용

//#################################################### 네이버 API
    function load_Naver($query,$cnt) {                
        $err = "";
        $naver_key = array(
            "네이버 코드1",
            "네이버 코드2",
            "네이버 코드3",
            "네이버 코드4",
            "네이버 코드5");                
        $key = array_rand($naver_key);
        $xmlURL     = "http://openapi.naver.com/search?key={$naver_key[$key]}&query={$query}&target=rank";
        $xmlView = simplexml_load_file($xmlURL);
        for($i=1;$i<=$cnt;$i++) {
            $K     = $xmlView->item->{"R{$i}"}->K;
            $S     = $xmlView->item->{"R{$i}"}->S;
            $V     = $xmlView->item->{"R{$i}"}->V;
            
            switch($S) {
                case "new"    : $S="n";        break;
                case "+"        : $S="+";        break;
                case "-"        : $S="-";        break;                    
                default        : $S="";            break;
            }
            
            if(empty($K) || empty($S) || empty($V))    { $err = "Y"; break; }
            else {
                $chart[] = array(
                    "K"     => $K,
                    "S" => $S,
                    "V"     => $V,
                );
            }
        }
        if($err == "Y" ) $chart = load_Naver($query,$cnt);    
        return $chart;
    }    

    /* load_Naver( A, B );
        // A 입력값
        nexearch    : 통합검색
        cafe            : 카페검색
        blog            : 블로그 검색
        dic                : 사전검색
        image            : 이미지검색
        kin                : 지식iN검색
        music            : 음악검색
        video            : 동영상검색
        webkr            : 웹문서검색
        site            : 사이트검색
        news            : 뉴스검색
        // B 입력값 ( 노출갯수 )
    */
//#################################################### 네이버 API
?>
2010/09/26 23:30 2010/09/26 23:30
JPEG의 이미지 metadata 정보를 얻어오는 클래스 라이브러리 입니다.
PHP에서 제공하는 exif관련 함수를 전혀 사용하지 않고 hexData를 분석하여 추출해 내므로 별도의 EXIF 관련 외부 라이브러리를 설치하지 않으셔도 이용하실 수 있습니다.





사용하는 법은 아래와 같습니다.

<?php
$exif = new exif('image.jpg');

print_r($exif ->getImageInfo());
?>

exif::exif() 함수로 읽어올 이미지 파일을 설정한후
exif::getImageInfo() 함수로 해당 이미지의 EXIF 및 기타 모든 정보를 리턴받습니다.




- 클래스 설명
- exif class
*exif::exif("(string)파일경로", "(string)언어설정(en|ko)", "(boolen)디버그 정보 출력여부");
*exif::getImageInfo(void);


라이센스는 기본 MIT 을 따릅니다.
Copyright (c) 2010 M_FireFox

Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without
restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following
conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.



ASP 용도 있습니다. ..

http://www.spaz.com/mr/work/aspexiffuncs/
2010/09/26 23:27 2010/09/26 23:27
유용한 웹 페이지가 있을때. 주소가 너무 길어 불편한적이 있었습니다.

이 사이트를 활용 한다면. 해결 될거라 생각합니다.

http://spedr.com/

http://tinyurl.com/


http://spedr.com/
2010/09/20 00:00 2010/09/20 00:00
아파치 웹서버 사용시 무단 링크 방지법

현재 접속한 도메인을 체크해서 서버 관리자가 정해준 도메인명과 일치했을 경우, 링크를 허용하는 방법입니다.

아파치 웹서버 환경설정 파일인 "httpd.conf" 파일을 수정해 주시고 리로드 해주십시오.


비슷한 방법으로 쿠키를 사용하는 것입니다.

다음의 설정내용을 httpd.conf에 명시하면 해당 쿠키값이 존재하지 않을경우 퍼미션을 허가하지 않는다.
이외에도 User-Agent 또는 Referer등을 체크하여 링크를 막을 수 도 있다.

SetEnvIf 모듈을 사용하여 httpd.conf 에 설정한다.
(웹서버에 요청이 들어올때 쿠키값으로 check 쿠키변수에 ok라는 값이 들어오면 true를 세팅한다.)

아파치에서 쿠키값을 가지고 있는 요청만을 처리하도록 하면 됨..
보통 버추얼 호스트나 웹 디렉토리 설정에서 allow 또는 deny 설정하는데, 아래와 같이 하면 쿠키값이 있는 요청만을 처리한다.

2010/09/02 18:25 2010/09/02 18:25
ping 응답하지않게 하기

어떤 서버로 핑을 하면 응답을 하지 않습니다.


반대로 다시 할려고 하면은 위에서 echo 1을 echo 0으루 함 됩니다.
2010/09/02 18:25 2010/09/02 18:25
핑을 써보면 핑을 쏜 서버의 운영체제를 알수 있습니다.

윈도우 계열



유닉스 계열


제가 핑을 쏘아 봤습니다.
34번의 경우는 윈도우 계열의 서버
32번은 리눅스 서버입니다.

어떻게 구별 할 수 있냐하면 ... 바로 TTL (Time To Live)

ttl 값이 255 는 유닉스 계열
ttl 값이 128 은 윈도우 계열입니다.
ttl값은 라우터를 하나 지날때 마다 1씩 감소 합니다.
그러므로 ttl값이 100번때이면 윈도우 계열
ttl값이 200번때면 유닉스 계열 이겠지요!
그럼 다음 서버에 한번 핑을 쏘야 봅시다.

다음


ttl값이 247인것 으로 보아 유닉스 계열 이겠지요!
아마 프리비나 리눅스를 쓰는 것 같군요!
2010/09/02 18:24 2010/09/02 18:24