Intereting Posts
Могу ли я создать узел в neo4j с указанным идентификатором? Разрешения на работу и папки Cron – разрешение отклонено Создание пользовательской функции MySQL? Как получить строку между последними вложенными `(` и `)`? Как отображать только 5 записей на страницу из моей таблицы базы данных mysql через разбиение на страницы? PHP Script для загрузки исходного кода веб-страницы и поиска определенной строки Получение уникальных значений из 2 массивов Компонент конфигурации Symfony и сервис для Doctrine DBAL Насколько безопасны переменные сеанса PHP? Eclipse (PDT) досадно блокирует файлы .phtml для типа содержимого PHP Где находится таблица, которая содержит «Специальную цену» в Magento? Как проверить, изменилось ли значение объекта JSON при захвате нового запроса cakephp в одной форме, несколько моделей, не отображая сообщения проверки модели Как нажимать хеш в массив хэш в php? Как получить содержимое страницы с помощью cURL?

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

У меня есть форма, в которой пользователи могут загружать файлы, и я хотел бы назвать файл чем-то рядом с [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 \\/\(\)_