file_exists()用于包含(&)文件名的文件

时间:2009-10-17 19:12:27

标签: php algorithm character filenames file-exists

$filename = "Sara & I.mp3";
if (file_exists($filename)) {
 ...
}

如果文件名为“&”,则file_exists

不会返回PHP

如何在$ {1}}的$ filename中转义“&”?

已经尝试过file_existsurlecode()urlrawencode(),并且已经过了'&'用反斜杠(\&)...没有去

PS。这是在运行RedHat5的Linux系统上

提前致谢

5 个答案:

答案 0 :(得分:3)

这些文件是否由用户上传?我通常重命名任何上传的文件只使用字母A-Z,数字0-9和_或 - 加上文件扩展名如.pdf,以避免特殊字符的问题。空格转换为_。

TYPO3,一个基于PHP的大型CMS,例如使用这些正则表达式来清理文件名:

$fileName = preg_replace('/[^.[:alnum:]_-]/','_',trim($fileName));  // converting all on alphanumeric chars to _
$fileName = preg_replace('/\.*$/','',$fileName); // removing dot . after file extension

因此foo&.pdf.的输入将转换为foo.pdf

答案 1 :(得分:2)

该脚本似乎对我有用。

确保您检查的文件位于运行脚本的目录中。

使用getcwd()查看脚本的运行位置。

e.g。如果你的脚本在我的/ scripts / script.php中 但是如果它被my / other / scripts / index.php中的另一个脚本包含和调用,那么你的脚本实际上将在my / other / scripts目录中运行,而不是像你期望的那样在my / scripts目录中运行

答案 2 :(得分:1)

如果它是一个文件,不应该像文件系统期望的那样逃避?它不应该是\&或者也许是基于unicode的转义序列(此刻逃脱了我;-)?

答案 3 :(得分:1)

我假设您将参数作为GET请求传递,例如script.php?file=this & that.mp3

首先要确保检查输入真的很好,这样用户就无法删除任意文件。第二:在创建链接时使用urlencode对文件名进行编码。 &的编码字符为%26

您的脚本会像这样被调用:script.php?file=this%20%26%20that.mp3%20是一个空格)

否则你将有另一个GET变量,即that.mp3,未被分配。 &用于分隔GET请求中的单个参数

修改
我身边的一个问题:你如何删除你的文件?使用php的unlink函数?或使用exec并在您的系统上调用rm? (通常非常不安全)。如果你这样做,你可以使用escapeshellarg。如果你没有转义你的shell输入,你的shell会将你的命令解释为两个命令(afaik,不要相信我的话)

答案 4 :(得分:0)

&符号来自哪里 - 用户输入还是它真的在你的脚本中?那里的编码可能会混淆。

另外,当你在目录上执行glob()时,会得到什么结果?该文件是否带有&符号?如果你复制&粘贴glob()输出并在其上运行file_exists()?