загрузить файл с помощью команды php copy - PullRequest
1 голос
/ 27 октября 2010

У меня есть один общедоступный веб-сайт, где пользователи имеют возможность загружать PDF-файл и читать этот PDF-файл, когда им это необходимо.

Я использую команду php

$error = copy($tmp_name, $fpath);

для сохранения файла на сервере...

проблема, с которой я сталкиваюсь:

  1. любой может загрузить файл любого типа (.exe, bat), но мне нужен только pdf?

  2. при попытке просмотреть pdf-файл, если кто-то изменит его расширение (.exe, .bat) на .pdf, как снизить риск выполнения этого скрипта на сервере?

Я очень стараюсь решить эту проблему за последние несколько дней, но безуспешно ...

Спасибо

Ответы [ 5 ]

2 голосов
/ 27 октября 2010

Не используйте copy(), используйте move_uploaded_file() для получения загруженных файлов.Использование copy() сопряжено с некоторыми серьезными уязвимостями безопасности.

как снизить риск выполнения этого скрипта на сервере?

Это просто: просто не помещайте егов любом месте, где это может быть выполнено :) Серьезно, вы можете хранить самые злые вирусы на вашем сервере - если они находятся в каталоге, в котором они не могут быть запущены, у вас нет проблем.

Настоящая проблема в том, что происходит, когда люди скачивают файл.Вы можете использовать fileinfo, как указано в других ответах, чтобы узнать, является ли это PDF.Для чего-то еще, например, для проверки на наличие злонамеренных взломов в файле PDF, среди которых есть некоторые, - вам необходимо установить антивирусный сканер на стороне сервера.

Кроме этого, пользователь должен будет запустить антивирусный сканер.Здесь нет 100% безопасности.Полная безопасность может быть обеспечена открытием и повторным сохранением каждого документа PDF с использованием собственной библиотеки PDF, но я не знаю, есть ли какие-либо библиотеки PHP, которые могут это сделать.

0 голосов
/ 27 октября 2010

Существует очень хорошая рецензия на предмет загрузки файлов bobince в другой вопрос . Его ответ принес некоторые проблемы на стол, о которых я даже не думал раньше. Это действительно стоит прочитать.

И, как уже сказал Пекка, не просто используйте copy(), используйте функцию move_uploaded_file(), которая существует для перемещения выгруженных файлов из каталога tmp.

0 голосов
/ 27 октября 2010

Вы можете проверить PDF с помощью такого инструмента, как tool.pdf.Validate , но во многих различных версиях PDF вы рискуете получить ложные негативы, особенно с более новыми пакетами программного обеспечения.

0 голосов
/ 27 октября 2010

1) Чтобы решить эту проблему, вам понадобится логика на вашем конце для проверки файла, например, с помощью модуля Fileinfo , чтобы определить тип файла MIME.Также всегда сохраняйте файлы с расширением .pdf и блокируйте все с неправильным расширением (чтобы защитить пользователей от загрузки всего исполняемого файла).Это не будет на 100% безопасно, хотя.Если вы хотите полностью защитить себя от вирусов, вам понадобится антивирусная программа, установленная на сервере, и проверьте все загруженные файлы.

2) Это проще.Просто отключите выполнение всех скриптов для вашей папки загрузки в настройках вашего веб-сервера.Это будет отличаться в зависимости от веб-сервера.


О, и если ваш веб-сервер разрешает файлы конфигурации в каталогах, таких как Apache .htaccess, убедитесь, что имя файла НЕ .htaccess или любое другое волшебное имя..

0 голосов
/ 27 октября 2010

используйте fileinfo , чтобы получить mimetype (+ все, что вам нужно), чтобы проверить, является ли это pdf.

РЕДАКТИРОВАТЬ: более простой альтернативой будет использование mine_content_type () , но это устарело с php5.

PS: pime-mimetype должен быть application/pdf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...