PHP转义用户input的文件名

我有一个表单,用户可以上传文件,我想命名该文件沿[id]_[lastname]_[firstname].pdf 。 这个名字是由用户input的,我怕他们在里面input一些东西。 否则,如果名字是john/hahaimajerk ,那么$path = $dir.$filename可能会导致$path = 'uploads/2_smith_john/hahaimajerk.pdf'

我真的不想强迫用户限制他们的名字, 只要能说出原来的名字,我不介意在文件名上稍微改名。 我需要什么字符才能逃脱,还是有其他方法可以做到这一点? 或者…我只是使用mysql_real_escape_string

mysql_real_escape_string不会溢出斜杠。 即使escapeshellarg不会这样做。 你将不得不使用str_replace

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

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

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

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

破折号之前的反斜杠是为了逃避正则expression式中的破折号,因为破折号用于指定字符范围(如AZ)。

文件名中唯一的“不安全”字符是/ – 所以你可以很容易地避免使用str_replace("/","",$filename)

escapeshellcmd可能也有帮助。

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

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