欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Nginx訪問(wèn)FTP服務(wù)器文件的時(shí)效性/安全校驗(yàn)的方法

 更新時(shí)間:2023年12月12日 09:23:39   作者:Code A Better Life  
nginx的實(shí)現(xiàn)方式在校驗(yàn)失敗的時(shí)候頁(yè)面返回error image,跳轉(zhuǎn)的是420 error_page,成功的時(shí)候會(huì)訪問(wèn)FTP文件服務(wù)器的路徑,反正圖片到頁(yè)面展示,這篇文章主要介紹了Nginx訪問(wèn)FTP服務(wù)器文件的時(shí)效性/安全校驗(yàn),需要的朋友可以參考下

背景

FTP文件服務(wù)器在我們?nèi)粘i_(kāi)發(fā)中經(jīng)常使用,在項(xiàng)目中我們經(jīng)常把FTP文件下載到內(nèi)存中,然后轉(zhuǎn)為base64給前端進(jìn)行展示。如果excel中也需要導(dǎo)出圖片,數(shù)據(jù)量大的情況下會(huì)直接返回一個(gè)后端的開(kāi)放接口地址,然后在項(xiàng)目中對(duì)接口的參數(shù)進(jìn)行鑒權(quán),或者實(shí)效性檢驗(yàn)等,最后從FTP下載圖片用流的方式傳到瀏覽器中。

但是這種方式會(huì)加大內(nèi)存的消耗,所有的文件相關(guān)的都在內(nèi)存中下載回傳給前端;報(bào)表下載的數(shù)據(jù)量很大的情況下服務(wù)很容易拖垮。所以就設(shè)想通過(guò)兩層nginx反向代理的方式是否可以滿足文件的直接訪問(wèn)。

假設(shè)FTP文件服務(wù)器的照片存放地址為:/upload/signature

傳統(tǒng)實(shí)現(xiàn)

首先我們?cè)谙螺dexcel的時(shí)候需要組裝一個(gè)url,如下所示的get請(qǐng)求就是一個(gè)對(duì)外開(kāi)放無(wú)需權(quán)限的接口,真實(shí)情況下會(huì)對(duì)realFilePath進(jìn)行加密組裝,里面放一些timestamp或者redis的key來(lái)驗(yàn)證實(shí)效性、安全性等。

  @GetMapping("/signatureImage/{path}")
    public void signatureImage(@PathVariable("path") String realFilePath, HttpServletResponse response) throws IOException {
        //realFilePath = "/20231206/qhyu.png"
        String fileName = "qhyu.png"; //可以切割獲取。
        String path = "/upload/signature"; // 固定的存放路徑
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try (Ftp ftp = new Ftp("Ftp_address", "Ftp_port", "username", "password")) {
            ftp.download(path+realFilePath, fileName, outputStream);
        } catch (Exception e) {
            log.error("FTP文件下載出錯(cuò):{}", e.getMessage());
            throw new QhyuException(MessageCode.FILE_DOENLOAD_ERROR.getCode());
        }
        // 將內(nèi)存中的文件內(nèi)容轉(zhuǎn)換為輸入流
        InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
        // 設(shè)置響應(yīng)的內(nèi)容類型為圖片格式
        String contentType = MediaType.IMAGE_PNG_VALUE; // 假設(shè)為PNG格式
        response.setContentType(contentType);
        org.apache.commons.io.IOUtils.copy(inputStream, response.getOutputStream());
        response.flushBuffer();
        // 關(guān)閉內(nèi)存流和FTP連接
        inputStream.close();
        outputStream.close();
    }

Nginx實(shí)現(xiàn)

要通過(guò)Nginx實(shí)現(xiàn)的話,基本上網(wǎng)上的方案都是讓使用lua。雖然可以但是沒(méi)必要。因?yàn)槲覐墓倬W(wǎng)上找到了解決方案,如下所示。

在這里插入圖片描述

提供一下proxy相關(guān)參數(shù)的含義:

  • proxy_set_header Host $host;

此參數(shù)設(shè)置了將客戶端請(qǐng)求中的Host頭部信息傳遞給代理服務(wù)器。$host變量表示客戶端請(qǐng)求中的主機(jī)名。

  • proxy_intercept_errors on;

當(dāng)啟用此參數(shù)時(shí),代理服務(wù)器會(huì)攔截后端服務(wù)器返回的錯(cuò)誤響應(yīng),并將其作為代理服務(wù)器的響應(yīng)返回給客戶端。這允許代理服務(wù)器處理后端服務(wù)器的錯(cuò)誤響應(yīng),并可以進(jìn)行自定義的錯(cuò)誤處理。

  • proxy_set_header X-Real-IP $remote_addr;

此參數(shù)設(shè)置了將客戶端的真實(shí)IP地址傳遞給代理服務(wù)器。$remote_addr變量表示客戶端的IP地址。

  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

此參數(shù)設(shè)置了將客戶端的IP地址添加到X-Forwarded-For頭部信息中。$proxy_add_x_forwarded_for變量表示將客戶端IP地址添加到現(xiàn)有的X-Forwarded-For頭部信息中。

  • proxy_buffering off;

當(dāng)啟用此參數(shù)時(shí),禁用代理緩沖。代理緩沖可以在接收完整的響應(yīng)后再將其發(fā)送給客戶端,以提高性能和效率。禁用緩沖意味著代理服務(wù)器會(huì)立即將收到的數(shù)據(jù)發(fā)送給客戶端,適用于需要實(shí)時(shí)數(shù)據(jù)傳輸?shù)膱?chǎng)景。

下面就是我的nginx配置:

    server {
        listen       10086;
        charset utf-8;
        access_log      /var/log/nginx/qhyu/qhyu_access.log;
        error_log      /var/log/nginx/qhyu/qhyu_error.log;
   location /verify {
        proxy_pass http://host:port/api/signatureImage/validate?realFilePath=$arg_realFilePath&signature=$arg_signature;
        proxy_set_header Host $host;
        proxy_intercept_errors on;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_buffering off;
        error_page 418 = @custom_redirect;
        error_page 420 = @custom_error;
     }
      location @custom_error{
        default_type application/json;
        return 200 'error image';
      }
      location @custom_redirect {
        rewrite ^ /signature/$arg_realFilePath last;
      }
      location /signature {
        alias /upload/signature/;
      }
}
}

然后就是編寫了一個(gè)接口,也就是在調(diào)用的時(shí)候可以訪問(wèn)/verify接口帶上參數(shù),就會(huì)跳轉(zhuǎn)到這個(gè)接口進(jìn)行校驗(yàn),如果返回的http狀態(tài)碼是418說(shuō)明校驗(yàn)通過(guò),如果返回的是420說(shuō)明校驗(yàn)失敗。

@GetMapping("/signatureImage/validate")
    public Object signatureValidate(String realFilePath,String signature,HttpServletResponse httpServletResponse){
        String redisKey = AesEncryptUtil.decryption(signature);
        if (StrUtil.isBlank(redisKey)){
            httpServletResponse.setStatus(420);
            return RenderResult.success();
        }
        Object value = redisService.get(redisKey);
        if (value == null) {
            httpServletResponse.setStatus(420);
            return RenderResult.success();
        }
        List<String> signatureUrls = JSON.parseArray(JSON.toJSONString(value), String.class);
        if (signatureUrls == null || signatureUrls.isEmpty()){
            httpServletResponse.setStatus(420);
            return RenderResult.success();
        }
        if (!signatureUrls.contains(realFilePath)){
            httpServletResponse.setStatus(420);
            return RenderResult.success();
        }
        // greater than or equal to 300 should be passed to a client or be intercepted and redirected to nginx
        // for processing with the error_page directive
        // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors
        httpServletResponse.setStatus(418);
        return RenderResult.success();
    }

分析結(jié)果

nginx的實(shí)現(xiàn)方式在校驗(yàn)失敗的時(shí)候頁(yè)面返回error image,跳轉(zhuǎn)的是420 error_page;成功的時(shí)候會(huì)訪問(wèn)FTP文件服務(wù)器的路徑,反正圖片到頁(yè)面展示。在實(shí)際的開(kāi)發(fā)過(guò)程中,外層可能還會(huì)有一個(gè)nginx反向代理,本文主要講解了一下如何使用這個(gè)方式對(duì)訪問(wèn)的文件進(jìn)行鑒權(quán)。

這樣做的好處就是不需要每個(gè)文件都下載到內(nèi)存然后使用流的方式傳輸,直接訪問(wèn)的方式減少了后端服務(wù)的壓力,并且像頭像、簽名這種可能訪問(wèn)頻繁的接口使用這種方式來(lái)處理是很棒的一種方式。

主要的思路就是拿到proxy_pass的返回信息,如果使用lua的話可以獲取到我們返回的body內(nèi)容,但是不使用lua的時(shí)候我們可以迂回處理,使用status code也一樣可以達(dá)到目的。

到此這篇關(guān)于Nginx訪問(wèn)FTP服務(wù)器文件的時(shí)效性/安全校驗(yàn)的文章就介紹到這了,更多相關(guān)Nginx訪問(wèn)FTP服務(wù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • windows下nginx如何操作命令

    windows下nginx如何操作命令

    這篇文章主要介紹了windows下nginx如何操作命令,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 記一次nginx配置不當(dāng)引發(fā)的499與failover 機(jī)制失效問(wèn)題

    記一次nginx配置不當(dāng)引發(fā)的499與failover 機(jī)制失效問(wèn)題

    近期在非高峰期也存在499超過(guò)告警閾值的偶發(fā)情況,多的時(shí)候一天幾次,少的時(shí)候則幾天一次,持續(xù)一般也就數(shù)分鐘,經(jīng)過(guò)和小伙伴的共同探究,最后發(fā)現(xiàn)之前對(duì)于499是客戶端主動(dòng)斷開(kāi)因而和服務(wù)端關(guān)系不大的想當(dāng)然認(rèn)知是錯(cuò)誤的,這里記錄一下
    2023-05-05
  • nginx反向代理https內(nèi)部定向到http報(bào)302的問(wèn)題及解決

    nginx反向代理https內(nèi)部定向到http報(bào)302的問(wèn)題及解決

    這篇文章主要介紹了nginx反向代理https內(nèi)部定向到http報(bào)302的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Nginx?簡(jiǎn)介、安裝與配置文件詳解

    Nginx?簡(jiǎn)介、安裝與配置文件詳解

    Nginx是一款輕量級(jí)和高性能的?Web?服務(wù)器、反向代理服務(wù)器、電子郵件(IMAP/POP3/SMTP)代理服務(wù)器,是帶有?BSD-like?協(xié)議的開(kāi)源產(chǎn)品,這篇文章主要介紹了Nginx?簡(jiǎn)介、安裝與配置文件詳解,需要的朋友可以參考下
    2024-04-04
  • 淺談nginx反向代理中神奇的斜線

    淺談nginx反向代理中神奇的斜線

    這篇文章主要介紹了淺談nginx反向代理中神奇的斜線,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • 如何配置nginx作為靜態(tài)文件托管服務(wù)器

    如何配置nginx作為靜態(tài)文件托管服務(wù)器

    這篇文章主要介紹了如何配置nginx作為靜態(tài)文件托管服務(wù)器的相關(guān)資料,下載nginx在windows上是個(gè)壓縮包,解壓后,使用命令行輸入nginx進(jìn)行啟動(dòng),感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • Nginx請(qǐng)求轉(zhuǎn)發(fā)配置指南

    Nginx請(qǐng)求轉(zhuǎn)發(fā)配置指南

    Nginx 是一款高性能的 HTTP 和反向代理服務(wù)器,也是一個(gè) IMAP/POP3/SMTP 代理服務(wù)器,本文檔將介紹如何使用 Nginx 配置請(qǐng)求轉(zhuǎn)發(fā),并解釋一些常用的配置參數(shù),需要的朋友可以參考下
    2024-10-10
  • 解決Nginx轉(zhuǎn)發(fā)圖片不能顯示的問(wèn)題

    解決Nginx轉(zhuǎn)發(fā)圖片不能顯示的問(wèn)題

    在使用Nginx作為反向代理將iServer的HTTP協(xié)議轉(zhuǎn)換為HTTPS協(xié)議時(shí),可能會(huì)遇到靜態(tài)資源無(wú)法加載、頁(yè)面跳轉(zhuǎn)回HTTP協(xié)議、訪問(wèn)服務(wù)管理界面權(quán)限問(wèn)題等情況,本文給大家介紹解決Nginx轉(zhuǎn)發(fā)圖片不能顯示的問(wèn)題,感興趣的朋友一起看看吧
    2024-11-11
  • 詳解Nginx 反向代理、負(fù)載均衡、頁(yè)面緩存、URL重寫及讀寫分離詳解

    詳解Nginx 反向代理、負(fù)載均衡、頁(yè)面緩存、URL重寫及讀寫分離詳解

    本篇文章主要介紹了Nginx 反向代理、負(fù)載均衡、頁(yè)面緩存、URL重寫及讀寫分離詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • 阿里云國(guó)際版使用Nginx作為HTTPS轉(zhuǎn)發(fā)代理服務(wù)器的處理方法

    阿里云國(guó)際版使用Nginx作為HTTPS轉(zhuǎn)發(fā)代理服務(wù)器的處理方法

    本文介紹了使用NGINX作為HTTPS流量轉(zhuǎn)發(fā)代理的兩種方法。它總結(jié)了NGINX使用HTTP?CONNECT隧道和NGINX流充當(dāng)HTTPS轉(zhuǎn)發(fā)代理的解決方案的原則,環(huán)境構(gòu)建要求,應(yīng)用場(chǎng)景和關(guān)鍵問(wèn)題
    2022-05-05

最新評(píng)論