前端怎样实现下载文件,而不暴露文件路径(不被抓包工具抓到)或者即使被抓到再次通过路径直接访问也拿不到文件

发布于 2022-09-06 20:19:19 字数 59 浏览 13 评论 0

前端怎样实现下载文件,而不暴露文件路径(不被抓包工具抓到)或者即使被抓到再次通过路径直接访问也拿不到文件

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

烂柯人 2022-09-13 20:19:19

题主采纳的答案是用PHP完成传输,这么做小文件还行,大文件,那就坑爹了。

PHP本职工作不是干文件传输,不建议这样搞。

正确的做法,以 Nginx + PHP 为例应该是:

1、指定一个加密链接规则,如 /download/xiaoming.zip?time=1520907835&sign=md5(download=xiaoming.zip&time=1520907835&key=私有密钥)
2、PHP 完成用户鉴权,并按加密链接规则返回加密链接
3、Nginx 负责处理下载目录的请求

     先检查链接参数,参数格式不对,拒绝访问
     然后检查链接签名,签名错了,拒绝访问
     然后计算 time 距离现在多久,超过特定时间(如30分钟),拒绝访问
     最后,符合要求的,输出文件
感情旳空白 2022-09-13 20:19:19

不可能。

.

梦断已成空 2022-09-13 20:19:19

使用一次性的下载链接,抓包工具抓到到也没用。

清风疏影 2022-09-13 20:19:19

1.用action 向流里写字节流

  1. 用时间hash 后做key

3.收到key 后验key 给文件

彻夜缠绵 2022-09-13 20:19:19

每次下载请求前先获取一个后台随机生成的一次性加密值,下载请求带上加密值,验证成功才能下载

别再吹冷风 2022-09-13 20:19:19

给图片配上路由信息。

层林尽染 2022-09-13 20:19:19

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

                    int length;
                    os.write(bytes, 0, bytes.length);
                    这个输出流到前端,这样前端只能下载文件,而得不到文件路径
赠我空喜 2022-09-13 20:19:19

下载 是后端返回文件数据的操作 所以判别是否返回数据的工作应在后台完成
原则上后台不会信任前端传来的任何标志信息 都要进行校验 所以你前端只管提供链接就可以 链接打开后 是否返回数据由后端来决定

国粹 2022-09-13 20:19:19

后来通过的是使用后台验证的方法,前端在网站上点击的时候向后台传递用户的id,后台设置对应id的一个token值,并将文件下载到服务器,然后前端再访问此php,后台根据是否有token值决定向前台是否传输文件,传输过后则删除此token,下次再直接访问此php则因为无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'); //打开文件
            //输入文件标签
            header("Content-type: application/octet-stream");
            header("Accept-Ranges: bytes");
            header("Accept-Length: ".filesize($file_url));
            header("Content-Disposition: attachment; filename=".$file_name);
            //输出文件内容
            echo fread($file_type,filesize($file_url));
            fclose($file_type);
            unlink($file_url);
        }
?>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文