在PHP下载中正确转义文件名中的错误字符


Properly escaping bad characters from filename in a PHP download

我有一个php脚本,从文档根目录下的文件夹下载文件。

$getdir = $_GET['dir'];
$getdoctype = $_GET['doctype'];
$getfile = $_GET['filename'];
if ( !preg_match('/^[a-zA-Z]+[a-zA-Z0-9's'_'-]+$/', urldecode($getdir)) ||
     !preg_match('/^[a-zA-Z]+[a-zA-Z0-9's'_'-]+$/', urldecode($getdoctype))) {
    die('Bad parameter!');
}
$dir = "/var/www/uploads/$getdir/$getdoctype/";
$type = mime_content_type( $dir . $getfile );
if (file_exists($dir . $getfile)) {
header('Content-Type: ' . $type);
header('Content-Disposition: attachment;filename=' . $getfile);
readfile($dir . $getfile);
}
else{
echo "File Not Found";
}

问题是很多时候上传到我的网站的文件有无效字符,如+ # %()很多这些字符在本地是ok的,但在网络上它们被解释为其他东西。使用我现有的脚本,我如何实现正确转义这些字符,使我的下载工作?

您可以通过将文件名括在引号

中来避免在文件下载中使用一些特殊字符
header('Content-Disposition: attachment;filename="' . $getfile . '"');

或者您可以使用regex删除特殊字符,尽管这不是最好的选择。

用于字母数字和下划线的正则表达式

在正则表达式中使用

$filteredName = preg_replace('/[^a-z0-9'.]/i', '', $filename);