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

如果文件名有“ &” PHP 不返回 truefile_exists

我怎样才能&在 $filename 中转义“”file_exists才能正常工作?

已经尝试过urlecode(), urlrawencode(), htmlentities(), 并使用反斜杠 (\&) 转义“&”...不行

附言。这是在运行 RedHat5 的 linux 系统上

提前致谢

4

5 回答 5

3

这些文件是用户上传的吗?我通常将任何上传的文件重命名为仅使用字母 AZ、数字 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

于 2009-10-17T19:26:35.323 回答
2

该脚本似乎对我有用。

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

使用 getcwd() 查看脚本在哪里运行。

例如,如果您的脚本在 my/scripts/script.php 中,但如果它被 my/other/scripts/index.php 中的另一个脚本包含并调用,那么您的脚本实际上将在 my/other/scripts 目录中运行,而不是在您可能期望的 my/scripts 目录

于 2009-10-20T23:59:17.730 回答
1

如果它是一个文件,不应该像文件系统期望的那样转义吗?它不应该是类似于 \& 的东西,或者可能是基于 unicode 的转义序列(这让我现在无法理解 ;-) 吗?

于 2009-10-17T19:26:37.407 回答
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,不要相信我的话)

于 2009-10-17T20:33:54.120 回答
0

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

另外,当您对目录执行 glob() 时,您会得到什么结果?带有&符号的文件在那里吗?如果您复制并粘贴 glob() 输出并在其上运行 file_exists() 会发生什么?

于 2009-10-21T10:34:05.383 回答