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