无法转义文件名中的“&”,使得 file_exists 的计算结果为真

Can't escape the '&' in a filename such that file_exists evaluates to true

这是 PHP 应用 运行 在 Linux Docker 容器中。

当我们去下载文件时,它说ERROR: File 'A' doesn't exist。它显然是在&符号之前切断了文件名。

$filename = get_get('file', '0', 'string', 255);
$file=$CFG->questdir.$filename;

if (file_exists($file)) {
  ...
} else {
  echo "ERROR: File '$filename' doesn't exist";
}

我尝试了很多不同的东西:str_replace($file, '&', '\&')addeslashes()urlencode(),还有一些我没有想到的东西。

像这样的事情应该继续进行,正在修复。

此时,我很好奇如何解决这个错误?

数据库名称正确。存储具有正确的名称。 PHP 不喜欢符号。如何在传递给 file_exists() 的变量中正确地转义它?

编辑:

按照步骤,文件名似乎在这里被截断了:

function get_get($name,$default='',$type='string',$maxlenght=0){
    if(!isset($_GET[$name])) {
        $var=$default; //Default
    } else {
        $var=trim($_GET[$name]);
        if(strlen($var)>$maxlenght) $var=substr($var,0,$maxlenght);
        settype($var,$type);
        if($type=="string" && !get_magic_quotes_gpc())  {
            $var=pg_escape_string(my_connect(), $var);
        }
    }

    return $var;
}

看起来它在 $var=trim($_GET[$name]); 处被截断了。

我敢打赌,这个问题实际上并不是 PHP,因为 & 不是 PHP 的特殊字符,并且考虑到错误,它实际上似乎是 space有争议。虽然 space 和 & 在 PHP 中不是特殊字符,但它们在 URL 中。所以,我怀疑发生的事情是你的 URL 类似于

http://www.example.org/script.php?name=A & T.pdf

这需要 URL 编码

http://www.example.org/script.php?name=A%20%26%20T.pdf

PHP 有一个命令,如果你用它来设置 URL,你可以使用它,否则请谷歌搜索在线 URL 编码器:https://www.php.net/manual/en/function.urlencode.php