我有一个用户可以上传文件的表单,我想将文件命名为[id]_[lastname]_[firstname].pdf
。该名称由用户输入,我害怕他们输入带斜线的东西。否则,如果名字是$path = $dir.$filename
,$path = 'uploads/2_smith_john/hahaimajerk.pdf'
之类的内容可能会产生john/hahaimajerk
。
我真的不想强迫用户将他们的名字限制为任何东西;我不介意在文件名中稍微更改一下他们的名字,只要我能说出原来的名字。我需要逃脱哪些角色,还是有其他方法可以做到这一点?或者......我只是使用mysql_real_escape_string
?
答案 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 \\/\(\)_