escaping — PHP: рекомендуемый способ избежать косой черты в пути (например, для предотвращения атаки через каталог)

Я ищу функцию 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,

0

Решение

Вы можете создать набор замен. Например, вы можете сделать так, чтобы / char, который появляется в имени файла, был представлен чем-то вроде «(косая черта)». Просто используйте str_replace для переключения между поиском имени файла и кодированием имени файла в URL. Это только один пример.

2

Другие решения

Это должно помочь вам.

вход: 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|

Вы поняли идею.

2

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

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;
}
0
По вопросам рекламы [email protected]