gpt4 book ai didi

php - 简单的文件下载器

转载 作者:行者123 更新时间:2023-12-04 05:54:31 27 4
gpt4 key购买 nike

我是 php 的新手,通过阅读 SO 上列出的一些问题,设法将这个简单的下载脚本串在一起,并想请那些更熟悉 php 的人看看下面的代码,看看如果我的实现有任何明显的缺陷或任何应该改变的东西。

只是让您知道,在我有限的测试期间,一切似乎都运行良好,但正如我所说,我对 php 还很陌生,并希望确保我不会遗漏一些可能会在以后破坏脚本的内容。

<?php

//Settings
$filesPath = './files';
$fileName = $_GET['file'];
$allowedExts = array('jpg','png','gif');


//Functions
//Returns the extension portion of a filename.
function file_extension($fileName)
{
$path_info = pathinfo($fileName);
return strtolower($path_info['extension']);
}

//Validation and processing
//Check that a file is actually being requested
if (empty($fileName)) {
die('no file was requested');
}

//Check that the file is allowed to be downloaded
if (!in_array(file_extension($fileName), $allowedExts)) {
die('you cannot download this file');
}

//Get the file
if (file_exists($filesPath . DIRECTORY_SEPARATOR . $fileName)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($fileName));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($fileName));
ob_clean();
flush();
readfile($fileName);
exit;
}
?>

TIA,
戴夫

最佳答案

您的脚本可能容易受到目录遍历的影响。在你的情况下,我会使用 realpath()在文件名上并检查它是否是 .files/ 内的有效文件.

有人可能会遍历目录树并窃取诸如 /etc/passwd 之类的文件。等等。

关于php - 简单的文件下载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9680204/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com