鍍金池/ 問(wèn)答/C  HTML/ 前端怎樣實(shí)現(xiàn)下載文件,而不暴露文件路徑(不被抓包工具抓到)或者即使被抓到再次通過(guò)

前端怎樣實(shí)現(xiàn)下載文件,而不暴露文件路徑(不被抓包工具抓到)或者即使被抓到再次通過(guò)路徑直接訪問(wèn)也拿不到文件

前端怎樣實(shí)現(xiàn)下載文件,而不暴露文件路徑(不被抓包工具抓到)或者即使被抓到再次通過(guò)路徑直接訪問(wèn)也拿不到文件

回答
編輯回答
尐懶貓

1.用action 向流里寫字節(jié)流

  1. 用時(shí)間hash 后做key

3.收到key 后驗(yàn)key 給文件

2017年6月26日 23:04
編輯回答
詆毀你

java后端使用
OutputStream os = response.getOutputStream();

                    int length;
                    os.write(bytes, 0, bytes.length);
                    這個(gè)輸出流到前端,這樣前端只能下載文件,而得不到文件路徑
2017年2月26日 01:07
編輯回答
雨蝶

下載 是后端返回文件數(shù)據(jù)的操作 所以判別是否返回?cái)?shù)據(jù)的工作應(yīng)在后臺(tái)完成
原則上后臺(tái)不會(huì)信任前端傳來(lái)的任何標(biāo)志信息 都要進(jìn)行校驗(yàn) 所以你前端只管提供鏈接就可以 鏈接打開(kāi)后 是否返回?cái)?shù)據(jù)由后端來(lái)決定

2017年12月3日 05:49
編輯回答
柒喵

不可能。

.

2017年10月30日 12:51
編輯回答
有你在

使用一次性的下載鏈接,抓包工具抓到到也沒(méi)用。

2018年7月27日 01:44
編輯回答
情已空

后來(lái)通過(guò)的是使用后臺(tái)驗(yàn)證的方法,前端在網(wǎng)站上點(diǎn)擊的時(shí)候向后臺(tái)傳遞用戶的id,后臺(tái)設(shè)置對(duì)應(yīng)id的一個(gè)token值,并將文件下載到服務(wù)器,然后前端再訪問(wèn)此php,后臺(tái)根據(jù)是否有token值決定向前臺(tái)是否傳輸文件,傳輸過(guò)后則刪除此token,下次再直接訪問(wèn)此php則因?yàn)闊o(wú)token而不提供傳輸文件

<?php
    header('Access-Control-Allow-Origin:*');
    $action = $_REQUEST["action"];
    $uid = $_REQUEST['uid'];
    if($action == "setToken"){
        $time = time();
        $json_string = file_get_contents('data.json');
        $data = json_decode($json_string, true);
        $data[$uid] = $time;
        $json_string = json_encode($data);
        file_put_contents('data.json', $json_string);
        echo "success";
    }else if($action == "getToken"){
        $json_string = file_get_contents('data.json');
        $data = json_decode($json_string, true);
        echo  $data[$uid];
    }else if($action == "compare"){
        $time = time();
        $json_string = file_get_contents('data.json');
        $data = json_decode($json_string, true);
        $dec = (int)$time - (int)$data[$uid];
        if($dec < 1){            
            download();
            echo "下載成功";
        }else{
            echo "失效";
        }
    }

    function download(){
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, "http://img.kuaxue.com/G_compress/".$_REQUEST['fileUrl']);
            curl_setopt($ch, CURLOPT_REFERER, "");
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            $cexecute = curl_exec($ch);
            curl_close($ch);
            file_put_contents(basename($_REQUEST['fileUrl']),$cexecute);
            
            $file_url=basename($_REQUEST['fileUrl']);
            $new_name= $_REQUEST['new_name'];
            if(!isset($file_url)||trim($file_url)==''){
                echo '500';
            }
            if(!file_exists($file_url)){ //檢查文件是否存在
                echo '404';
            }
            $file_name=basename($file_url);
            $file_type=explode('.',$file_url);
            $file_type=$file_type[count($file_type)-1];
            $file_name=trim($new_name=='')?$file_name:($new_name);
            $file_type=fopen($file_url,'r'); //打開(kāi)文件
            //輸入文件標(biāo)簽
            header("Content-type: application/octet-stream");
            header("Accept-Ranges: bytes");
            header("Accept-Length: ".filesize($file_url));
            header("Content-Disposition: attachment; filename=".$file_name);
            //輸出文件內(nèi)容
            echo fread($file_type,filesize($file_url));
            fclose($file_type);
            unlink($file_url);
        }
?>
2017年10月17日 10:00
編輯回答
硬扛

每次下載請(qǐng)求前先獲取一個(gè)后臺(tái)隨機(jī)生成的一次性加密值,下載請(qǐng)求帶上加密值,驗(yàn)證成功才能下載

2018年6月5日 01:39
編輯回答
情殺

給圖片配上路由信息。

2018年7月29日 20:32
編輯回答
心癌

題主采納的答案是用PHP完成傳輸,這么做小文件還行,大文件,那就坑爹了。

PHP本職工作不是干文件傳輸,不建議這樣搞。

正確的做法,以 Nginx + PHP 為例應(yīng)該是:

1、指定一個(gè)加密鏈接規(guī)則,如 /download/xiaoming.zip?time=1520907835&sign=md5(download=xiaoming.zip&time=1520907835&key=私有密鑰)
2、PHP 完成用戶鑒權(quán),并按加密鏈接規(guī)則返回加密鏈接
3、Nginx 負(fù)責(zé)處理下載目錄的請(qǐng)求

     先檢查鏈接參數(shù),參數(shù)格式不對(duì),拒絕訪問(wèn)
     然后檢查鏈接簽名,簽名錯(cuò)了,拒絕訪問(wèn)
     然后計(jì)算 time 距離現(xiàn)在多久,超過(guò)特定時(shí)間(如30分鐘),拒絕訪問(wèn)
     最后,符合要求的,輸出文件
2017年8月12日 23:34