无法转义文件名中的“&”,使得 file_exists 的计算结果为真
Can't escape the '&' in a filename such that file_exists evaluates to true
这是 PHP 应用 运行 在 Linux Docker 容器中。
- 从名为“A & T.pdf”的 FE 上传了一个文件。
- 文件名在数据库中保存为“A & T.pdf”。
- 文件在 Azure 文件存储中保存为“A & T.pdf”。
当我们去下载文件时,它说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
这是 PHP 应用 运行 在 Linux Docker 容器中。
- 从名为“A & T.pdf”的 FE 上传了一个文件。
- 文件名在数据库中保存为“A & T.pdf”。
- 文件在 Azure 文件存储中保存为“A & T.pdf”。
当我们去下载文件时,它说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