Подтвердить что ты не робот

PHP escape пользовательский ввод для имени файла

У меня есть форма, в которой пользователи могут загружать файлы, и я хотел бы назвать файл чем-то вдоль строк [id]_[lastname]_[firstname].pdf. Имя вводится пользователем, и я боюсь, что они вводят что-то с косой чертой. В противном случае что-то вроде $path = $dir.$filename может привести к $path = 'uploads/2_smith_john/hahaimajerk.pdf', если первое имя john/hahaimajerk.

Я действительно не хочу заставить пользователей ограничивать свои имена чем-либо; Я не возражаю изменить их имена немного в имени файла, пока я могу указать исходное имя. Какие персонажи мне нужно бежать, или есть ли другой способ сделать это? Или... я просто использую mysql_real_escape_string?

4b9b3361

Ответ 1

mysql_real_escape_string не будет выходить из строчки. Даже escapeshellarg этого не сделает. Вам нужно будет использовать str_replace:

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

Ответ 2

Я обычно использую для этого регулярные выражения. Вместо того, чтобы удалять определенные определенные символы (например, слэши, точки и т.д.), Я предпочитаю разрешать только определенные символы (например, буквенно-цифровые)

Например, это заменит символ, который не является буквой, числом, тире или подчеркиванием символом подчеркивания:

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

Обратная косая черта перед тире состоит в том, чтобы избежать тире в регулярном выражении, поскольку тире используются в других случаях для указания диапазонов символов (например, A-Z).

Ответ 3

Единственный "небезопасный" символ в имени файла - / - поэтому вы можете легко избежать проблем, используя str_replace("/","",$filename)