要下载文件名中包含分号的文件的标头


Header to download file that contains semicolon in its filename

我已经有了一个PHP代码来强制用户下载一个文件,代码运行良好

问题是,当用户想要下载文件名中包含分号的文件时

例如如果文件名XYZ.zip

但如果文件名为aaaX;Y.zip(读作aaax[分号]Y[点]zip)当用户下载时,文件名变为aaaX

它在第一个分号中被剪切

<?php
$a=basename($_GET['fn']);
$sizepath =filesize(base64_decode($_GET['path']));
header('Content-Type: application/octet-stream');
header("Content-Disposition: attachment; filename=".$a); 
header('Cache-control: private, must-revalidate');
header('Content-Transfer-Encoding: binary');
// load the file to send:
readfile(base64_decode($_GET['path']));
?>

使用urlencode(),如下所示:

header("Content-Disposition: attachment; filename*=us-ascii'en-us'".urlencode($a));

有关更多信息,请参阅RFC 2231。

试试这个

header("Content-Disposition: attachment; filename='"" . $a . "'"" );

让用户控制最终在file_get_contents()中的变量时,请务必小心。这可能导致路径遍历漏洞。