首页 > 解决方案 > 通过更改 php 中 url 参数中的路径来防止用户下载其他文件

问题描述

我有一个通过 $_GET 接收文件名的下载功能,我想防止用户下载其他文件更改路径并访问系统中的其他文件。

方法:

 function actionDownload($arquivo) {
        try {
            $filepath = \Yii::getAlias('@webroot') . '/files/coordenadas/'. $arquivo;
            if (file_exists($filepath)){
                return \Yii::$app->getResponse()->sendFile(\Yii::getAlias('@webroot') . '/files/coordenadas/'. $arquivo, $arquivo);
            }
        }
        catch (\Exception $exception) {
            throw new NotFoundHttpException("Arquivo não encontrado");
        }
    }

下载方法的路径:

.../converter-coordenadas/download?arquivo=geografica-utm-20200830171051.xlsx

如果有人将arquivo变量更改为另一个有效路径,它将能够下载其他文件。如何防止这种情况,但保持函数在 url 参数中接收文件名?

我的情况是:

  1. 用户通过ajax上传文件
  2. 我转换这个文件并返回文件名
  3. 创建一个带有新文件链接的下载按钮。

我没有任何其他信息可以与文件建立关系,例如用户 ID。

标签: phphtmlyii2

解决方案


正如@GetSet 在评论中解释的那样,最大的问题是程序上的。正确执行此操作的一种方法如下:

  1. 将文件上传到您的服务器并将参考保存在数据库中(您已经在这样做)并为此文件(或此下载)生成唯一 ID。此 ID 将保存在数据库字段中,例如名称:“donwload_id”

  2. 然后在视图中(当您创建下载链接时):

    Html::a('Download', [Url::to('donwload-action'), 'download_id' => $model- >download_id]);

  3. 在您的控制器中,您将知道如何通过其唯一标识符 (download_id) 查找文件。

没有人知道您是如何生成此 ID 的,因此任何人都很难再次生成它。您还可以通过为链接设置到期日期来限制下载文件的可用时间。


推荐阅读