У меня есть форма, в которой пользователи могут загружать файлы, и я хотел бы назвать файл чем-то рядом с [id]_[lastname]_[firstname].pdf
. Имя вводится пользователем, и я боюсь, что они вводят что-то с косой чертой. В противном случае что-то вроде $path = $dir.$filename
может привести к $path = 'uploads/2_smith_john/hahaimajerk.pdf'
если $path = 'uploads/2_smith_john/hahaimajerk.pdf'
имя – john/hahaimajerk
.
Я действительно не хочу заставить пользователей ограничивать свои имена чем-либо; Я не возражаю изменить их имена немного в имени файла, пока я могу указать исходное имя. Какие персонажи мне нужно бежать, или есть ли другой способ сделать это? Или … я просто использую mysql_real_escape_string
?
mysql_real_escape_string
не будет mysql_real_escape_string
слэши. Даже escapeshellarg
этого не сделает. Вам нужно будет использовать str_replace
:
$path = str_replace('/', '_', $path);
Обычно я использую для этого регулярные выражения. Вместо того, чтобы удалять определенные символы (например, слэши, точки и т. Д.), Я предпочитаю разрешать только определенные символы (например, буквенно-цифровые)
Например, это заменит любой символ, который не является буквой, числом, тире или подчеркиванием символом подчеркивания:
$escaped = preg_replace('/[^A-Za-z0-9_\-]/', '_', $raw);
Обратная косая черта перед тире состоит в том, чтобы избежать тире в регулярном выражении, поскольку тире используются в других случаях для указания диапазонов символов (например, AZ).
Единственным «небезопасным» символом в имени файла является /
– поэтому вы можете легко избежать проблем с помощью str_replace("/","",$filename)
escapeshellcmd тоже может помочь.
http://php.net/manual/en/function.escapeshellcmd.php
echo escapeshellcmd("\/()_") -> will display \\/\(\)_