$filename = "Sara & I.mp3";
if (file_exists($filename)) {
...
}
如果文件名为“&
”,则file_exists
如何在$ {1}}的$ filename中转义“&
”?
已经尝试过file_exists
,urlecode()
,urlrawencode()
,并且已经过了'&'用反斜杠(\&)...没有去
PS。这是在运行RedHat5的Linux系统上
提前致谢
答案 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()?