Я ищу функцию PHP для очистки строк в безопасные и допустимые имена файлов без разделителей каталогов (косая черта).
В идеале это должно быть обратимо, и это не должно шифровать имя больше, чем необходимо.
Конечно, я хочу предотвратить преднамеренные атаки через каталоги. Но я также хочу предотвратить создание подпапок.
Я понял что urlencode()
будет работать, но мне интересно, если этого достаточно, и / или есть ли что-то лучше или популярнее.
Также, если есть что-то, что одинаково хорошо работает в Windows (обратная косая черта в качестве разделителя каталогов) — решение будет переносимым.
Вариант использования / сценарий:
В рамках импорта данных я хочу загружать файлы с удаленных URL-адресов в локальную файловую систему. URL-адреса из файла CSV. Большинство из них в порядке, но они могут содержать больше слэшей, чем ожидалось.
Например. большинство из них таковы:
https://files.example.com/pdf/12345.pdf
Но тогда отдельные файлы могут быть такими:
https://files.example.com/pdf/1/2345.pdf
Все файлы должны идти в один и тот же каталог, например,
https://files.example.com/pdf/12345.pdf
-> /destination/dir/12345.pdf
Файл как 1/2345.pdf
не должен приводить к подкаталогу. Вместо этого /
следует избегать каким-либо (обратимым) образом. Например. с помощью urlencode () это будет 1%2F2345.pdf
,
Вы можете создать набор замен. Например, вы можете сделать так, чтобы / char, который появляется в имени файла, был представлен чем-то вроде «(косая черта)». Просто используйте str_replace для переключения между поиском имени файла и кодированием имени файла в URL. Это только один пример.
Это должно помочь вам.
вход: https://files.example.com/pdf/1/2345.pdf
Выход: pdf_1_2345.pdf
$url = 'https://files.example.com/pdf/1/2345.pdf';
$parse = parse_url($url);
//get path, remove first slash
//$path: pdf/1/2345.pdf
$path = substr($parse['path'],1);
//result becomes: pdf_1_2345.pdf
$result = str_replace('/','_',$path);
РЕДАКТИРОВАТЬ: Лучше всего хранить в базе данных удаленный URL-адрес файла, хэшируя его значение (используя md5 или аналогичное) и сохраняя файл под этим именем локально, сохраняя это хеш-значение в базе данных.
Это ваша лучшая ставка, так что вы всегда можете узнать, какой удаленный файл соответствует вашему локальному файлу, и наоборот, и вам не придется иметь дело с именами файлов локально, так как они могут быть любыми (пока вы сохраняете файл). их в проверке на уникальность)
Database Table:
--------------------
| id | remote_url | local_name |
-----------------------------------------------------
| 1 | http://example/.../123.pdf | sdflkfd..dl.pdf|
Вы поняли идею.
Вы можете использовать эту функцию, она заменяет все разделители каталогов подчеркиванием.
function secureFilePath($str)
{
$str = str_replace('/', '_', $str);
$str = str_replace('\\', '_', $str);
$str = str_replace(DIRECTORY_SEPARATOR, '_', $str); // In case it does not equal the standard values
return $str;
}