gpt4 book ai didi

PHP - 如何在 Content-Disposition 中设置完整的目录路径?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:53:19 26 4
gpt4 key购买 nike

我正在将文件名传递给下载页面。
即 somefile.xls

下载页面将完整的目录路径添加回文件名。
即 c:\temp\somefile.xls

问题是现在设置 header 的“Content-Disposition”不起作用。它要下载的文件名是完整的目录文件名路径。 即c_temp_somefile

Content-Disposition 能否处理完整路径?

如果可以,我该如何让我的脚本正确下载文件?

代码是:

$myad = $_GET['myad'];
$glob_string = realpath('/foldera/folderb/folderc'). DIRECTORY_SEPARATOR .$myad;

header('Content-Type: application/excel');
$headerstring = 'Content-Disposition: attachment; filename='.$glob_string;
header($headerstring);
readfile($myad);

更新代码(来自答案):

$myad = $_GET['myad'];
$glob_string = realpath('/mit/mit_tm/mrl_bol'). DIRECTORY_SEPARATOR .$myad;

header('Content-Type: application/excel');
$headerstring = 'Content-Disposition: attachment; filename='.$myad;
header($headerstring);
readfile($glob_string);

最佳答案

不要通过 header 字符串传递完整路径,而是使用基本名称 ($myad)。

您真的应该为 $_GET['myad'] 使用更好的验证,因为您的脚本会将任意路径传递给用户(readfile() 获取未过滤的用户输入)。这是一个安全漏洞!

使用realpath 计算真实路径,确保文件在允许的文件夹内,然后在完整路径上使用basename() 获取纯文件名.通过 Content-Disposition header 传递此子字符串,但使用 readfile() 的真实路径。


更新:您更新后的代码仍然包含安全漏洞。如果 $_GET['myad'] 包含 ../../../some/full/path,您的脚本将很乐意将任何请求的可读文件发送到客户端.

您应该使用与以下代码片段类似的内容:

$myad = $_GET['myad'];

$rootDir = realpath('/mit/mit_tm/mrl_bol');
$fullPath = realpath($rootDir . '/' . $myad);

// Note that, on UNIX systems, realpath() will return false if a path
// does not exist, but an absolute non-existing path on Windows.
if ($fullPath && is_readable($fullPath) && dirname($fullPath) === $rootDir) {
// OK, the requested file exists and is in the allowed root directory.
header('Content-Type: application/excel');
// basename() returns just the file name.
header('Content-Disposition: attachment; filename=' . basename($fullPath));
readfile($fullPath);
}

关于PHP - 如何在 Content-Disposition 中设置完整的目录路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1757503/

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