페이지

2010년 5월 14일 금요일

두루에디트 FTP 기능구현을 위한 FTP 소스 디렉토리 목록 정리

--------------------------------------------------------------------------
■FTP 는 RFC959,FTPS 는 RFC2246,RFC4217의 SSL/TLS을 근거로 한다.
SSL/TLS은 OpenSSL이나 GNuTLS를 사용하는데,파일질라는 후자를 사용한다.

SSL stands for Secure Sockets Layer, however the IETF has renamed it to TLS (Transport Layer Security) and docum
ented it's development in RFC 2246.

Based on encryption, when an SSL session is first enabled the server announces a public key to the client. At this po
int, no encryption is in place so everybody can read this public key. After receipt of the public key, the client generat
es 46 bytes of random data and creates a very large number according to PKCS#1.

With the server's public key it encrypts these 46 bytes and sends the results to the server. With it's private key, the s
erver can decode the information to detemine the original 46 bytes of information from the client. From here, the re
st of the session information is encrypted using a set of standard RC4 cipher keys.

SSL is Based on TLS
Developed by the NetScape Communication Corporation, SSL is commonly used by web browsers when there is a
need for providing secure connections for data transfer (e.g., credit card transactions).

In RFC 2246, TLS is discussed as being based on SSL 3.0 as published by NetScape. And while the SSL FTP specific
ation in RFC 4217 refers mostly to TLS, it is to be understood that the client may actually be using SSL instead of TL
S.

■디렉토리 목록 잘못 가져오는 경우의 원인분석과 보정 절차(아래의 경우)
-rw-r--r-- 1 COMNEKR COMNEKR 893 Apr 14 05:10 crontab8.txt
-rwxr-xr-x 1 COMNEKR COMNEKR 16853 Dec 31 04:20 index.html
drwxr-xr-x 2 COMNEKR COMNEKR 4096 Dec 5 2008 pds
-rw-r--r-- 1 COMNEKR COMNEKR 999424 Dec 5 2008 pecl-5.2.3-Win32.zip
-rw-r--r-- 1 COMNEKR COMNEKR 2097152 Dec 5 2008 php-5.2.5-Win32.zip
-rw-r--r-- 1 COMNEKR COMNEKR 258722 Apr 29 00:44 registry_patch.zip
drwxr-xr-x 4 COMNEKR COMNEKR 4096 May 4 21:38 update
-rw-rw-rw- 1 sale app 0 2005.11.10 -r
drwxrwxrwx 3 sale app 96 1월 15일 10:35 citi
-rw-r----- 1 sale app 11909120 1월 15일 10:34 citi.tar
drwxrwxrwx 3 sale app 8192 2007.08.02 compile
LIST명령중 어떤 서버는 날짜형식에 따라(한글) 컬럼이 일정하지가 않아 파일명 추출이 힘들다(WinINet도 FtpFindFirstFile 버그)
따라서, 목록을 보여주는 FTP기능을 사용한다면 WinINet 함수를 쓰지 않아야 하고 Native FTP를 따로 구현하여야 한다.

따라서,잘 잘라야 한다. 이때 날짜와,파일명을 제대로 못가져 오게 되는데 해결방법은 먼저 LIST를 하여 attr, user,owner size까지
파싱한 다음 NLST로 명령을 날려 얻은 결과에서 LIST의 결과에 있는 것을 상대로 맨뒤에서 부터 파일명을 대조하여 가져온다.
그리고,파일날짜는 파일에만 해당되는데 MDTM 파일명을 다시 날려서 날짜를 구한다.
그냥 자르다가는 파일명에 공백이 들어가는 LONGNAME 형식이라 한계가 있다.따라서 이방법을 권고하는 바이다.

절차: 디렉토리 이동시 CWD 후에 PWD 날릴것,
LIST를 날려서 각줄단위 결과를 LIST.linedata에 읽어넣는다.이때,속성,소유자,그룹,파일크기 까지는
각 LIST.attr,LIST.owner,LIST.group,LIST.size에 집어넣는다.
단,파일날짜와 이름부분에 뭔가 컬럼이 삑사리가 나면 needfix = true로 하고 needfixcount ++ 한다.
LIST처리가 끝난 직후,needfixcount > 0 이면 보정 작업에 들어간다.
NLST를 날려 파일명 목록을 구성하고 needfix = true 인것을 대상으로 LIST.linedata에 비교하여 LIST.filename에 때려넣는다.
이 컬럼이 일정치 않은 파일을 상대로 MDTM 을 날려 LIST.filetime 에 때려 넣는다.

■NLST안하고 파싱하는방법
UNIX타입은 월 일 시간순이다.
월이 영문이면 원래대로 처리,숫자면 atoi,맨 뒤에 시간이 들어가면 연도는 현재년도로 한다.
월자리에 4글자 들어가고.있으면 년/월/일로 처리패시브모드, FTPS,SFTP 순으로 중요하다.

■명령어 보낼때 마다 앞단에 TYPE과 POST냐 PASV냐를 보내고 POST인 경우는 리쓰닝해놓고 데이타채널 연결되면 결과를 받고
PASV는 서버 컨트롤 채널의 응답에 찍힌 PORT로 connect 해서 결과를 받는다.

■서버타입 구분하는 로직(WS_FTP에 있다.아주 옛날 소스라 버그가 많다,파일시간,크기도 안보여준다)
서버타입 구분은 어플리케이션의 부가기능이며 /,\의 경로상의 구분,LIST의 형식 구분에만 적용된다.

■putty에 sftp 로직있음(SFTP는 SSH FTP 로 passive 모드자체가 존재하지 않고 ftp 프로토콜이 아닌 SSH 터널링을
이용해 FTP 하는 기능이고 속도가 FTPS보다 1/2정도 느려서 잘 쓰기 꺼려한다고한다,즉 FTP 명령 list,nlst가 아닌 ls 등을 쓰는 쉘명령기반)

■paintlib의 curl 라이브러리도 ssl/TLS이용한 FTPS 기능 있으나 깔끔하게 갖다 쓰기엔 함수와 파라미터등이 조잡하다,
라이브러리 전체를 삽입하거나,ftp부분만 따로 떼어내든가 해야하는데 이 작업은 맨땅에 헤딩,오랜시간 걸릴듯 하다.
또 CURL자체가 one-shot 주고받기를 목적으로 하고있어 keep-alive 하는 전형적인 ftp 클라이언트 예제가 없다.
물론 구현은 가능하지만,이것도 맨땅에 헤딩하는 격이다.

■파일질라 에 GunTLS이용한 FTPS있고 SFTP있고 putty소스도 포함된걸로 보아,뭔가 sftp시 이용하는듯,
SSL 쪽 적용한 engine 부분만 분석하면 좋을듯 하다.그러나 wxWidgets,mingw등의 빌드환경이다.

■FTPGetPutUsingSocket에는 MFC CSocket 으로 구현된 간단 예제이다.
방화벽 로그인 기능만 참고할 만함. 나머진 잘안되고 파일버튼에만 간단한 주고받기 예제있음.

■ftplib-3.1-1 는 파일 하나짜리 크기도 크지않고 passive 되고 괜찮은 놈이다.SSL은 당연히 없다.
■LibFTP 는 유닉스기반으로 만 된 소스이지만 UNIX,VMS,MSDOS 서버타입별로 LIST 결과를 파싱하여 파일 목록
링크드 리스트로 만드는 FtpStat와 FtpStatFree 함수가 있다.이것도 순전히 FTP기능이고 SSL은 없다.
(이 경우도 시간,파일명 버그가 있다)
■SFTP는 SSH 터널링을 이용하는 SSH 쪽 FTP지,FTP프로토콜과는 무관하다.
또, 속도가 FTPS의 1/2도 못미친다는 말이 많다.반면 FTPS는 FTP프로토콜위에 보안을 강화한 SSL/TLS를
적용한 FTP 이고 장점이 더 많다. 따라서 SFTP 구현은 완전 비추이다.

■문제는 어떻게 쉽게 SSL을 구현하느냐다.

댓글 없음:

댓글 쓰기