Cygwin을 설치했다면, 윈도 시작메뉴의 Cygwin 이라는 곳에, 다음과 같은 '바로가기 파일'들이 있습니다:
Cygwin FAQ
Cygwin User's Guide
User's Guide (One file)
User's Guide (PDF)
User's Guide (PDF) 인, \cygwin\usr\share\doc\cygwin-doc-1.4\cygwin-ug-net.pdf <- 이 파일이 읽기에 편했습니다.
GUI 저리가라!! 강력한커맨드 FTP - NCFTP !! [중급]
안녕하세요... 오늘 강좌할 내용은 커맨드라인 ftp프로그램인 ncftp입니다.
이프로그램은 원래 리/유닉스용으로 만들어진것입니다.
하지만 윈도우에는 포식스(POSIX)기반 프로그램을 실행할수가 있답니다.
그래서 유닉스의 명령어를 포팅할수가 있습니다...
윈도우의 기본 ftp인 ftp.exe는 말그대로 기초적인것만 제공합니다. 하지만
ncftp프로그램은 윈도우의 GUI기반의 FTP프로그램이 가진 기능 거의 모두를
지원하고 있습니다.... 이에따라 커맨드 명령이 몇개더 늘어낫지만,
천천히 시간을 두고 하나씩 배워가시게 되면 나중에 리눅스/유닉스를 공부
할때에도 별다른 어려움없이 ncftp를 사용하실수가 있습니다....
이전에도 말한바가 있었지만, 윈도우에서도 사용하면서 유닉스에서도
사용할수있는 프로그램을 배워두시면 어떤 운영체제에서도 당황함이 없이
자신이 할려는 작업을 할수가 있습니다... 이점을 생각해두시고 공부하시기
바랍니다......
ncftp프로그램의 전체적인 설명은 하지 못하였습니다만, 아래에 설명하는
명령어만 익히셔도 사용에는 지장이 없습니다.....!!!
원래는 매뉴얼로 제작할려고 하였으나, 너무 졸작이 되는것 같아서 이에
그림없이 강좌를 합니다. 이점 양해해주시면 감사하겠습니다..
먼저 프로그램의 홈페이지는 http://www.ncftp.com 입니다.
Download에 가셔서 win32용으로 설치하시면 됩니다..
아니면 여기!!
를 눌러서 설치하시기 바랍니다.
--------------------------------------------------------------------------------
이름
NCFTP.EXE
NcFTP – 파일전송프로토콜용 검색프로그램
사용법
ncftp [ 호스트명 ]
ncftp [ ftp://호스트명/폴더명/ ]
설명
ncftp프로그램은 인터넷 표준 유틸리티인 ftp 프로그램과 100%호환된다.
또한, ncftp프로그램은 강력하고 유연한 명령어를 지원하고 있다.
ncftp프로그램은 커맨드라인 프로그램이다. 현재 그래픽환경의 프로그램이
지원하는 기능이상의 기능을 지원하고 있다.
파일명 자동완성기능
커맨드라인 에디팅
백그라운드 처리
자동이어받기 기능
즐겨찾기 기능
디렉토리 캐싱 기능
호스트 재접속 기능
방화벽, 프락시 작업
전체디렉토리 다운로드 기능
등등.. 수많은 기능을 지원하고 있다. 위의 기능들은 대표적인것일
뿐이다.
또한 표준 ftp명령어를 완벽히 지원하고 있다.
옵션
커맨드라인에서의 호스트명과 디렉토리의 URL을 지원한다
커맨드창을 열고 ncftp [ 호스트명 | 호스트명/디렉토리 ] 의
방식으로 사용할 수가 있다.
아래와 같은 옵션을 지원한다.
-u xx : 사용자명을 지정하게 된다.(기본값:anonymous)
-p xx : 사용자명에 따른 비밀번호를 지정한다.
-P xx : 포트번호를 지정한다.(기본값:21번)
ncftp –u kpj666 –p 1234 –P 2100 ftp.bora.net
위와 같은 명령은 ftp.bora.net이란 서버에 사용자계정 kpj666과
비밀번호 1234와 서버의 포트번호 2100 으로 접속하는 경우이다.
중요한 것은 –u –p –P 옵션이 먼저 적은후에 서버명이 온다는것이다.
Ncftp ftp.bora.net 과 같이 입력하게 되면 기본값인
Anonymous / Email주소 가 자동으로 입력되게 된다.
커맨드 쉘의 소개
지금부터의 설명은 옵션이 없는 상태에서 단지 ncftp만 실행하였을경우
사용법을 간단히 설명한후에 명령어 의 전체적인 설명을 하겠다.
상대방의 컴퓨터에 접속하여서 자신의 컴퓨터로 파일전송을 하기 위해서
먼저 상대방의 서버에 접속하려면 상대방의 IP번호 또는 도메인이름을
사용하게 된다.
open ftp.bora.net (도메인명으로 사용)
open 129.93.33.24 (IP번호 사용)
IP번호로의 접속은 정적IP에만 유효하다. 도메인으로의 접속은
매번 같은 이름으로 접속가능하게 된다.
상대방의 서버에 접속하게 되면 권한이 필요하게 된다. FTP프로토콜은
상당히 간단한 방식으로 계정을 확인하게 된다.
사용자 계정 / 계정에 따른 비밀번호
하지만 대부분의 서버들은 이러한 계정/비밀번호가 없이도 사용가능한
공개용 계정/비밀번호가 존재한다.
Anonymous / 이메일주소
ftp / ftp
위와 같은 방식으로 접속할수 있고 이런계정으로 접속하는 서버를
공섭이라고 부른다. (Public Server)
이메일주소에서는 @문자만 검사하므로 반드시 실제 이메일주소일
필요는 없다. a@a.c 라고 해서도 지장이 없다.
이러한 공개섭들에서는 대부분 읽기만 허용해놓은경우가 대부분이다.
읽기권한은 곧 다운로드만 가능하다는 뜻이다. 해당 서버의 관리자가
설정하기 나름이다.
Open 명령어로 상대방의 서버에 접속이 되었으면, 서버의 현재 디렉토리를
보여주는 명령어 ls 또는 dir 을 입력해서 서버의 디렉토리를 확인한다.
서버에서의 디렉토리 이동은 cd 명령어로서 사용하게 된다.
서버에서 자신의 컴퓨터로 파일을 다운로드 할려면 get 파일명 과 같은
명령어를 사용하게 된다.
get README.txt
ncftp프로그램은 파일전송상황을 화면에 표시하게 된다.파일전송이 완료된후에 다른 명령어를 입력할수 있게 된다.
자신의 컴퓨터에 존재하는 파일을 서버에 업로드 할려면 put 파일명 과
같은 명령어를 사용하게된다.
put something.tar
더 이상의 작업이 필요없을 경우에는 quit 명령을 입력하여 ncftp를 종료
하게 된다. Ncftp를 종료하게 전에 현재 연결상태(서버명/계정/비밀번호..)를
저장할경우에는 bookmark 명령을 사용하게 된다.
Bookmark boranet
또한 북마크해둔 이름으로 접속할수있다.
Ncftp boranet 과 같이 하게되면 마지막상태로 접속하게된다.
명령어 레퍼런스
커맨드쉘상태에서 (접속된상태) 입력하게 된다.
help
현재 버전에서 지원하는 명령어를 표시하게된다.
Help 명령어 와 같이 입력하게 되면 해당명령어의 문법과
간단한 설명을 표시하게 된다.
Ex) help open
ascii
파일전송시에 전송모드를 ascii모드(텍스트모드)로 변경한다.
도스 to 유닉스간의 텍스트파일전송시에 유용하게 사용된다.
보통의 ftp들은 기본값이 ascii이지만 ncftp의 경우는 기본값이
binary 로 셋팅되어 있다.
Ex) ascii
bgget, bgput
이들 명령어들은 get명령과 put명령어들과 사용법이 같다.
하지만 작업처리를 후면처리(백그라운드)로 하게 된다.
후면처리로 업/다운로드 작업을 주게되면 다른작업을 할 수가
있게된다. 보통의 get/put명령어는 이들 명령이 완료될때까지
입력을 할 수가 없지만 bgget/bgput명령어는 곧바로 다른
명령을 입력할 수가 있게 된다.
다운로드/업로드작업을 하면서 서버를 탐색할수도 있는것이다.
Ncftp의 강력한 기능중 하나이다.
bgget / bgput 명령어는 전송스케쥴링을 지원한다.
-@ 문자뒤에 YYYYMMDDhhmmss 와같이 시간을 지정할수있다.
2001년 12월 20일 새벽2시정각에 파일을 다운로드할려면,
bgget -@ 20011220020000 /pub/kpj666/test.zip
위와 같이 기입하게 되면 된다.
binary
전송방식을 이진수방식에 맞게끔 세팅하게 된다.ncftp의 기본값이다.
일반적인 ftp의 기본값은 ascii이다.
bookmark
현재 세션을 저장하고 나중에 재사용할 수가 있다. 원격서버의
각종 설정값을 모두 기억하게 된다.
Ex) bookmark test
bookmarks
현재 저장되어있는 북마크(즐겨찾기)를 사람이 이해할 수 있는 문자로
리스팅해준다. 전체설치를 하였다면 GUI환경이 나타나게 된다.
즐겨찾기 관리툴이라고 생각하면 된다.
cat
유닉스의 cat툴과 유사하다. 원격파일에만 사용가능하다.
다운로드받은 파일을 화면에 덤프하는 명령어이다. 파일의 내용을
볼려고 할 때 주로 사용하게 된다.
Ex) cat Readme.txt
cd
원격서버의 디렉토리를 변경하는 명령어이다
cd pub
cd news
cd comp.sources.d
위와 같은 명령은 아래와 같이 한번에 할수 있다.
cd /pub/news/comp.sources.d
또한 마지막 디렉토리로 이동하는 명령어도 존재한다.
cd –
chmod
유닉스의 chmod툴과 동일하다. 원격서버의 파일의 퍼미션을
수정하는 명령어이다. 물론 수정할 권한이 있어야 한다.
close
원격서버에 접속을 끊는다.
debug
내부테스트용 명령어이다. 디버깅모드라는 것이 존재한다.
서버의 모든메세지를 화면 혹은 파일에 저장하는 명령어이다.
서버의 작동원리를 알고자 할 때 사용하며 , 서버의 오작동
유무도 파악할 수가 있다.
dir
유닉스의 ls –l 과 같은 효과를 내는 리스팅 명령어이다.
도스사용자를 위한 명령어이다. Ls와 같은 명령어이다.
get
원격서버의 현재 디렉토리에서 로컬컴퓨터의 현재 디렉토리로 다운로드 하는 명령어이다.
Ex) get Readme.txt
파일명을 공백으로 분리해서 여러 개를 줄수 있다.
Ex) get Readme.txt test.bin document.doc
또한 와일드카드문자를 사용할수도 있다.
Ex) get Read*
-z 플래그와 사용하게 되면 원격파일을 다운로드할 때 로컬컴퓨터에 다른파일명으로 저장할수도 있다.
Ex) get –z Readme.txt README
자동이어받기기능은 기본값으로 세팅되어있다. 이어받기기능은 물론
서버에서 지원해야 사용가능하다. 200메가 파일을 다운로드중에
100메가다운로드 중에 끊어졌다면 get명령은 다시 100메가부터
다운로드를 하게 된다.
기존에 존재하는 파일에 추가할려면 –A 플래그와 사용하게 된다.
get -A log.11
위의 명령은 로컬컴퓨터에 log.11파일이 존재하면 추가하게된다.
get –DD
위의 명령은 서버파일을 다운로드후에 삭제하는 플래그이다.
Get –R
위의 명령은 서브트리를 포함하는 모든 디렉토리를 다운로드하게된다.
jobs
후면작업으로 처리되는 작업리스트를 보여주게된다. 유닉스의 jobs
명령과 동일하다.
lcd
lcd 명령에서 처음문자인 l 은 local을 뜻한다. 즉 현재 로컬컴퓨터의
디렉토리를 이동하게 한다.
get,put명령들은 현재 로컬디렉토리를 기준으로 하기 때문에 로컬디렉토리를 이동할경우 사용하는 명령어이다.
lchmod
로컬컴퓨터의 파일의 퍼미션을 수정하는 명령어이다.
lls
로컬컴퓨터의 리스팅 명령어이다.
lmkdir
로컬컴퓨터의 디렉토리 생성시에 사용하는 명령어이다.
lookup
ncftp의 내장된 lookup명령어이다. 즉 인터넷의 이름풀기서버인
DNS서버를 질의 하는 명령어이다.
Ex) lookup openserver.co.kr
lpwd
로컬컴퓨터의 현재 작업디렉토리를 표시하게 된다.
lrename
로컬컴퓨터의 파일명을 변경하는 명령어이다.
유닉스의 mv 명령어와 동일하게 사용된다.
lrm
로컬컴퓨터의 파일을 삭제하는 명령어이다.
유닉스의 rm과 동일하게 사용된다.
lrmdir
로컬컴퓨터의 디렉토리를 삭제하는 명령어이다.
유닉스의 rmdir과 동일한 명령어이다.
ls
원격서버의 디렉토리 리스팅 명령어이다. 유닉스의 ls –CF와 동일하게 리스팅하게 된다.
ls –rt 명령은 유닉스 시스템에서는 ls –CFrt 와 같이 된다.
Ncftp는 디렉토리 리스팅시에 디렉토리 캐시를 지원한다.
디렉토리 캐시는 작업속도를 빠르게 만들어주게 된다.
mkdir
원격서버에 디렉토리를 생성하는 명령어이다.
open
원격서버에 접속하는 명령어이다. 원격서버에 anonymous로 접속을
시도 하게 된다. 계정으로 접속하기를 원할경우에는 여러 플래그를
사용하게 된다.
-u Anonymous 대신에 계정을 사용하게 된다.
-p 계저에 따른 패스워드를 지정하게 된다.
-P 기본포트인 21번포트이외의 포트번호를 지정한다
page
원격서버의 파일의 내용을 화면에 페이지단위로 표시한다.
put
로컬파일을 원격서버에 복사하는 명령이다.(업로드)
put xx.zip yy.zip
위의 명령은 로컬파일인 xx.zip을 서버에 yy.zip파일로 업로드한다.
put *.zip
위의 명령은 로컬파일중 모든 zip파일을 서버에 업로드 한다.
put -z kpj666 KPJ666.ZIP
위의 명령은 로컬파일인 kpj666 이란 파일을 서버에 KPJ666.ZIP파일로 업로드 하는 명령이다.
put명령은 위에서 기술한 get명령의 플래그들과 동일하게 작업한다.
pwd
원격서버의 현재 작업디렉토리를 표시하는 명령어이다.
quit
ncftp프로그램을 종료하는 명령어이다.
quote
FTP서버의 명령을 전송하는 명령어이다. 클라이언트명령이 아닌
서버의 명령을 전송하게된다.
rename
원격서버의 파일명을 변경하는 명령어이다.
rhelp
원격서버의 명령어의 도움말을 볼수 있게 하는 명령어이다.
rhelp NLST
위의 명령은 서버의 NLST란 명령어의 도움말을 표시하라는 명령이다.
Syntax: NLST [ path-name ]
이에 위와 같은 응답을 하게 된다.
rm
원격서버의 파일을 삭제하는 명령이다. 삭제 권한이 있을경우에만
사용가능하다.
rmdir
원격서버의 디렉토리를 삭제하는 명령어이다. Ncftp의 rmdir명령은
원격서버의 디렉토리가 비록 비어있지 않더라도 삭제되므로
사용에 주의를 요망한다.
set
ncftp프로그램의 기본값을 세팅할수있게 하는 명령어이다.
set
위와 같은 형식으로 사용하게 된다.예를 들어 anonymous의 비밀번호인 기본이메일주소를 변경하기 위해서는 아래와 같이
입력한다.
set anon-password kpj666@hanmail.net
show
set명령으로 설정할 수 있는 기본값을 표시한다.
Show anon-password 명령 또는 show 명령과 같이 사용한다.
모든값을 표시하려면 show all 과 같이 all옵션을 주면된다.
type
파일전송모드를 변경할 때 사용하는 명령어이다. 아래와같이
3가지의 명령이 존재한다. 각각 텍스트,2진파일,이미지파일전송시에
사용한다.
type ascii = type a
type binary = type b
type image = type i
umask
유닉스의umask와 동일한 명령어이다. 서버에서 지원해야 사용가능
한 명령어이다. umask값이란 디렉토리/파일이 생성될 때 기본
퍼미션을 잡아주는 명령어이다.
version
현재 자신의 시스템에 설치되어있는 ncftp프로그램의 버전정보를
표시한다.
디렉토리명은 TAB 키를 누르게 되면 자동완성 까지 시켜주게 된다.
--------------------------------------------------------------------------------
실제 사용예는 마땅히 표현할것이 없기에.... 생략하였습니다...
ftp를 사용하셨던 분이시라면 충분히 이해하리라 생각합니다.....
그럼 한겨울로 접어드는 날씨에 감기 조심하시구요, 새해에 복 많이 받으세요!!
******************************
****** Make by KPJ666 ******
******************************
[출처] GUI 저리가라!! 강력한커맨드 FTP - NCFTP !! [중급]|작성자 렉스
파일 내용 일괄 변경 기능
- perl을 사용합니다.
- 현재 디렉토리아래의 모든 html 파일안의 "www/zenon" 이라는 문구를 "www/dev/zenon"이라는 문구로 대체
find ./ -name "*.html" -exec perl -pi -e 's/www\/zenon/www\/dev\/zenon/g' {} \;
특정 파일 일괄 관리 기능
find . -name "*.pc" -print | xargs -l {} -t mv {} [옮길 폴더명]
조금 빠른 복사
tar cf - . | ( cd [옮길 폴더명] && tar xBf - )
asp.net 이 아닌 classic asp 용이며,
http://yoursite.com/?action/param1/param2 와 같은 형식의 url 을 분석하여,
Controller 에 등록된 Action Method 를 자동으로 실행해주는 간단한 Framework 입니다
vbscript 와 jscript 를 혼용했으며, mssql 기반의 간단한 Model 을 지원하며
DB 상의 Table 과 1:1 매치하는 Model 을 Table 명만으로 손쉽게 생성할 수 있습니다
js eval기반의 Template 을 지원합니다
WireFrame 이라는 이름이 말해주듯, Table 목록 조회 위주의 간단한 프로토타입 제작용으로 사용가능하며, 실서비스 개발에는 무리가 있습니다
저조차도 진짜 사용할지, 기능개선은 언제가 될지 모르겠습니다만, 오랜만에 재미있게 코딩한 것 같아서, 이곳에 올려둡니다
출처
무료메일서버를 찾는 많은 분들에게 쓸만하다 싶어 소개해 봅니다.
hMail Server는 SMTP, POP3, IMAP을 지원하는 윈도우 서버용 메일서버 이다.
윈도우용 무료 메일서버로 국내에는 알려지지 않은 메일서버이다.
홈페이지 : http://www.hmailserver.com/
다운로드 : http://www.hmailserver.com/?page=download
라이센스 : Freeware
플랫폼 : Windows, MySQL, MS SQL
아래 오픈소스 관련 사이트에서 설치 및 관리에 대한 간단한 설명 페이지를 볼수 있다.
http://www.jopenbusiness.com/mediawiki/index.php/HMail_Server_4.4.1
최신버전 5에서는 한글 지원이 아직 안되니 참고 하세요~.
사내 메일이나 소규모 에이전시등에서 사용한다면 최상의 메일서버가 아닐까 생각해본다.
hMail Server + MySQL + SquirrelMail(다람쥐메일php) 을 설치하면 웹메일도 운영가능하다.
PHP기반 관리자 사이트도 제공하고 있어 웹에서 메일서버 관리도 가능하다.
메일서버 소스 또한 제공하고 있고 메일관리툴이 VB로 제작되어 있다.
VB메일관리툴의 소스를 활용한다면 ASP에서도 관리 가능할것으로 생각된다.
ASP 관리모듈 또는 사이트, ASP 웹메일등 개발해 보면 재미 있지 않을까 생각해 본다.
---------------------------------------------------------------------------------------------
Set xh = CreateObject("MSXML2.ServerXMLHTTP")
xh.Open "GET", img_url, false
xh.Send()
imgData = xh.ResponseBody
Set xh = Nothing
Set stm =CreateObject("ADODB.Stream")
stm.open()
stm.type=1
stm.write imgData
stm.SaveToFile 저장경로&저장할이름, 2
stm.close()
Set stm = Nothing
<?php
###############################################################
# Thumbnail Image Generator 1.23
###############################################################
# Visit http://www.zubrag.com/scripts/ for updates
###############################################################
// REQUIREMENTS:
// PHP 4.0.6 and GD 2.0.1 or later
// May not work with GIFs if GD2 library installed on your server
// does not support GIF functions in full
// Parameters:
// src - path to source image
// dest - path to thumb (where to save it)
// x - max width
// y - max height
// q - quality (applicable only to JPG, 1 to 100, 100 - best)
// t - thumb type. "-1" - same as source, 1 = GIF, 2 = JPG, 3 = PNG
// f - save to file (1) or output to browser (0).
// Sample usage:
// 1. save thumb on server
// http://www.zubrag.com/thumb.php?src=test.jpg&dest=thumb.jpg&x=100&y=50
// 2. output thumb to browser
// http://www.zubrag.com/thumb.php?src=test.jpg&x=50&y=50&f=0
// Below are default values (if parameter is not passed)
// save to file (true) or output to browser (false)
$save_to_file = true;
// quality
$image_quality = 100;
// resulting image type (1 = GIF, 2 = JPG, 3 = PNG)
// enter code of the image type if you want override it
// or set it to -1 to determine automatically
$image_type = -1;
// maximum thumb side size
$max_x = 100;
$max_y = 100;
// Folder where source images are stored (thumbnails will be generated from these images).
// MUST end with slash.
//$images_folder = '/home/images/';
// Folder to save thumbnails, full path from the root folder, MUST end with slash.
// Only needed if you save generated thumbnails on the server.
// Sample for windows: c:/wwwroot/thumbs/
// Sample for unix/linux: /home/site.com/htdocs/thumbs/
//$thumbs_folder = '/home/thumbs/';
///////////////////////////////////////////////////
/////////////// DO NOT EDIT BELOW
///////////////////////////////////////////////////
$to_name = '';
if (isset($_REQUEST['f'])) {
$save_to_file = intval($_REQUEST['f']) == 1;
}
if (isset($_REQUEST['src'])) {
$from_name = urldecode($_REQUEST['src']);
}
else {
die("Source file name must be specified.");
}
if (isset($_REQUEST['dest'])) {
$to_name = urldecode($_REQUEST['dest']);
}
else if ($save_to_file) {
die("Thumbnail file name must be specified.");
}
if (isset($_REQUEST['q'])) {
$image_quality = intval($_REQUEST['q']);
}
if (isset($_REQUEST['t'])) {
$image_type = intval($_REQUEST['t']);
}
if (isset($_REQUEST['x'])) {
$max_x = intval($_REQUEST['x']);
}
if (isset($_REQUEST['y'])) {
$max_y = intval($_REQUEST['y']);
}
// Allocate all necessary memory for the image.
// Special thanks to Alecos for providing the code.
ini_set('memory_limit', '-1');
function SaveImage($type, $im, $filename, $quality, $to_file = true) {
$res = null;
// ImageGIF is not included into some GD2 releases, so it might not work
// output png if gifs are not supported
if(!function_exists('imagegif')) $type = 3;
switch ($type) {
case 1:
if ($to_file) {
$res = ImageGIF($im,$filename);
}
else {
header("Content-type: image/gif");
$res = ImageGIF($im);
}
break;
case 2:
if ($to_file) {
$res = ImageJPEG($im,$filename,$quality);
}
else {
header("Content-type: image/jpeg");
$res = ImageJPEG($im,'',$quality);
}
break;
case 3:
if ($to_file) {
$res = ImagePNG($im,$filename);
}
else {
header("Content-type: image/png");
$res = ImagePNG($im,'',$quality);
}
break;
}
return $res;
}
function ImageCreateFromType($type,$filename) {
$im = null;
switch ($type) {
case 1:
$im = ImageCreateFromGif($filename);
break;
case 2:
$im = ImageCreateFromJpeg($filename);
break;
case 3:
$im = ImageCreateFromPNG($filename);
break;
}
return $im;
}
// generate thumb from image and save it
function GenerateThumbFile($from_name, $to_name, $max_x, $max_y) {
global $save_to_file, $image_type, $image_quality;
// if src is URL then download file first
$temp = false;
if (substr($from_name,0,7) == 'http://') {
$tmpfname = tempnam("tmp/", "TmP-");
$temp = @fopen($tmpfname, "w");
if ($temp) {
@fwrite($temp, @file_get_contents($from_name)) or die("Cannot download image");
@fclose($temp);
$from_name = $tmpfname;
}
else {
die("Cannot create temp file");
}
}
// get source image size (width/height/type)
// orig_img_type 1 = GIF, 2 = JPG, 3 = PNG
list($orig_x, $orig_y, $orig_img_type, $img_sizes) = GetImageSize($from_name);
// should we override thumb image type?
$image_type = ($image_type != -1 ? $image_type : $orig_img_type);
// check for allowed image types
if ($orig_img_type < 1 or $orig_img_type > 3) die("Image type not supported");
if ($orig_x > $max_x or $orig_y > $max_y) {
// resize
$per_x = $orig_x / $max_x;
$per_y = $orig_y / $max_y;
if ($per_y > $per_x) {
$max_x = $orig_x / $per_y;
}
else {
$max_y = $orig_y / $per_x;
}
$max_x = $orig_x;
$max_y = $orig_y;
}
else {
// keep original sizes, i.e. just copy
if ($save_to_file) {
@copy($from_name, $to_name);
}
else {
switch ($image_type) {
case 1:
header("Content-type: image/gif");
readfile($from_name);
break;
case 2:
header("Content-type: image/jpeg");
readfile($from_name);
break;
case 3:
header("Content-type: image/png");
readfile($from_name);
break;
}
}
return;
}
if ($image_type == 1) {
// should use this function for gifs (gifs are palette images)
$ni = imagecreate($max_x, $max_y);
}
else {
// Create a new true color image
$ni = ImageCreateTrueColor($max_x,$max_y);
}
// Fill image with white background (255,255,255)
$white = imagecolorallocate($ni, 255, 255, 255);
imagefilledrectangle( $ni, 0, 0, $max_x, $max_y, $white);
// Create a new image from source file
$im = ImageCreateFromType($orig_img_type,$from_name);
// Copy the palette from one image to another
imagepalettecopy($ni,$im);
// Copy and resize part of an image with resampling
imagecopyresampled(
$ni, $im, // destination, source
0, 0, 0, 0, // dstX, dstY, srcX, srcY
$max_x, $max_y, // dstW, dstH
$orig_x, $orig_y); // srcW, srcH
// save thumb file
SaveImage($image_type, $ni, $to_name, $image_quality, $save_to_file);
if($temp) {
unlink($tmpfname); // this removes the file
}
}
// generate
GenerateThumbFile($images_folder . $from_name, $thumbs_folder. $to_name, $max_x, $max_y);
?>
<?
exit;
function remote_image($urlstr){
$url = parse_url($urlstr);
$domain = str_replace("www.","",$url[host]);
$ext = substr($urlstr,strrpos($urlstr,".") + 1);
$string = "";
$res = fsockopen("$domain", 80, $strErrorNo, $strErrStr, 2);
if($res){
$headerstr = "GET $urlstr HTTP/1.1\r\n";
$headerstr.= "Host:$domain:80\r\n";
$headerstr.= "\r\n";
fputs($res, $headerstr);
while (!feof($res)){
$string.= fgets($res, 1024);
}
fclose($res);
}
if($ext == "gif")
return substr($string,strpos($string,"GIF89a"));
elseif($ext == "jpg" || $ext == "jpeg")
return substr($string,strpos($string,"image/jpeg") + 14);
}
function image_save($file,$string){
$fp = @fopen ($file,'w');
if(!$fp) echo $file;
fwrite ($fp,$string);
fclose ($fp);
}
$col[14] = "http://image.gmarket.co.kr/service_image/2007/05/03/Admin_upload200753_165837.GIF";
$file1 = remote_image($col[14]);
if($file1 && strpos($file1,"Not Found") < 1){
$file_name = substr($col[14],strrpos($col[14],"/")+1);
$file_first = substr($file_name,0,strrpos($file_name,"."));
$file_last = substr($file_name,strrpos($file_name,".") + 1);
$file_newname1 = "$file_first" . rand(100,999) . ".$file_last";
image_save("$DOCUMENT_ROOT/a/$file_newname1",$file1);
}
?>
<?
exit;?>
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
return this.replace(/\s+$/,"");
}
경고: 레지스트리 편집기를 잘못 사용하면 심각한 문제가 발생할 수 있으며 문제를 해결하기 위해 운영 체제를 다시 설치해야 할 수도 있습니다. 필자는 레지스트리 편집기를 잘못 사용함으로써 발생하는 문제에 대해 해결을 보증하지 않습니다. 레지스트리 편집기의 사용에 따른 모든 책임은 사용자에게 있습니다.
HKLMSystemCurrentControlSetServicesTcpipParameters
값 이름: SynAttackProtect
키: TcpipParameters
값 종류: REG_DWORD
유효 범위: 0,1
기본값: 0
이 레지스트리 값은 TCP(Transmission Control Protocol)가 SYN-ACKS의 재전송을 조정하도록 합니다. 이 값을 구성하면 SYN 공격(서비스 거부 공격의 한 종류) 동안 연결 응답이 더 빨리 시간 초과됩니다.
다음 매개 변수는 이 레지스트리 값과 함께 사용할 수 있습니다. ? 0(기본값): SYN 공격에 대한 일반적인 보호를 하려면 SynAttackProtect를 0으로 설정합니다.
1 : SYN 공격에 대하여 보다 높은 수준의 보호를 하려면 SynAttackProtect를 1로 설정합니다. 이 매개 변수는 TCP가 SYN-ACKS의 재전송을 조정하도록 합니다. SynAttackProtect를 1로 설정하는 경우 시스템에서 SYN 공격이 이루어지고 있음을 감지하면 연결 응답이 더 빨리 시간 초과됩니다. Windows는 공격이 진행 중인지 확인하기 위하여 다음 값을 사용합니다.
TcpMaxPortsExhausted
TCPMaxHalfOpen
TCPMaxHalfOpenRetried
값 이름: EnableDeadGWDetect
키: TcpipParameters
값 종류: REG_DWORD
유효 범위: 0, 1(False, True)
기본값: 1(True)
다음은 이 레지스트리 값과 함께 사용할 수 있는 매개 변수입니다. ? 1 : EnableDeadGWDetect를 1로 설정하면 TCP는 더 이상 작동하지 않는 게이트웨이를 검색할 수 있습니다. 더 이상 작동하지 않는 게이트웨이 감지가 사용되면 TCP는 여러 연결에 문제가 발생하는 경우 인터넷 프로토콜(IP)에 백업 게이트웨이를 변경하도록 요청할 수 있습니다. 백업 게이트웨이는 제어판의 네트워크 도구에 있는 TCP/IP 구성 대화 상자의 고급 섹션에서 정의됩니다.
0: EnableDeadGWDetect 값은 0으로 설정하는 것이 좋습니다. 0으로 설정하지 않으면 공격으로 인하여 서버가 강제로 원하지 않는 게이트웨이로 전환될 수 있습니다.
값 이름: EnablePMTUDiscovery
키: TcpipParameters
값 종류: REG_DWORD
유효 범위: 0, 1(False, True)
기본값: 1(True)
다음은 이 레지스트리 값과 함께 사용할 수 있는 매개 변수입니다. ? 1 : EnablePMTUDiscovery를 1로 설정하면 TCP는 최대 전송 단위(MTU)나 원격 호스트 경로에 대한 최대 패킷 크기를 검색하려 합니다. TCP는 경로의 MTU를 검색하고 TCP 세그먼트를 이 크기로 제한하여 경로에 있는 각자 다른 MTU로 네트워크에 연결하는 라우터에서 조각을 제거할 수 있습니다. 조각이 있으면 TCP 처리량에 좋지 않은 영향을 줍니다.
? 0 : EnablePMTUDiscovery는 0으로 설정하는 것이 좋습니다. 이렇게 하면 로컬 서브넷에서 호스트하지 않는 모든 연결에 576바이트의 MTU가 사용됩니다. 이 값을 0으로 설정하지 않으면 공격자가 강제로 MTU를 아주 작은 값으로 설정하여 스택의 부하가 커집니다.
값 이름: KeepAliveTime
키: TcpipParameters
값 종류: REG_DWORD - 시간(밀리초)
유효 범위: 1 - 0xFFFFFFFF
기본값: 7,200,000(2시간)
이 값은 TCP가 Keep Alive 패킷을 보내어 유휴 연결이 열려 있는지 확인하는 빈도를 결정합니다. 연결이 유지되어 있다면 원격 컴퓨터가 Keep-Alive 패킷을 인식합니다. Keep-Alive 패킷은 기본적으로 보내지지 않습니다. 연결에서 이 값을 구성하기 위한 프로그램을 사용할 수 있습니다. 권장값은 300,000(5분)입니다.
값 이름: NoNameReleaseOnDemand
키: NetbtParameters
값 종류: REG_DWORD
유효 범위: 0, 1(False, True)
기본값: 0(False)
이 값은 컴퓨터가 이름 해제 요청을 받을 때 NetBIOS 이름을 해제할지 여부를 결정합니다. 이 값은 관리자가 악의적인 이름 해제 공격으로부터 컴퓨터를 보호할 수 있도록 추가되었습니다. NoNameReleaseOnDemand 값은 1로 설정하는 것이 좋습니다.
DisableIPSourceRouting DWORD 2
IP 원본 라우팅은 데이터그램이 네트워크를 통해 취해야 할 IP 경로를 보낸 사람이 결정할 수 있도록 하는 메커니즘입니다.
보안 문제
공격자는 원본에서 라우팅한 패킷을 사용하여 ID와 위치를 모호하게 만들 수 있습니다.
패킷을 보내는 컴퓨터는 원본 라우팅을 통해 사용할 경로를 지정할 수 있습니다.
이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 0, 1 또는 2, 기본값은 0(원본에서 라우팅한 패킷 확인됨)
TcpMaxConnectResponseRetransmissions DWORD 2
TcpMaxConnectResponseRetransmissions: SYN ? ACK retransmissions when a connection request is not acknowledged
이 항목은 SCE에서 MSS: SYN ? ACK retransmissions when a connection request is not acknowledged로 나타납니다. 이 매개 변수는 중단하기 전에 TCP에서 SYN을 재전송하는 횟수를 결정합니다. 재전송 제한 시간은 지정한 연결 시도에서 재전송이 연속될 때마다 두 배로 증가합니다. 초기 시간 제한 값은 3초입니다.
보안 문제
SYN 대규모 공격에서 공격자는 연속 SYN 패킷 스트림을 서버에 보내고 서버는 무력화되어 더 이상 합법적인 요청에 응답할 수 없을 때까지 부분 공개 연결을 열어 둡니다.
대책
MSS: SYN ? ACK retransmissions when a connection request is not acknowledged의 값을 3 seconds, half?open connections dropped after nine seconds로 구성하십시오.
이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 0?0xFFFFFFFF, 기본값은 2
TcpMaxDataRetransmissions DWORD 3
TcpMaxDataRetransmissions: How many times unacknowledged data is retransmitted (3 recommended, 5 is default)
이 항목은 SCE에서 MSS: How many times unacknowledged data is retransmitted (3 recommended, 5 is default)로 나타납니다. 이 매개 변수는 연결을 중단하기 전에 TCP에서 개별 데이터 세그먼트(연결되지 않은 세그먼트)를 재전송하는 횟수를 결정합니다. 재전송 제한 시간은 연결에서 재전송이 연속될 때마다 두 배로 증가하고 응답이 재개되면 다시 설정됩니다. 기본 제한 시간 값은 연결 시 측정된 Round-Trip Time에 따라 동적으로 결정됩니다.
보안 문제
SYN 대규모 공격에서 공격자는 연속 SYN 패킷 스트림을 서버에 보내고 서버는 무력화되어 더 이상 합법적인 요청에 응답할 수 없을 때까지 부분 공개 연결을 열어 둡니다.
대책
MSS: How many times unacknowledged data is retransmitted (3 recommended, 5 is default)의 값을 3으로 구성하십시오. 이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 0 ~ 0xFFFFFFFF, 기본값은 5
PerformRouterDiscovery DWORD 0
PerformRouterDiscovery: Allow IRDP to detect and configure Default Gateway addresses (could lead to DoS)
이 항목은 SCE에서 MSS: Allow IRDP to detect and configure Default Gateway addresses (could lead to DoS)로 나타납니다. 이 설정은 IRDP(Internet Router Discovery Protocol)의 사용 여부를 설정하는 데 사용됩니다. IRDP를 사용하면 시스템에서 기본 게이트웨이 주소를 자동으로 검색하고 구성할 수 있습니다.
보안 문제
같은 네트워크 세그먼트에서 시스템을 제어하는 공격자는 네트워크에서 컴퓨터가 라우터를 가장하도록 구성할 수 있습니다. 그러면 IRDP를 사용하도록 설정된 다른 컴퓨터에서 이미 손상된 시스템을 통해 트래픽을 라우팅하려고 시도할 수 있습니다.
대책
MSS: Allow IRDP to detect and configure Default Gateway addresses (could lead to DoS)의 값을 사용 안 함으로 구성하십시오.
이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 1 또는 0, 기본값은 0(사용 안 함)
TCPMaxPortsExhausted DWORD 5
TCPMaxPortsExhausted: How many dropped connect requests to initiate SYN attack protection (5 is recommended)
이 항목은 SCE에서 MSS: How many dropped connect requests to initiate SYN attack protection (5 is recommended)으로 나타납니다. 이 매개 변수는 SYN ? ATTACK 보호가 작동하기 시작하는 시점을 결정합니다. 사용 가능한 연결 백로그를 0으로 설정했기 때문에 시스템에서 TcpMaxPortsExhausted 연결 요청을 거부하면 SYN ? ATTACK 보호가 작동하기 시작합니다.
보안 문제
SYN 대규모 공격에서 공격자는 연속 SYN 패킷 스트림을 서버에 보내고 서버는 무력화되어 더 이상 합법적인 요청에 응답할 수 없을 때까지 부분 공개 연결을 열어 둡니다.
대책
MSS: How many dropped connect requests to initiate SYN attack protection (5 is recommended)의 값을 5로 구성하십시오.
이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 0 ~ 0xFFFF, 기본값은 5
AFD 설정:
DynamicBacklogGrowthDelta
EnableDynamicBacklog
MinimumDynamicBacklog
MaximumDynamicBacklog
FTP 서버 및 웹 서버와 같은 Windows 소켓 응용 프로그램의 연결 시도는 Afd.sys에 의해 처리됩니다. Afd.sys는 합법적 클라이언트에 대한 액세스를 거부하지 않고 부분 공개 상태에서 여러 번의 연결을 지원하도록 수정되었습니다.
관리자가 동적 백로그를 구성할 수 있도록 함으로써 이러한 지원이 가능해졌습니다.
DynamicBacklogGrowthDelta는 연결이 더 필요할 때 만들 사용 가능 연결 수를 결정합니다. 값이 크면 free 연결 할당이 폭주할 수 있으므로 이 값을 주의하여 설정하십시오.
SYN 대규모 공격에서 공격자는 연속 SYN 패킷 스트림을 서버에 보내고 서버는 무력화되어 더 이상 합법적인 요청에 응답할 수 없을 때까지 부분 공개 연결을 열어 둡니다.
DisableIPSourceRouting
IP 원본 라우팅은 데이터그램이 네트워크를 통해 취해야 할 IP 경로를 보낸 사람이 결정할 수 있도록 하는 메커니즘입니다. 이 값을 2로 설정하면 원본에서 라우팅한 모든 들어오는 패킷이 삭제됩니다.
공격자는 원본에서 라우팅한 패킷을 사용하여 ID와 위치를 모호하게 만듭니다. 패킷을 보내는 컴퓨터는 원본 라우팅을 통해 취할 경로를 지정할 수 있게 됩니다.
PerformRouterDiscovery
이 매개 변수는 IRDP(Internet Router Discovery Protocol)를 지원하는 Windows 2000이 컴퓨터에서 기본 게이트웨이 주소를 자동으로 검색 및 구성하지 못하도록 하기 위해 설정됩니다.
같은 네트워크 세그먼트에서 시스템을 제어하는 공격자는 네트워크에서 컴퓨터가 라우터를 가장하도록 구성할 수 있습니다.
그러면 IRDP를 사용하도록 설정된 다른 컴퓨터에서 이미 손상된 시스템을 통해 트래픽을 라우팅하려고 시도할 수 있습니다.
자동 실행 사용 안 함: 모든 드라이브에 대해 자동 실행 사용 안 함
이 항목은 SCE에서 MSS: 모든 드라이브에 대해 자동 실행 사용 안 함으로 나타납니다. 자동 실행은 컴퓨터의 드라이브에 미디어가 삽입되는 즉시 읽기를 시작하는 기능입니다. 따라서 프로그램의 설치 파일과 오디오 미디어의 사운드가 즉시 시작됩니다.
다음과 같은 레지스트리 값 항목이 템플릿 파일의 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesExplorer 레지스트리 키에 추가되었습니다.
표 5. 자동 실행을 사용하지 않도록 구성하기 위해 레지스트리에 추가된 설정
하위 키 레지스트리 값 항목 형식 권장 값(10진수)
NoDriveTypeAutoRun
DWORD
0xFF
다음 설정의 값을 1로 설정하여 CD/DVD 자동 실행만 사용할 수 없도록 할 수도 있습니다. 다음과 같은 레지스트리 값 항목이 템플릿 파일의 HKEY_LOCAL_MACHINE SYSTEMCurrentControlSetServicesCdrom 레지스트리 키에 추가되었습니다.
표 6. 자동 실행을 사용하지 않도록 구성하기 위해 레지스트리에 추가할 설정
하위 키 레지스트리 값 항목 형식 권장 값(10진수)
AutoRun
DWORD
0
보안 문제
미디어를 삽입할 때 악의적인 프로그램이 시작되지 않도록 하기 위해 그룹 정책을 통해 모든 드라이브에서 자동 실행을 사용하지 않도록 합니다.
시스템에 실제로 액세스할 수 있는 공격자는 자동 실행이 가능한 DVD 또는 CD를 컴퓨터에 삽입할 수 있으므로 이로 인해 악의적인 코드가 자동으로 시작됩니다. 이 악의적 프로그램에는 공격자가 원하는 모든 코드가 포함되어 있습니다.
화면 보호기 암호 보호 즉시 적용: 화면 보호기 유예 기간 만료 시간(초)(0 권장)
이 항목은 SCE에서 MSS: 화면 보호기 유예 기간 만료 시간(초)(0 권장)으로 나타납니다. Windows에는 화면 보호기 잠금이 활성화되어 있는 경우 화면 보호기가 실행된 후 실제로 콘솔이 자동으로 잠길 때까지의 유예 기간이 설정되어 있습니다.
다음과 같은 레지스트리 값 항목이 템플릿 파일의 HKEY_LOCAL_MACHINESYSTEMSoftwareMicrosoftWindows NTCurrentVersionWinlogon 레지스트리 키에 추가되었습니다.
표 7. 화면 보호기 암호 보호를 즉시 적용하기 위해 레지스트리에 추가된 설정
하위 키 레지스트리 값 항목 형식 권장 값(10진수)
ScreenSaverGracePeriod
String
0
보안 문제
화면 보호기 잠금이 실행되기 전에 사용자 동작에 허용된 기본 유예 기간은 5초입니다. 기본 유예 기간의 기본 설정을 그대로 유지하면 화면 보호기 잠금이 실행되기 전에 시스템에 로그온하기 위해 콘솔에 들어가는 사람으로부터 컴퓨터가 쉽게 공격을 받을 수 있습니다. 레지스트리 항목을 만들어 유예 기간을 조정할 수 있습니다.
대책
MSS: 화면 보호기 유예 기간 만료 시간(초)(0 권장)의 값을 0으로 구성하십시오.
이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 0 ~ 255, 기본값은 5초
보안 로그 용량 경고: 시스템에서 경고를 생성할 보안 이벤트 로그 용량에 대한 백분율 임계값
이 항목은 SCE에서 MSS: 시스템에서 경고를 생성할 보안 이벤트 로그 용량에 대한 백분율 임계값으로 나타납니다. Windows Server 2003과 Windows 2000 서비스 팩 3에는 보안 로그가 사용자 정의된 임계값에 도달하면 보안 이벤트 로그에 보안 감사를 생성하는 새로운 기능이 포함되어 있습니다. 예를 들어 이 값이 90으로 설정된 경우에는 보안 로그가 용량의 90%에 도달하면 eventID 523에 대한 이벤트 항목과 보안 이벤트 로그가 90% 찼습니다.라는 텍스트가 표시됩니다.
참고: 필요에 따라 이벤트를 덮어쓰도록 보안 이벤트 로그를 구성한 경우에는 이 설정이 적용되지 않습니다.
다음과 같은 레지스트리 값 항목이 템플릿 파일의 HKEY_LOCAL_MACHINE SYSTEMCurrentControlSetServicesEventlogSecurity 레지스트리 키에 추가되었습니다.
표 8. 안전한 DLL 검색 모드를 사용할 수 있도록 레지스트리에 추가된 설정
하위 키 레지스트리 값 항목 형식 권장 값(10진수)
WarningLevel
DWORD
0
보안 문제
필요에 따라 이벤트를 덮어쓰도록 컴퓨터를 구성하지 않은 경우 보안 로그가 꽉 차면 최신 이벤트가 로그에 기록되지 않습니다. 보안 로그에 더 이상 이벤트를 기록할 수 없을 때 컴퓨터를 종료하도록 구성한 경우 로그가 꽉 차면 컴퓨터가 종료되고 네트워크 서비스를 더 이상 제공할 수 없게 됩니다.
대책
MSS: 시스템에서 경고를 생성할 보안 이벤트 로그 용량에 대한 백분율 임계값의 값을 90으로 구성하십시오.
이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 0 ~ 100, 기본값은 0(경고 이벤트가 생성되지 않음)
안전한 DLL 검색 순서 사용: 안전한 DLL 검색 모드 사용(권장)
이 항목은 SCE에서 MSS: 안전한 DLL 검색 모드 사용(권장)으로 나타납니다. 다음 두 가지 중 한 가지 방법으로 프로세스를 실행하여 요청된 DLL(동적 연결 라이브러리)을 검색하도록 DLL 검색 순서를 구성할 수 있습니다.
? 시스템 경로에 지정된 폴더를 먼저 검색한 다음 현재 작업 중인 폴더를 검색합니다.
? 현재 작업 중인 폴더를 먼저 검색한 다음 시스템 경로에 지정된 폴더를 검색합니다.
이 레지스트리 값은 1로 설정되어 있습니다. 이 경우 시스템에서는 시스템 경로에 지정된 폴더를 먼저 검색한 다음 현재 작업 중인 폴더를 검색합니다. 0으로 설정하면 시스템에서는 현재 작업 중인 폴더를 먼저 검색한 다음 시스템 경로에 지정된 폴더를 검색합니다.
다음과 같은 레지스트리 값 항목이 템플릿 파일의 HKEY_LOCAL_MACHINE SYSTEMCurrentControlSetControlSession Manager 레지스트리 키에 추가되었습니다.
표 9. 안전한 DLL 검색 모드를 사용할 수 있도록 레지스트리에 추가된 설정
하위 키 레지스트리 값 항목 형식 권장 값(10진수)
SafeDllSearchMode
DWORD
0
보안 문제
사용자가 실수로 악성 코드를 실행하는 경우 이 코드가 수정된 버전의 시스템 DLL을 포함하여 추가 파일과 함께 패키지되어 있으면 해당 DLL의 고유 버전이 로드되어 코드에서 렌더링할 수 있는 손상 유형 및 정도가 커집니다.
대책
MSS: 안전한 DLL 검색 모드 사용(권장)의 값을 사용으로 구성하십시오.
이 레지스트리 값으로 사용할 수 있는 값은 다음과 같습니다.
? 1 또는 0, 기본값은 0
최종 로그온 사용자 이름 감추기
레지스트리를 아래와 같이 설정하여 최종 로그온 한 사용자의 이름을 감추십시오.
Win NT
하이브
HKEY_LOCAL_MACHINESOFTWARE
키
MicrosoftWindows NTCurrent VersionWinlogon
이름
DontDisplayLastUserName
형식
REG_SZ (Win 2000 > REG_DWORD)
값
1
win NT
공개 로컬 보안 인증(LSA)의 정보에 대한 액세스 제한
시스템의 모든 사용자를 식별하여, 익명 사용자를 제한하고 Windows NT Security Subsystem의 LSA 구성 요소에 대해 얻을 수 있는 공개 정보를 최소화해야 합니다. LSA는 로컬 컴퓨터의 액세스와 사용 권한을 포함한 보안 관리 항목을 처리합니다. 이 제한을 적용하려면 아래와 같이 레지스트리 항목을 만들고 설정하십시오. 하이브
HKEY_LOCAL_MACHINE SYSTEM
키
CurrentControlSetControlLSA
값 이름
RestrictAnonymous
종류
REG_DWORD
값
1
win 2000
RestrictAnonymous 레지스트리 값
레지스트리 편집기를 사용하여 다음 레지스트리 키를 보고 이 키에 다음 값을 추가하거나 값이 이미 있는 경우 값을 수정하십시오.
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLSA
값: RestrictAnonymous
값 종류: REG_DWORD
값 데이터: 0x2(16진수)
윈도우 기본 공유 폴더 생성 또는 제거
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesLanmanServerParametersAutoShareServer
AutoShareServer의 값을 0으로 한경우 재시작시 공유 만들지 않음.
1인경우 재시작시 공유 만들거나 복원.
출처 : [기타] 인터넷 : support.microsoft.com 검색 내용
Declare @i Int, @maxi Int
Declare @j Int, @maxj Int
Declare @sr int
Declare @Output varchar(4000)
--Declare @tmpOutput varchar(max)
Declare @SqlVersion varchar(5)
Declare @last varchar(155), @current varchar(255), @typ varchar(255), @description varchar(4000)
create Table #Tables (id int identity(1, 1), Object_id int, Name varchar(155), Type varchar(20), [description] varchar(4000))
create Table #Columns (id int identity(1,1), Name varchar(155), Type Varchar(155), Nullable varchar(2), [description] varchar(4000))
create Table #Fk(id int identity(1,1), Name varchar(155), col Varchar(155), refObj varchar(155), refCol varchar(155))
create Table #Constraint(id int identity(1,1), Name varchar(155), col Varchar(155), definition varchar(1000))
create Table #Indexes(id int identity(1,1), Name varchar(155), Type Varchar(25), cols varchar(1000))
If (substring(@@VERSION, 1, 25 ) = 'Microsoft SQL Server 2005')
set @SqlVersion = '2005'
else if (substring(@@VERSION, 1, 26 ) = 'Microsoft SQL Server 2000')
set @SqlVersion = '2000'
else
set @SqlVersion = '2005'
Print '<head>'
Print '<title>::' + DB_name() + '::</title>'
Print '<style>'
Print ' body {'
Print ' font-family:verdana;'
Print ' font-size:9pt;'
Print ' }'
Print ' td {'
Print ' font-family:verdana;'
Print ' font-size:9pt;'
Print ' }'
Print ' th {'
Print ' font-family:verdana;'
Print ' font-size:9pt;'
Print ' background:#d3d3d3;'
Print ' }'
Print ' table'
Print ' {'
Print ' background:#d3d3d3;'
Print ' }'
Print ' tr'
Print ' {'
Print ' background:#ffffff;'
Print ' }'
Print ' </style>'
Print '</head>'
Print '<body>'
set nocount on
if @SqlVersion = '2000'
begin
insert into #Tables (Object_id, Name, Type, [description])
--FOR 2000
select object_id(table_name), '[' + table_schema + '].[' + table_name + ']',
case when table_type = 'BASE TABLE' then 'Table' else 'View' end,
cast(p.value as varchar(4000))
from information_schema.tables t
left outer join sysproperties p on p.id = object_id(t.table_name) and smallid = 0 and p.name = 'MS_Description'
order by table_type, table_schema, table_name
end
else if @SqlVersion = '2005'
begin
insert into #Tables (Object_id, Name, Type, [description])
--FOR 2005
Select o.object_id, '[' + s.name + '].[' + o.name + ']',
case when type = 'V' then 'View' when type = 'U' then 'Table' end,
cast(p.value as varchar(4000))
from sys.objects o
left outer join sys.schemas s on s.schema_id = o.schema_id
left outer join sys.extended_properties p on p.major_id = o.object_id and minor_id = 0 and p.name = 'MS_Description'
where type in ('U', 'V')
order by type, s.name, o.name
end
Set @maxi = @@rowcount
set @i = 1
print '<table border="0" cellspacing="0" cellpadding="0" width="550px" align="center"><tr><td colspan="3" style="height:50;font-size:14pt;text-align:center;"><a name="index"></a><b>Index</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="550px" align="center"><tr><th>Sr</th><th>Object</th><th>Type</th></tr>'
While(@i <= @maxi)
begin
select @Output = '<tr><td align="center">' + Cast((@i) as varchar) + '</td><td><a href="#' + Type + ':' + name + '">' + name + '</a></td><td>' + Type + '</td></tr>'
from #Tables where id = @i
print @Output
set @i = @i + 1
end
print '</table><br />'
set @i = 1
While(@i <= @maxi)
begin
--table header
select @Output = '<tr><th align="left"><a name="' + Type + ':' + name + '"></a><b>' + Type + ':' + name + '</b></th></tr>', @description = [description]
from #Tables where id = @i
print '<br /><br /><br /><table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td align="right"><a href="#index">Index</a></td></tr>'
print @Output
print '</table><br />'
print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Description</b></td></tr><tr><td>' + isnull(@description, '') + '</td></tr></table><br />'
--table columns
truncate table #Columns
if @SqlVersion = '2000'
begin
insert into #Columns (Name, Type, Nullable, [description])
--FOR 2000
Select c.name,
type_name(xtype) + (
case when (type_name(xtype) = 'varchar' or type_name(xtype) = 'nvarchar' or type_name(xtype) ='char' or type_name(xtype) ='nchar')
then '(' + cast(length as varchar) + ')'
when type_name(xtype) = 'decimal'
then '(' + cast(prec as varchar) + ',' + cast(scale as varchar) + ')'
else ''
end
),
case when isnullable = 1 then 'Y' else 'N' end,
cast(p.value as varchar(8000))
from syscolumns c
inner join #Tables t on t.object_id = c.id
left outer join sysproperties p on p.id = c.id and p.smallid = c.colid and p.name = 'MS_Description'
where t.id = @i
order by c.colorder
end
else if @SqlVersion = '2005'
begin
insert into #Columns (Name, Type, Nullable, [description])
--FOR 2005
Select c.name,
type_name(user_type_id) + (
case when (type_name(user_type_id) = 'varchar' or type_name(user_type_id) = 'nvarchar' or type_name(user_type_id) ='char' or type_name(user_type_id) ='nchar')
then '(' + cast(max_length as varchar) + ')'
when type_name(user_type_id) = 'decimal'
then '(' + cast([precision] as varchar) + ',' + cast(scale as varchar) + ')'
else ''
end
),
case when is_nullable = 1 then 'Y' else 'N' end,
cast(p.value as varchar(4000))
from sys.columns c
inner join #Tables t on t.object_id = c.object_id
left outer join sys.extended_properties p on p.major_id = c.object_id and p.minor_id = c.column_id and p.name = 'MS_Description'
where t.id = @i
order by c.column_id
end
Set @maxj = @@rowcount
set @j = 1
print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Table Columns</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Datatype</th><th>Nullable</th><th>Description</th></tr>'
While(@j <= @maxj)
begin
select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="150px">' + isnull(name,'') + '</td><td width="150px">' + upper(isnull(Type,'')) + '</td><td width="50px" align="center">' + isnull(Nullable,'N') + '</td><td>' + isnull([description],'') + '</td></tr>'
from #Columns where id = @j
print @Output
Set @j = @j + 1;
end
print '</table><br />'
--reference key
truncate table #FK
if @SqlVersion = '2000'
begin
insert into #FK (Name, col, refObj, refCol)
-- FOR 2000
select object_name(constid), s.name, object_name(rkeyid) , s1.name
from sysforeignkeys f
inner join sysobjects o on o.id = f.constid
inner join syscolumns s on s.id = f.fkeyid and s.colorder = f.fkey
inner join syscolumns s1 on s1.id = f.rkeyid and s1.colorder = f.rkey
inner join #Tables t on t.object_id = f.fkeyid
where t.id = @i
order by 1
end
else if @SqlVersion = '2005'
begin
insert into #FK (Name, col, refObj, refCol)
-- FOR 2005
select f.name, COL_NAME (fc.parent_object_id, fc.parent_column_id) , object_name(fc.referenced_object_id) , COL_NAME (fc.referenced_object_id, fc.referenced_column_id)
from sys.foreign_keys f
inner join sys.foreign_key_columns fc on f.object_id = fc.constraint_object_id
inner join #Tables t on t.object_id = f.parent_object_id
where t.id = @i
order by f.name
end
Set @maxj = @@rowcount
set @j = 1
if (@maxj >0)
begin
print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Refrence Keys</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Column</th><th>Reference To</th></tr>'
While(@j <= @maxj)
begin
select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="150px">' + isnull(name,'') + '</td><td width="150px">' + isnull(col,'') + '</td><td>[' + isnull(refObj,'N') + '].[' + isnull(refCol,'N') + ']</td></tr>'
from #FK where id = @j
print @Output
Set @j = @j + 1;
end
print '</table><br />'
end
--Default Constraints
truncate table #Constraint
if @SqlVersion = '2000'
begin
insert into #Constraint (Name, col, definition)
select object_name(c.constid), col_name(c.id, c.colid), s.text
from sysconstraints c
inner join #Tables t on t.object_id = c.id
left outer join syscomments s on s.id = c.constid
where t.id = @i
and
convert(varchar,+ (c.status & 1)/1)
+ convert(varchar,(c.status & 2)/2)
+ convert(varchar,(c.status & 4)/4)
+ convert(varchar,(c.status & 8)/8)
+ convert(varchar,(c.status & 16)/16)
+ convert(varchar,(c.status & 32)/32)
+ convert(varchar,(c.status & 64)/64)
+ convert(varchar,(c.status & 128)/128) = '10101000'
end
else if @SqlVersion = '2005'
begin
insert into #Constraint (Name, col, definition)
select c.name, col_name(parent_object_id, parent_column_id), c.definition
from sys.default_constraints c
inner join #Tables t on t.object_id = c.parent_object_id
where t.id = @i
order by c.name
end
Set @maxj = @@rowcount
set @j = 1
if (@maxj >0)
begin
print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Default Constraints</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Column</th><th>Value</th></tr>'
While(@j <= @maxj)
begin
select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="250px">' + isnull(name,'') + '</td><td width="150px">' + isnull(col,'') + '</td><td>' + isnull(definition,'') + '</td></tr>'
from #Constraint where id = @j
print @Output
Set @j = @j + 1;
end
print '</table><br />'
end
--Check Constraints
truncate table #Constraint
if @SqlVersion = '2000'
begin
insert into #Constraint (Name, col, definition)
select object_name(c.constid), col_name(c.id, c.colid), s.text
from sysconstraints c
inner join #Tables t on t.object_id = c.id
left outer join syscomments s on s.id = c.constid
where t.id = @i
and ( convert(varchar,+ (c.status & 1)/1)
+ convert(varchar,(c.status & 2)/2)
+ convert(varchar,(c.status & 4)/4)
+ convert(varchar,(c.status & 8)/8)
+ convert(varchar,(c.status & 16)/16)
+ convert(varchar,(c.status & 32)/32)
+ convert(varchar,(c.status & 64)/64)
+ convert(varchar,(c.status & 128)/128) = '00101000'
or convert(varchar,+ (c.status & 1)/1)
+ convert(varchar,(c.status & 2)/2)
+ convert(varchar,(c.status & 4)/4)
+ convert(varchar,(c.status & 8)/8)
+ convert(varchar,(c.status & 16)/16)
+ convert(varchar,(c.status & 32)/32)
+ convert(varchar,(c.status & 64)/64)
+ convert(varchar,(c.status & 128)/128) = '00100100')
end
else if @SqlVersion = '2005'
begin
insert into #Constraint (Name, col, definition)
select c.name, col_name(parent_object_id, parent_column_id), definition
from sys.check_constraints c
inner join #Tables t on t.object_id = c.parent_object_id
where t.id = @i
order by c.name
end
Set @maxj = @@rowcount
set @j = 1
if (@maxj >0)
begin
print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Check Constraints</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Column</th><th>Definition</th></tr>'
While(@j <= @maxj)
begin
select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="250px">' + isnull(name,'') + '</td><td width="150px">' + isnull(col,'') + '</td><td>' + isnull(definition,'') + '</td></tr>'
from #Constraint where id = @j
print @Output
Set @j = @j + 1;
end
print '</table><br />'
end
--Triggers
truncate table #Constraint
if @SqlVersion = '2000'
begin
insert into #Constraint (Name)
select tr.name
FROM sysobjects tr
inner join #Tables t on t.object_id = tr.parent_obj
where t.id = @i and tr.type = 'TR'
order by tr.name
end
else if @SqlVersion = '2005'
begin
insert into #Constraint (Name)
SELECT tr.name
FROM sys.triggers tr
inner join #Tables t on t.object_id = tr.parent_id
where t.id = @i
order by tr.name
end
Set @maxj = @@rowcount
set @j = 1
if (@maxj >0)
begin
print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Triggers</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Description</th></tr>'
While(@j <= @maxj)
begin
select @Output = '<tr><td width="20px" align="center">' + Cast((@j) as varchar) + '</td><td width="150px">' + isnull(name,'') + '</td><td></td></tr>'
from #Constraint where id = @j
print @Output
Set @j = @j + 1;
end
print '</table><br />'
end
--Indexes
truncate table #Indexes
if @SqlVersion = '2000'
begin
insert into #Indexes (Name, type, cols)
select i.name, case when i.indid = 0 then 'Heap' when i.indid = 1 then 'Clustered' else 'Nonclustered' end , c.name
from sysindexes i
inner join sysindexkeys k on k.indid = i.indid and k.id = i.id
inner join syscolumns c on c.id = k.id and c.colorder = k.colid
inner join #Tables t on t.object_id = i.id
where t.id = @i and i.name not like '_WA%'
order by i.name, i.keycnt
end
else if @SqlVersion = '2005'
begin
insert into #Indexes (Name, type, cols)
select i.name, case when i.type = 0 then 'Heap' when i.type = 1 then 'Clustered' else 'Nonclustered' end, col_name(i.object_id, c.column_id)
from sys.indexes i
inner join sys.index_columns c on i.index_id = c.index_id and c.object_id = i.object_id
inner join #Tables t on t.object_id = i.object_id
where t.id = @i
order by i.name, c.column_id
end
Set @maxj = @@rowcount
set @j = 1
set @sr = 1
if (@maxj >0)
begin
print '<table border="0" cellspacing="0" cellpadding="0" width="750px"><tr><td><b>Indexes</b></td></tr></table>'
print '<table border="0" cellspacing="1" cellpadding="0" width="750px"><tr><th>Sr.</th><th>Name</th><th>Type</th><th>Columns</th></tr>'
set @Output = ''
set @last = ''
set @current = ''
While(@j <= @maxj)
begin
select @current = isnull(name,'') from #Indexes where id = @j
if @last <> @current and @last <> ''
begin
print '<tr><td width="20px" align="center">' + Cast((@sr) as varchar) + '</td><td width="150px">' + @last + '</td><td width="150px">' + @typ + '</td><td>' + @Output + '</td></tr>'
set @Output = ''
set @sr = @sr + 1
end
select @Output = @Output + cols + '<br />' , @typ = type
from #Indexes where id = @j
set @last = @current
Set @j = @j + 1;
end
if @Output <> ''
begin
print '<tr><td width="20px" align="center">' + Cast((@sr) as varchar) + '</td><td width="150px">' + @last + '</td><td width="150px">' + @typ + '</td><td>' + @Output + '</td></tr>'
end
print '</table><br />'
end
Set @i = @i + 1;
--Print @Output
end
Print '</body>'
Print '</html>'
drop table #Tables
drop table #Columns
drop table #FK
drop table #Constraint
drop table #Indexes
set nocount off