Chvalov: Тут тоже можно подсказать: для того, чтобы узнать имя файла, совершенно недостаточно функции, читающей его содержимое. Сайт отдает (если отдает) его в заголовках ответа.
Хайбулла Мусаев: "утилита пакетной обработки файлов" под Linux называется find.
На кой черт у вас вообще используется РНР для столь тривиальной задачи - вот вопрос.
Joysi75: если вы действительно можете вынести этот слой полностью и уверены, что при изменении логики его не придется полностью же переписывать, вынимая из БД - может, это и неплохо.
ex3xeng: давайте пофантазируем.
Итак, вы, получая запрос, обращаетесь к базе за именем файла, потом проверяете, есть ли этот файл, потом загружаете содержимое файла в память и отдаете пользователю. Вас в этом процессе почему-то пугает обращение к базе данных. Но если запрос простейший, то выполнен он будет чертовски быстро, а во второй раз - вообще почти моментально, потому что БД еще не успеет выкинуть эти данные из кэша. Проверка существования файла займет примерно то же время, но ее вы почему-то не боитесь. Основную массу времени, собственно, отнимут два следующих шага.
А "в данной ситуации в принципе все работает" - это первые слова в Святой Книге Говнокода.
Кстати, какого черта escape_string? Вы уже оторвались от имен файлов, почему не использовать числовые идентификаторы?
Ну, и смотрите: у вас теперь есть база данных, в которой хранятся те документы, которые смогут загружать пользователи. Можно связать с ней инструмент для загрузки таких файлов (безопасный, потому что файлы не будут доступны по имени!), инструмент вставки в материал на сайте ссылки на файл, оперирующий уже не его именем, а тем описанием, которое ему дали при загрузке... Начинаете чувствовать, что у вас энтерпрайз, а не наколенная поделка? Еще нет? Тогда продолжим!..
ex3xeng: так это и есть очень серьезная ошибка начинающего программиста: решая частую проблему, приспосабливать решение к данной ситуации.
Есть выстраданный принцип безопасности: если GET-параметр никак не связан с именем ресурса на диске, он точно не создаст уязвимости. Ни в данной ситуации, ни в какой-либо иной. Если вы можете так сделать - будет хорошо. У вас есть достаточно весомые причины не делать хорошо, а ограничиться частным решением? Если да, то такое поведение простительно. Если нет - не идите на поводу у лени. Для будущего.
ex3xeng: просто интересно, зачем солдат учат ходить в ногу, если в бою они так совершенно не ходят?
Отвечаем: смотрит программист на код, в котором пришедшие снаружи данные подставляются в путь к файлу - и либо у него сжимается сфинктер от ярости, либо он не программист.
Потому что каждый раз, возвращаясь через три года использования по-всякому к этому коду, нормальный программист будет крыть чем попало того, кто так написал, а не сделал, как принято у нормальных людей и не использовал потом этот же самый кусок кода каждый раз, когда перед ним снова встанет та же задача.
maxwolf: А я еще раз повторю: даже все предложение - это еще не контекст.
Попробуйте перевести полное русское предложение "Они говорят, что ничего". Контекста-то нет.
Необязательно в БД, но прослойка, нарушающая соответствие между запросом и именем файла, необходима. У меня по сайту шерстят китайские боты, которые КАЖДЫЙ параметр в обнаруженных ссылках с GET-полями проверяют на ../../../../.../etc/passwd, например.
Семен: Это еще не контекст. В зависимости от того, что имелось в виду, может быть от "как настроить загрузку" до "как запустить своими руками" или даже "как протолкнуть на совещании именно это решение".
Сильно подозреваю, что сейчас любой грамотный тимлид, только услышав об экономии байтов в джаваскрипте, сразу укажет кодеру на дверь без всяких уточнений.
Вы уверены, что вам действительно нужно куда-то глубоко копать?
Вы убедились для начала, что проблема не с кириллицей в пути или заглавными-прописными буквами, которые в винде одинаковы, а в других системах могут различаться?