可以考虑对FTP上传的文件先进行加密

解决方案 »

  1.   

    不是说文件不安全,是FTP的用户名密码不安全。别人抓包到以后就能登录我的FTP然后随意删除文件了
      

  2.   


    FTP不可以匿名访问吗?
    仅供参考:#pragma comment(lib, "crypt32.lib")
    #pragma comment(lib, "advapi32.lib")
    #define _WIN32_WINNT 0x0400
    #include <stdio.h>
    #include <windows.h>
    #include <wincrypt.h>
    #define KEYLENGTH  0x00800000
    void HandleError(char *s);
    //--------------------------------------------------------------------
    //  These additional #define statements are required.
    #define ENCRYPT_ALGORITHM CALG_RC4
    #define ENCRYPT_BLOCK_SIZE 8
    //   Declare the function EncryptFile. The function definition
    //   follows main.
    BOOL EncryptFile(
        PCHAR szSource,
        PCHAR szDestination,
        PCHAR szPassword);
    //--------------------------------------------------------------------
    //   Begin main.
    void main(void) {
        CHAR szSource[100];
        CHAR szDestination[100];
        CHAR szPassword[100];
        printf("Encrypt a file. \n\n");
        printf("Enter the name of the file to be encrypted: ");
        scanf("%s",szSource);
        printf("Enter the name of the output file: ");
        scanf("%s",szDestination);
        printf("Enter the password:");
        scanf("%s",szPassword);
        //--------------------------------------------------------------------
        // Call EncryptFile to do the actual encryption.
        if(EncryptFile(szSource, szDestination, szPassword)) {
            printf("Encryption of the file %s was a success. \n", szSource);
            printf("The encrypted data is in file %s.\n",szDestination);
        } else {
            HandleError("Error encrypting file!");
        }
    } // End of main
    //--------------------------------------------------------------------
    //   Code for the function EncryptFile called by main.
    static BOOL EncryptFile(
        PCHAR szSource,
        PCHAR szDestination,
        PCHAR szPassword)
    //--------------------------------------------------------------------
    //   Parameters passed are:
    //     szSource, the name of the input, a plaintext file.
    //     szDestination, the name of the output, an encrypted file to be
    //         created.
    //     szPassword, the password.
    {
        //--------------------------------------------------------------------
        //   Declare and initialize local variables.
        FILE *hSource;
        FILE *hDestination;
        HCRYPTPROV hCryptProv;
        HCRYPTKEY hKey;
        HCRYPTHASH hHash;
        PBYTE pbBuffer;
        DWORD dwBlockLen;
        DWORD dwBufferLen;
        DWORD dwCount;
        //--------------------------------------------------------------------
        // Open source file.
        if(hSource = fopen(szSource,"rb")) {
            printf("The source plaintext file, %s, is open. \n", szSource);
        } else {
            HandleError("Error opening source plaintext file!");
        }
        //--------------------------------------------------------------------
        // Open destination file.
        if(hDestination = fopen(szDestination,"wb")) {
            printf("Destination file %s is open. \n", szDestination);
        } else {
            HandleError("Error opening destination ciphertext file!");
        }
        //以下获得一个CSP句柄
        if(CryptAcquireContext(
                    &hCryptProv,
                    NULL,               //NULL表示使用默认密钥容器,默认密钥容器名
                    //为用户登陆名
                    NULL,
                    PROV_RSA_FULL,
                    0)) {
            printf("A cryptographic provider has been acquired. \n");
        } else {
            if(CryptAcquireContext(
                        &hCryptProv,
                        NULL,
                        NULL,
                        PROV_RSA_FULL,
                        CRYPT_NEWKEYSET))//创建密钥容器
            {
                //创建密钥容器成功,并得到CSP句柄
                printf("A new key container has been created.\n");
            } else {
                HandleError("Could not create a new key container.\n");
            }
        }
        //--------------------------------------------------------------------
        // 创建一个会话密钥(session key)
        // 会话密钥也叫对称密钥,用于对称加密算法。
        // (注: 一个Session是指从调用函数CryptAcquireContext到调用函数
        //   CryptReleaseContext 期间的阶段。会话密钥只能存在于一个会话过程)
        //--------------------------------------------------------------------
        // Create a hash object.
        if(CryptCreateHash(
                    hCryptProv,
                    CALG_MD5,
                    0,
                    0,
                    &hHash)) {
            printf("A hash object has been created. \n");
        } else {
            HandleError("Error during CryptCreateHash!\n");
        }
        //--------------------------------------------------------------------
        // 用输入的密码产生一个散列
        if(CryptHashData(
                    hHash,
                    (BYTE *)szPassword,
                    strlen(szPassword),
                    0)) {
            printf("The password has been added to the hash. \n");
        } else {
            HandleError("Error during CryptHashData. \n");
        }
        //--------------------------------------------------------------------
        // 通过散列生成会话密钥
        if(CryptDeriveKey(
                    hCryptProv,
                    ENCRYPT_ALGORITHM,
                    hHash,
                    KEYLENGTH,
                    &hKey)) {
            printf("An encryption key is derived from the password hash. \n");
        } else {
            HandleError("Error during CryptDeriveKey!\n");
        }
        //--------------------------------------------------------------------
        // Destroy the hash object.
        CryptDestroyHash(hHash);
        hHash = NULL;
        //--------------------------------------------------------------------
        //  The session key is now ready.
        //--------------------------------------------------------------------
        // 因为加密算法是按ENCRYPT_BLOCK_SIZE 大小的块加密的,所以被加密的
        // 数据长度必须是ENCRYPT_BLOCK_SIZE 的整数倍。下面计算一次加密的
        // 数据长度。
        dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;
        //--------------------------------------------------------------------
        // Determine the block size. If a block cipher is used,
        // it must have room for an extra block.
        if(ENCRYPT_BLOCK_SIZE > 1)
            dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE;
        else
            dwBufferLen = dwBlockLen;
        //--------------------------------------------------------------------
        // Allocate memory.
        if(pbBuffer = (BYTE *)malloc(dwBufferLen)) {
            printf("Memory has been allocated for the buffer. \n");
        } else {
            HandleError("Out of memory. \n");
        }
        //--------------------------------------------------------------------
        // In a do loop, encrypt the source file and write to the destination file.
        do {
            //--------------------------------------------------------------------
            // Read up to dwBlockLen bytes from the source file.
            dwCount = fread(pbBuffer, 1, dwBlockLen, hSource);
            if(ferror(hSource)) {
                HandleError("Error reading plaintext!\n");
            }
            //--------------------------------------------------------------------
            // 加密数据
            if(!CryptEncrypt(
                        hKey,           //密钥
                        0,              //如果数据同时进行散列和加密,这里传入一个
                        //散列对象
                        feof(hSource),  //如果是最后一个被加密的块,输入TRUE.如果不是输.
                        //入FALSE这里通过判断是否到文件尾来决定是否为
                        //最后一块。
                        0,              //保留
                        pbBuffer,       //输入被加密数据,输出加密后的数据
                        &dwCount,       //输入被加密数据实际长度,输出加密后数据长度
                        dwBufferLen))   //pbBuffer的大小。
            {
                HandleError("Error during CryptEncrypt. \n");
            }
            //--------------------------------------------------------------------
            // Write data to the destination file.
            fwrite(pbBuffer, 1, dwCount, hDestination);
            if(ferror(hDestination)) {
                HandleError("Error writing ciphertext.");
            }
        } while(!feof(hSource));
        //--------------------------------------------------------------------
        //  End the do loop when the last block of the source file has been
        //  read, encrypted, and written to the destination file.
        //--------------------------------------------------------------------
        // Close files.
        if(hSource)
            fclose(hSource);
        if(hDestination)
            fclose(hDestination);
        //--------------------------------------------------------------------
        // Free memory.
        if(pbBuffer)
            free(pbBuffer);
        //--------------------------------------------------------------------
        // Destroy session key.
        if(hKey)
            CryptDestroyKey(hKey);
        //--------------------------------------------------------------------
        // Destroy hash object.
        if(hHash)
            CryptDestroyHash(hHash);
        //--------------------------------------------------------------------
        // Release provider handle.
        if(hCryptProv)
            CryptReleaseContext(hCryptProv, 0);
        return(TRUE);
    } // End of Encryptfile
    //--------------------------------------------------------------------
    //  This example uses the function HandleError, a simple error
    //  handling function, to print an error message to the standard error
    //  (stderr) file and exit the program.
    //  For most applications, replace this function with one
    //  that does more extensive error reporting.
    void HandleError(char *s) {
        fprintf(stderr,"An error occurred in running the program. \n");
        fprintf(stderr,"%s\n",s);
        fprintf(stderr, "Error number %x.\n", GetLastError());
        fprintf(stderr, "Program terminating. \n");
        exit(1);
    } // End of HandleError
      

  3.   


    FTP不可以匿名访问吗?
    仅供参考:#pragma comment(lib, "crypt32.lib")
    #pragma comment(lib, "advapi32.lib")
    #define _WIN32_WINNT 0x0400
    #include <stdio.h>
    #include <windows.h>
    #include <wincrypt.h>
    #define KEYLENGTH  0x00800000
    void HandleError(char *s);
    //--------------------------------------------------------------------
    //  These additional #define statements are required.
    #define ENCRYPT_ALGORITHM CALG_RC4
    #define ENCRYPT_BLOCK_SIZE 8
    //   Declare the function EncryptFile. The function definition
    //   follows main.
    BOOL EncryptFile(
        PCHAR szSource,
        PCHAR szDestination,
        PCHAR szPassword);
    //--------------------------------------------------------------------
    //   Begin main.
    void main(void) {
        CHAR szSource[100];
        CHAR szDestination[100];
        CHAR szPassword[100];
        printf("Encrypt a file. \n\n");
        printf("Enter the name of the file to be encrypted: ");
        scanf("%s",szSource);
        printf("Enter the name of the output file: ");
        scanf("%s",szDestination);
        printf("Enter the password:");
        scanf("%s",szPassword);
        //--------------------------------------------------------------------
        // Call EncryptFile to do the actual encryption.
        if(EncryptFile(szSource, szDestination, szPassword)) {
            printf("Encryption of the file %s was a success. \n", szSource);
            printf("The encrypted data is in file %s.\n",szDestination);
        } else {
            HandleError("Error encrypting file!");
        }
    } // End of main
    //--------------------------------------------------------------------
    //   Code for the function EncryptFile called by main.
    static BOOL EncryptFile(
        PCHAR szSource,
        PCHAR szDestination,
        PCHAR szPassword)
    //--------------------------------------------------------------------
    //   Parameters passed are:
    //     szSource, the name of the input, a plaintext file.
    //     szDestination, the name of the output, an encrypted file to be
    //         created.
    //     szPassword, the password.
    {
        //--------------------------------------------------------------------
        //   Declare and initialize local variables.
        FILE *hSource;
        FILE *hDestination;
        HCRYPTPROV hCryptProv;
        HCRYPTKEY hKey;
        HCRYPTHASH hHash;
        PBYTE pbBuffer;
        DWORD dwBlockLen;
        DWORD dwBufferLen;
        DWORD dwCount;
        //--------------------------------------------------------------------
        // Open source file.
        if(hSource = fopen(szSource,"rb")) {
            printf("The source plaintext file, %s, is open. \n", szSource);
        } else {
            HandleError("Error opening source plaintext file!");
        }
        //--------------------------------------------------------------------
        // Open destination file.
        if(hDestination = fopen(szDestination,"wb")) {
            printf("Destination file %s is open. \n", szDestination);
        } else {
            HandleError("Error opening destination ciphertext file!");
        }
        //以下获得一个CSP句柄
        if(CryptAcquireContext(
                    &hCryptProv,
                    NULL,               //NULL表示使用默认密钥容器,默认密钥容器名
                    //为用户登陆名
                    NULL,
                    PROV_RSA_FULL,
                    0)) {
            printf("A cryptographic provider has been acquired. \n");
        } else {
            if(CryptAcquireContext(
                        &hCryptProv,
                        NULL,
                        NULL,
                        PROV_RSA_FULL,
                        CRYPT_NEWKEYSET))//创建密钥容器
            {
                //创建密钥容器成功,并得到CSP句柄
                printf("A new key container has been created.\n");
            } else {
                HandleError("Could not create a new key container.\n");
            }
        }
        //--------------------------------------------------------------------
        // 创建一个会话密钥(session key)
        // 会话密钥也叫对称密钥,用于对称加密算法。
        // (注: 一个Session是指从调用函数CryptAcquireContext到调用函数
        //   CryptReleaseContext 期间的阶段。会话密钥只能存在于一个会话过程)
        //--------------------------------------------------------------------
        // Create a hash object.
        if(CryptCreateHash(
                    hCryptProv,
                    CALG_MD5,
                    0,
                    0,
                    &hHash)) {
            printf("A hash object has been created. \n");
        } else {
            HandleError("Error during CryptCreateHash!\n");
        }
        //--------------------------------------------------------------------
        // 用输入的密码产生一个散列
        if(CryptHashData(
                    hHash,
                    (BYTE *)szPassword,
                    strlen(szPassword),
                    0)) {
            printf("The password has been added to the hash. \n");
        } else {
            HandleError("Error during CryptHashData. \n");
        }
        //--------------------------------------------------------------------
        // 通过散列生成会话密钥
        if(CryptDeriveKey(
                    hCryptProv,
                    ENCRYPT_ALGORITHM,
                    hHash,
                    KEYLENGTH,
                    &hKey)) {
            printf("An encryption key is derived from the password hash. \n");
        } else {
            HandleError("Error during CryptDeriveKey!\n");
        }
        //--------------------------------------------------------------------
        // Destroy the hash object.
        CryptDestroyHash(hHash);
        hHash = NULL;
        //--------------------------------------------------------------------
        //  The session key is now ready.
        //--------------------------------------------------------------------
        // 因为加密算法是按ENCRYPT_BLOCK_SIZE 大小的块加密的,所以被加密的
        // 数据长度必须是ENCRYPT_BLOCK_SIZE 的整数倍。下面计算一次加密的
        // 数据长度。
        dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;
        //--------------------------------------------------------------------
        // Determine the block size. If a block cipher is used,
        // it must have room for an extra block.
        if(ENCRYPT_BLOCK_SIZE > 1)
            dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE;
        else
            dwBufferLen = dwBlockLen;
        //--------------------------------------------------------------------
        // Allocate memory.
        if(pbBuffer = (BYTE *)malloc(dwBufferLen)) {
            printf("Memory has been allocated for the buffer. \n");
        } else {
            HandleError("Out of memory. \n");
        }
        //--------------------------------------------------------------------
        // In a do loop, encrypt the source file and write to the destination file.
        do {
            //--------------------------------------------------------------------
            // Read up to dwBlockLen bytes from the source file.
            dwCount = fread(pbBuffer, 1, dwBlockLen, hSource);
            if(ferror(hSource)) {
                HandleError("Error reading plaintext!\n");
            }
            //--------------------------------------------------------------------
            // 加密数据
            if(!CryptEncrypt(
                        hKey,           //密钥
                        0,              //如果数据同时进行散列和加密,这里传入一个
                        //散列对象
                        feof(hSource),  //如果是最后一个被加密的块,输入TRUE.如果不是输.
                        //入FALSE这里通过判断是否到文件尾来决定是否为
                        //最后一块。
                        0,              //保留
                        pbBuffer,       //输入被加密数据,输出加密后的数据
                        &dwCount,       //输入被加密数据实际长度,输出加密后数据长度
                        dwBufferLen))   //pbBuffer的大小。
            {
                HandleError("Error during CryptEncrypt. \n");
            }
            //--------------------------------------------------------------------
            // Write data to the destination file.
            fwrite(pbBuffer, 1, dwCount, hDestination);
            if(ferror(hDestination)) {
                HandleError("Error writing ciphertext.");
            }
        } while(!feof(hSource));
        //--------------------------------------------------------------------
        //  End the do loop when the last block of the source file has been
        //  read, encrypted, and written to the destination file.
        //--------------------------------------------------------------------
        // Close files.
        if(hSource)
            fclose(hSource);
        if(hDestination)
            fclose(hDestination);
        //--------------------------------------------------------------------
        // Free memory.
        if(pbBuffer)
            free(pbBuffer);
        //--------------------------------------------------------------------
        // Destroy session key.
        if(hKey)
            CryptDestroyKey(hKey);
        //--------------------------------------------------------------------
        // Destroy hash object.
        if(hHash)
            CryptDestroyHash(hHash);
        //--------------------------------------------------------------------
        // Release provider handle.
        if(hCryptProv)
            CryptReleaseContext(hCryptProv, 0);
        return(TRUE);
    } // End of Encryptfile
    //--------------------------------------------------------------------
    //  This example uses the function HandleError, a simple error
    //  handling function, to print an error message to the standard error
    //  (stderr) file and exit the program.
    //  For most applications, replace this function with one
    //  that does more extensive error reporting.
    void HandleError(char *s) {
        fprintf(stderr,"An error occurred in running the program. \n");
        fprintf(stderr,"%s\n",s);
        fprintf(stderr, "Error number %x.\n", GetLastError());
        fprintf(stderr, "Program terminating. \n");
        exit(1);
    } // End of HandleError老赵太厉害了,不管什么疑难杂症,代码都是信手拈来
      

  4.   

    http://bbs.csdn.net/topics/390989575
      

  5.   

    http 也可以选择保存文件位置的啊,只要 http 用户拥有该路径的读写权限就行了啊
      

  6.   

    不是说文件不安全,是FTP的用户名密码不安全。别人抓包到以后就能登录我的FTP然后随意删除文件了ftp协议自己把密码隐藏,可以通过wrieshark抓包看看,只显示用户名字。
      

  7.   

    但是我在网上找遍了,都是形如这样的: CString defServerName ="hexun.com";//服务器名
     CString defObjectName ="/upload.jsp";//保存的地址
    try
         {
          pHttpConnection = Session.GetHttpConnection(defServerName,nPort);
          pHTTP = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, defObjectName);
          pHTTP->AddRequestHeaders(MakeRequestHeaders(strHTTPBoundary));//发送包头请求
          pHTTP->SendRequestEx(dwTotalRequestLength, HSR_SYNC | HSR_INITIATE);
       }或者你看看这个链接:
    http://www.cnblogs.com/zudn/archive/2011/09/15/2177538.html说明http都是上传到一个网页,那最后的效果,应该不是传到指定目录吧,那要像你说的“可以选择保存文件位置”具体应该怎样做呢
      

  8.   

    是要更改服务器的FTP设置,相当于自定义一个协议吗
      

  9.   

    但是我在网上找遍了,都是形如这样的: CString defServerName ="hexun.com";//服务器名
     CString defObjectName ="/upload.jsp";//保存的地址
    try
         {
          pHttpConnection = Session.GetHttpConnection(defServerName,nPort);
          pHTTP = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, defObjectName);
          pHTTP->AddRequestHeaders(MakeRequestHeaders(strHTTPBoundary));//发送包头请求
          pHTTP->SendRequestEx(dwTotalRequestLength, HSR_SYNC | HSR_INITIATE);
       }或者你看看这个链接:
    http://www.cnblogs.com/zudn/archive/2011/09/15/2177538.html说明http都是上传到一个网页,那最后的效果,应该不是传到指定目录吧,那要像你说的“可以选择保存文件位置”具体应该怎样做呢在文件上传页可以选择文件保存路啊,你的代码只是如何通过该网页上传文件
    但是这个网页的源代码中可以设置文件保存路径的,那你以为 csdn 上传的图片都是怎么存到指定目录中的?
    还不是后台规定好的你尝试搜索“asp 无组件上传“,有很多类似的代码,其中肯定包括了文件的保存过程,你可以详细参考下它们是如何指定目录的
      

  10.   

    <!--#include file="upload_class.inc"-->
    <%
     on error resume next
     Server.ScriptTimeout = 9999999
     Dim Upload,successful,thisFile,allFiles,upPath,path
     set Upload=new AnUpLoad
     Upload.openProcesser=true  '打开进度条显示
     Upload.SingleSize=512*1024*1024  '设置单个文件最大上传限制,按字节计;默认为不限制,本例为512M
     Upload.MaxSize=1024*1024*1024 '设置最大上传限制,按字节计;默认为不限制,本例为1G
     Upload.Exe="*"  '设置允许上传的扩展名
     Upload.GetData()
     if Upload.ErrorID>0 then
      upload.setApp "faild",1,0 ,Upload.description
     else
      if Upload.files(-1).count>0 then
    dim str
    for each file in Upload.files(-1)
              upPath=request.querystring("path")
         path=server.mappath(upPath)
         set tempCls=Upload.files(file) 
                upload.setApp "saving",Upload.TotalSize,Upload.TotalSize,tempCls.FileName
         successful=tempCls.SaveToFile(path,1)
    thisFile="{name:'" & tempCls.FileName & "',size:" & tempCls.Size & "}"
    allFiles=allFiles & thisFile & ","
         set tempCls=nothing
    next
    upload.setApp "saved",Upload.TotalSize,Upload.TotalSize,allFiles
        else
            upload.setApp "faild",1,0,"没有上传任何文件"
      end if
     end if
     if err then upload.setApp "faild",1,0,err.description
     set Upload=nothing
     response.end
    %>
       Public Function SaveToFile(ByVal path, ByVal saveType)
        On Error Resume Next
        Err.Clear
        vPath = Replace(path, "/", "\")
        If Right(vPath, 1) <> "\" Then vPath = vPath & "\"
        Dim mystream
        Set mystream =server.createobject("ADODB.Stream")
        mystream.Type = 1
        mystream.Mode = 3
        mystream.Open
        StreamT.Position = vPosition
        StreamT.CopyTo mystream, vSize
        vName = vNewName
        If saveType = 1 Then vName = vLocalName
        mystream.SaveToFile vPath & vName, 2
        mystream.Close
        Set mystream = Nothing
        If Err Then
            SaveToFile = False
        Else
            SaveToFile = True
        End If
       End Function这是我搜索得到的,一般的网页都是可以附带查询参数的(GET 或 POST),你可以指定存储目录
    代码中 upPath=request.querystring("path") 这句是获得客户端通过网页传送到服务器的“目录”参数
    path=server.mappath(upPath) 这句是将虚拟路转为本地物理路径(前提是你要有该文件夹的相应权限)
      

  11.   

    网站是硬伤
    那如果有一个网页,我给它传一个文件名和一个路径名,并且在我有权限的前提下,它如果能把我这个文件自动保存到该路径下,就好办多了是吧?这样的话我就提这样一个需求坐等就好了这个100%没问题的,不过你要另外搭建一个http服务器咯
    网页上传文件的代码网上多的是