Я знаю, что мы должны заменить косые черты и, например, взорвать путь и использовать последний элемент массива в качестве имени файла.
Но почему прямая косая черта преобразуется в дефис / тире при использовании
header('Content-Disposition: attachment; filename="'.$local_file.'"');
когда $local_file
это что-то вроде /file
скачанный файл имеет имя файла -file
Это поведение описано где-то?
В документе RFC не упоминается об этом или нет?
http://www.faqs.org/rfcs/rfc2183.html
Это зависит от клиента. Большинство браузеров просто отбрасывают любой путь/
префиксы. Но перекодировка косых черт будет такой же надежной.
Это упоминается в RFC2616, http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html, раздел 19.5.1
Принимающий пользовательский агент НЕ ДОЛЖЕН учитывать информацию о пути к каталогу, присутствующую в параметре filename-parm, который является единственным параметром, который, как считается, применяется в настоящее время к реализациям HTTP. Имя файла ДОЛЖНО рассматриваться только как компонент терминала.
Сетевая рабочая группа, Р. Филдинг и др., (C) Интернет-общество (1999)
Разумеется, по соображениям безопасности полезная нагрузка HTTP не должна извлекаться в какой-либо заранее заданный путь.
Других решений пока нет …