php - 通过更改 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 参数中接收文件名?
我的情况是:
- 用户通过ajax上传文件
- 我转换这个文件并返回文件名
- 创建一个带有新文件链接的下载按钮。
我没有任何其他信息可以与文件建立关系,例如用户 ID。
解决方案
正如@GetSet 在评论中解释的那样,最大的问题是程序上的。正确执行此操作的一种方法如下:
将文件上传到您的服务器并将参考保存在数据库中(您已经在这样做)并为此文件(或此下载)生成唯一 ID。此 ID 将保存在数据库字段中,例如名称:“donwload_id”
然后在视图中(当您创建下载链接时):
Html::a('Download', [Url::to('donwload-action'), 'download_id' => $model- >download_id]);
在您的控制器中,您将知道如何通过其唯一标识符 (download_id) 查找文件。
没有人知道您是如何生成此 ID 的,因此任何人都很难再次生成它。您还可以通过为链接设置到期日期来限制下载文件的可用时间。
推荐阅读
- powershell - 当脚本有开关时,如何从命令提示符运行 PowerShell Invoke-Command?
- docker-compose - 环境优先级和端口
- r - 带有十进制数字的华夫饼图
- angular - Angular 和 Selenium Webdriver:未知错误:找不到 Chrome 二进制文件
- react-native - 反应原生的常量
- r - 在 R 中按天删除观察
- javascript - HighCharts 中的 PLotLines 重叠 || 反应高图表 || Y轴间隔
- iis - 无法在 IIS 的共享文件夹中写入图像
- python-3.x - 模块“csv”没有属性“writerow”
- c# - HttpClient 和连接:关闭 HttpRequestHeaders