PHP: избежать имени файла, как это делает Linux

У меня проблемы с загрузкой имен файлов пользователями, которые я должен обработать. Когда я пытаюсь получить к ним доступ, поскольку некоторые из них имеют специальные символы, используемая команда говорит, что файл не найден или что-то подобное.

Я использовал escapeshellcmd без успеха.

Когда я использую клавишу «tab» в консоли Linux (когда вы начали вводить имя файла и хотите, чтобы оно завершилось), bash правильно экранирует имя файла, и если я использую именно это «экранированное» имя файла, это работает.

Я пробовал это:

preg_replace("/[^a-zA-Z0-9\-\.\s]/", "\\\\$0", $filename)

экранировать все, кроме цифр, букв, - и пробелов... но я обнаружил, что для файла "test_1.jpg" эта команда преобразует его в "test_1.jpg", и это не работает, так как "_" НЕ нужно быть преобразованным.

Я боюсь, что может быть больше «разрешенных» символов, поэтому мой вопрос: как я могу «клонировать» функцию escape клавиши «tab» в консоли Linux bash?

Спасибо !


person FlamingMoe    schedule 14.02.2011    source источник
comment
Почему вы не переименовываете файлы при загрузке?   -  person Michiel Pater    schedule 14.02.2011
comment
извините, но я не вижу разницы между test_1.jpg и test_1.jpg ??   -  person Mr Coder    schedule 14.02.2011


Ответы (4)


Если вы хотите использовать имя файла в качестве параметра команды оболочки, вы можете использовать функцию escapeshellarg.

person lightbyte    schedule 16.10.2013

Я использую это как для имен файлов, так и для создания URL-адресов из заголовков сообщений в блогах и тому подобного.

// everything to lower and no spaces begin or end
$path = strtolower(trim($path));

// adding - for spaces and union characters
$find = array(' ', '&', '\r\n', '\n', '+',',');
$path = str_replace ($find, '-', $path);

//delete and replace rest of special chars
$find = array('/[^a-z0-9\-<>]/', '/[\-]+/', '/<[^>]*>/');
$repl = array('', '-', '');
$path = preg_replace ($find, $repl, $path);
person Chris Baker    schedule 14.02.2011
comment
извините, но я НЕ могу переименовать файл, мне нужно то же имя файла, которое загружает пользователь - person FlamingMoe; 15.02.2011
comment
Не переименовывать файл небезопасно. Что, если бы кто-то опубликовал файл с именем ../../.htaccess с кучей правил для обхода настроек безопасности сервера? Или стереть файл паролей? Или предоставить сценарий оболочки в виде файла php в общедоступном каталоге? Очень важно очистить имена файлов. Вы никогда не нуждаетесь и не хотите принимать за чистую монету любой мусор, который дает вам пользователь — если это действительно ограничение проекта, то ограничения в корне ошибочны. - person Chris Baker; 17.11.2012

Если вы обращаетесь к этим файлам непосредственно на своем веб-сервере, имена ваших файлов должны быть закодированы в URL-адресе с помощью urlencode, а не escapeshellcmd.

person soju    schedule 14.02.2011
comment
Вы меня не поняли: P Я получаю доступ к этим файлам через команду EXEC, так как мне нужно что-то с ними сделать, например, консоль ... единственное, что мне нужно, это НАЗВАНИЕ ВОПРОСА ... как сбежать, как это делает linux ... Я думаю, что он избегает всего, кроме az\. но я не уверен - person FlamingMoe; 17.02.2011

это функция, которую я собрал, надеюсь, она поможет

вы все можете добавить больше, добавив | с другим сбежавшим персонажем

public function linuxFilename($file)
{
    //make the linux filename perfect
    return preg_replace("/ |'|\(|\)/", '\\\${0}', $file);
}
person Mooseh    schedule 19.07.2018