如何解决通过更改php
我有一个下载功能,可以通过$ _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参数中?
我遇到的情况是:
- 用户通过ajax上传文件
- 我将转换此文件并返回文件名
- 创建一个带有新文件链接的下载按钮。
我没有其他信息可以与文件建立联系,例如用户ID。
解决方法
正如@GetSet在评论中解释的那样,最大的问题是程序性的。正确执行此操作的一种方法如下:
-
将文件上传到服务器,并将引用保存在数据库中(您已经在做),并为此文件(或此次下载)生成唯一的ID。该ID将保存在数据库字段中,例如,名称为“ donwload_id”
-
然后在视图中(创建下载链接时):
Html::a('Download',[Url::to('donwload-action'),'download_id' => $model- >download_id]);
-
在您的控制器中,您将知道如何通过其唯一标识符(download_id)查找文件。
没人知道您是如何生成此ID的,因此任何人都很难再次生成它。另外,您可以通过为链接设置过期日期来限制下载文件的时间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。