PHP转义文件名的用户输入

时间:2010-11-27 03:01:31

标签: php

我有一个用户可以上传文件的表单,我想将文件命名为[id]_[lastname]_[firstname].pdf。该名称由用户输入,我害怕他们输入带斜线的东西。否则,如果名字是$path = $dir.$filename$path = 'uploads/2_smith_john/hahaimajerk.pdf'之类的内容可能会产生john/hahaimajerk

我真的不想强迫用户将他们的名字限制为任何东西;我不介意在文件名中稍微更改一下他们的名字,只要我能说出原来的名字。我需要逃脱哪些角色,还是有其他方法可以做到这一点?或者......我只是使用mysql_real_escape_string

4 个答案:

答案 0 :(得分:72)

我通常使用正则表达式。而不是删除某些特定字符(如斜线,点等),我更喜欢只允许某些字符(如字母数字)

例如,这将用下划线替换任何不是字母,数字,短划线或下划线的字符:

$escaped = preg_replace('/[^A-Za-z0-9_\-]/', '_', $raw);

破折号前面的反斜杠用于转义正则表达式中的破折号,否则破折号用于指定字符范围(例如A-Z)。

答案 1 :(得分:12)

mysql_real_escape_string不会逃避斜杠。即使escapeshellarg也不会这样做。您必须使用str_replace

$path = str_replace('/', '_', $path);

答案 2 :(得分:3)

文件名中唯一的“不安全”字符是/ - 因此您可以使用str_replace("/","",$filename)

轻松避免出现问题

答案 3 :(得分:-2)

escapeshellcmd也可能会有所帮助。

http://php.net/manual/en/function.escapeshellcmd.php

echo escapeshellcmd("\/()_") -> will display \\/\(\)_