Сборка PHP uploader для gif / jpg / png / pdf / doc, wmv файлов, выполнимая, или я должен что-то купить? - PullRequest
3 голосов
/ 16 марта 2009

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

Собирать что-то самому будет большой проблемой? Сделали бы вы это или нашли бы какой-нибудь продукт для ОС или OTS? (А знаете ли вы что-нибудь, что вы можете порекомендовать)?

Ответы [ 8 ]

22 голосов
/ 16 марта 2009

Концептуально, то, о чем вы говорите, довольно просто. Принимать и обрабатывать загрузки довольно просто, я думаю, вам не стоит беспокоиться о покупке готового решения.

Обычно такие вещи, как изображения и видео, на самом деле не могут содержать "вирусы" (если только приложение для просмотра не очень плохое и не позволяет им каким-либо образом запускать код - также известный как "Internet Explorer"), но на самом деле не сложно проверить его на вирусы их в любом случае, если вы хотите. Просто найдите сканер командной строки, который может работать на сервере (что-то вроде Clam AV ), и всякий раз, когда файл загружается, запускайте его через сканер и отклоняйте загрузку (и регистрируйте событие), если он Сбой сканирования.

5 голосов
/ 16 марта 2009

Если вы загружаете очень большие файлы, вы можете также рассмотреть вопрос о загрузке Flash / строке состояния, чтобы пользователи могли видеть, сколько файлов загружено. SWFUpload - хороший выбор для этого.

Вы можете сканировать файлы с помощью ClamAV, выполнив что-то подобное в PHP:


$out = '';
$int = -1;
exec('/usr/local/bin/clamscan --stdout /path/to/file.ext', $out, $int);

if ($int == 0)
{
  print('No virus!');
}

/*
Return codes from clamscan:
 0 : No virus found.

       1 : Virus(es) found.

       40: Unknown option passed.

       50: Database initialization error.

       52: Not supported file type.

       53: Can't open directory.

       54: Can't open file. (ofm)

       55: Error reading file. (ofm)

       56: Can't stat input file / directory.

       57: Can't get absolute path name of current working directory.

       58: I/O error, please check your file system.

       59: Can't get information about current user from /etc/passwd.

       60: Can't get information about user '' from /etc/passwd.

       61: Can't fork.

       62: Can't initialize logger.

       63: Can't create temporary files/directories (check permissions).

       64: Can't write to temporary directory (please specify another one).

       70: Can't allocate memory (calloc).

       71: Can't allocate memory (malloc).

*/

4 голосов
/ 17 марта 2009

Краткий ответ: ничего не покупайте. Опыт и чувство выполненного долга, которые вы получите от написания этого кода, гораздо ценнее.

Длинный ответ: доверять любой форме пользовательского ввода, как правило, плохая идея. Однако, разумно относиться к тому, что вы делаете с пользовательскими данными, всегда лучший путь. Если вы не будете делать глупостей *, у вас все будет хорошо, и вы получите огромный опыт от этого опыта.



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

1 голос
/ 12 мая 2009

"Собирать что-то самому будет большой проблемой?" Да, это. Не так много, как передать его сторонним решениям, но то, что вы хотите здесь написать, возможно, самая опасная вещь, которую вы можете получить для написания кода на веб-скрипте php: позволить пользователям загружать файлы на ваш сервер. Вы должны быть предельно осторожны, чтобы фильтровать файлы, которые вы собираетесь принимать, чтобы пользователи не могли загружать php-скрипты на ваш сервер. Распространенные ошибки, которые люди делают при фильтрации:

  1. Не фильтровать вообще.
  2. Фильтр на основе неправильных регулярных выражений, легко обходимых.
  3. Неиспользование функций is_uploaded_file и move_uploaded_file может привести к уязвимостям LFI.
  4. Если не использовать массив $ _FILES (вместо этого использовать глобальные переменные), можно получить доступ к RFI vulns.
  5. Фильтр на основе типа из массива $ _FILES, поддельный, как он поступает из браузера.
  6. Фильтр, основанный на проверенном MIME-типе на стороне сервера, дурачит путем имитации содержимого магических файлов (т. Е. Файл с этим содержимым GIF8 идентифицируется как файл изображения / gif, но отлично выполняется как скрипт php)
  7. Использовать внесение в черный список опасных файлов или расширений, а не внесение в белый список тех, которые явно разрешены.
  8. Неправильные настройки apache, которые позволяют загружать файлы .htaccess, которые переопределяют исполняемые расширения php (т. Е. Txt) ..

Я мог бы продолжить, но я думаю, что вы уже испугались, прежде чем спросить:)

Что касается вирусов, да, просто запустите AV.

1 голос
/ 17 марта 2009

Я сейчас создаю нечто вроде того же, используя FancyUpload от digitarald для Mootools 1.2.1

проверьте этот пример: http://localhost/fancyupload/showcase/photoqueue/, чтобы увидеть, насколько это круто.

Просто убедитесь, что вы прочитали о том, как передать сеанс во Flash (используя параметры GET / POST !! Ваши куки сеанса не будут работать.) И выполните некоторые проверки типа файла.

Лично я не позволю своим пользователям загружать видео. Просто используйте YouTube и вставьте этот материал.

Ах да, и если вы хотите, чтобы загруженные миниатюры загружались, перейдите на ImageMagick, установленный на вашем сервере, вместе с Ghostscript. Затем Imagemagick может даже создавать миниатюры из PDF!

0 голосов
/ 29 апреля 2009

Кит Палмер предлагает небольшой сценарий.

Используйте clamdscan вместо clamscan. clamdscan связывается с установочным clamd (clamav daemon), в то время как clamscan является автономным приложением, поэтому вирусные сигнатуры загружаются КАЖДЫЙ раз, когда вы его называете, это может создать довольно большую нагрузку на ваш сервер.

Кроме того, вы также можете попробовать clamuko (это дает вам сканирование при доступе), так что вы можете просто поместить файлы в каталог, наблюдаемый clamuko.

Существует также ClamFS на основе FUSE, которая, вероятно, может быть лучшим решением, если вы не можете вставить модули в ядро.

0 голосов
/ 17 марта 2009

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

Примеры: Gmail, я думаю, использует Norton, а Yahoo! Mail, я думаю, использует McAfee.

0 голосов
/ 16 марта 2009

Вот код для обработки загруженных файлов, просто чтобы вы поняли:

foreach ($_FILES as $file) {
  if (!$file['error']) {
    move_uploaded_file ($file['tmp_name'], 'uploads/'. $file['name']);
  } elseif (4 != $file['error']) {
    $error_is = $file['error'];
    // do something with the error :-)
  }
}

header ('Location: ...'); // go to the updated page, like, with the new files
die;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...